clash/.github/workflows/build.yml

392 lines
15 KiB
YAML
Raw Normal View History

2023-02-18 17:23:06 +00:00
name: Build
2022-05-01 16:59:41 +00:00
on:
2022-11-26 12:11:43 +00:00
workflow_dispatch:
2022-05-01 16:59:41 +00:00
push:
2023-01-21 06:42:48 +00:00
paths-ignore:
2023-01-25 12:53:39 +00:00
- "docs/**"
- "README.md"
2023-04-03 12:03:18 +00:00
- ".github/ISSUE_TEMPLATE/**"
2022-05-01 16:59:41 +00:00
branches:
2022-05-01 17:14:30 +00:00
- Alpha
2023-02-18 17:23:06 +00:00
tags:
- "v*"
2023-01-15 13:51:33 +00:00
pull_request_target:
2022-05-01 16:59:41 +00:00
branches:
2022-05-01 17:14:30 +00:00
- Alpha
2023-03-05 16:49:34 +00:00
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
2023-03-05 16:49:34 +00:00
cancel-in-progress: true
2023-01-25 12:53:39 +00:00
env:
REGISTRY: docker.io
2022-05-01 16:59:41 +00:00
jobs:
2024-02-25 12:42:01 +00:00
build:
2023-01-15 07:04:27 +00:00
runs-on: ubuntu-latest
2023-01-15 13:51:33 +00:00
strategy:
matrix:
2024-02-25 12:42:01 +00:00
jobs:
- { goos: darwin, goarch: arm64, output: arm64 }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: darwin, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: linux, goarch: '386', output: '386' }
2024-02-27 07:21:30 +00:00
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible, test: test }
2024-02-25 12:42:01 +00:00
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: linux, goarch: arm64, output: arm64 }
- { goos: linux, goarch: arm, goarm: '7', output: armv7 }
- { goos: linux, goarch: mips, mips: hardfloat, output: mips-hardfloat }
- { goos: linux, goarch: mips, mips: softfloat, output: mips-softfloat }
- { goos: linux, goarch: mipsle, mips: hardfloat, output: mipsle-hardfloat }
- { goos: linux, goarch: mipsle, mips: softfloat, output: mipsle-softfloat }
- { goos: linux, goarch: mips64, output: mips64 }
- { goos: linux, goarch: mips64le, output: mips64le }
- { goos: linux, goarch: loong64, output: loong64-abi1, abi: '1' }
- { goos: linux, goarch: loong64, output: loong64-abi2, abi: '2' }
2024-02-25 12:42:01 +00:00
- { goos: linux, goarch: riscv64, output: riscv64 }
- { goos: linux, goarch: s390x, output: s390x }
- { goos: windows, goarch: '386', output: '386' }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: windows, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: windows, goarch: arm, goarm: '7', output: armv7 }
- { goos: windows, goarch: arm64, output: arm64 }
- { goos: freebsd, goarch: '386', output: '386' }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: freebsd, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: freebsd, goarch: arm64, output: arm64 }
- { goos: android, goarch: '386', ndk: i686-linux-android34, output: '386' }
- { goos: android, goarch: amd64, ndk: x86_64-linux-android34, output: amd64 }
- { goos: android, goarch: arm, ndk: armv7a-linux-androideabi34, output: armv7 }
- { goos: android, goarch: arm64, ndk: aarch64-linux-android34, output: arm64-v8 }
2024-02-27 07:21:30 +00:00
# Go 1.20 is the last release that will run on any release of Windows 7, 8, Server 2008 and Server 2012. Go 1.21 will require at least Windows 10 or Server 2016.
- { goos: windows, goarch: '386', output: '386-go120', goversion: '1.20' }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible-go120, goversion: '1.20' }
- { goos: windows, goarch: amd64, goamd64: v3, output: amd64-go120, goversion: '1.20' }
2024-02-25 12:42:01 +00:00
2024-02-27 07:21:30 +00:00
# Go 1.20 is the last release that will run on macOS 10.13 High Sierra or 10.14 Mojave. Go 1.21 will require macOS 10.15 Catalina or later.
- { goos: darwin, goarch: arm64, output: arm64-go120, goversion: '1.20' }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible-go120, goversion: '1.20' }
- { goos: darwin, goarch: amd64, goamd64: v3, output: amd64-go120, goversion: '1.20' }
2024-02-25 12:42:01 +00:00
2024-02-27 07:21:30 +00:00
# only for test
- { goos: linux, goarch: '386', output: '386-go120', goversion: '1.20' }
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible-go120, goversion: '1.20', test: test }
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64-go120, goversion: '1.20' }
2023-01-15 07:04:27 +00:00
steps:
2024-02-25 12:42:01 +00:00
- uses: actions/checkout@v4
2024-02-27 07:21:30 +00:00
- name: Set up Go
if: ${{ matrix.jobs.goversion == '' && matrix.jobs.goarch != 'loong64' }}
2024-02-25 12:42:01 +00:00
uses: actions/setup-go@v5
with:
2024-02-27 06:26:49 +00:00
go-version: '1.22'
2024-02-25 12:42:01 +00:00
2024-02-27 07:21:30 +00:00
- name: Set up Go
if: ${{ matrix.jobs.goversion != '' && matrix.jobs.goarch != 'loong64' }}
2024-02-25 12:42:01 +00:00
uses: actions/setup-go@v5
with:
2024-02-27 07:21:30 +00:00
go-version: ${{ matrix.jobs.goversion }}
2024-02-25 12:42:01 +00:00
- name: Set up Go1.21 loongarch abi1
if: ${{ matrix.jobs.goarch == 'loong64' && matrix.jobs.abi == '1' }}
run: |
wget -q https://github.com/xishang0128/loongarch64-golang/releases/download/1.21.5/go1.21.5.linux-amd64-abi1.tar.gz
2024-02-27 15:11:56 +00:00
sudo tar zxf go1.21.5.linux-amd64-abi1.tar.gz -C /usr/local
echo "/usr/local/go/bin" >> $GITHUB_PATH
- name: Set up Go1.21 loongarch abi2
if: ${{ matrix.jobs.goarch == 'loong64' && matrix.jobs.abi == '2' }}
run: |
wget -q https://github.com/xishang0128/loongarch64-golang/releases/download/1.21.5/go1.21.5.linux-amd64-abi2.tar.gz
2024-02-27 15:11:56 +00:00
sudo tar zxf go1.21.5.linux-amd64-abi2.tar.gz -C /usr/local
echo "/usr/local/go/bin" >> $GITHUB_PATH
2024-02-25 12:42:01 +00:00
- name: Set variables
if: ${{github.ref_name=='Alpha'}}
run: echo "VERSION=alpha-$(git rev-parse --short HEAD)" >> $GITHUB_ENV
shell: bash
- name: Set variables
if: ${{github.ref_name=='' || github.ref_type=='tag'}}
run: echo "VERSION=$(git describe --tags)" >> $GITHUB_ENV
shell: bash
- name: Set Time Variable
run: |
echo "BUILDTIME=$(date)" >> $GITHUB_ENV
echo "CGO_ENABLED=0" >> $GITHUB_ENV
echo "BUILDTAG=-extldflags --static" >> $GITHUB_ENV
- name: Setup NDK
if: ${{ matrix.jobs.goos == 'android' }}
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r26c
- name: Set NDK path
if: ${{ matrix.jobs.goos == 'android' }}
run: |
echo "CC=${{steps.setup-ndk.outputs.ndk-path}}/toolchains/llvm/prebuilt/linux-x86_64/bin/${{matrix.jobs.ndk}}-clang" >> $GITHUB_ENV
echo "CGO_ENABLED=1" >> $GITHUB_ENV
echo "BUILDTAG=" >> $GITHUB_ENV
2024-02-27 07:21:30 +00:00
- name: Test
if: ${{ matrix.jobs.test == 'test' }}
run: |
go test ./...
- name: Build core
2024-02-25 12:42:01 +00:00
env:
GOOS: ${{matrix.jobs.goos}}
GOARCH: ${{matrix.jobs.goarch}}
GOAMD64: ${{matrix.jobs.goamd64}}
GOARM: ${{matrix.jobs.arm}}
GOMIPS: ${{matrix.jobs.mips}}
run: |
echo $CGO_ENABLED
go build -v -tags "with_gvisor" -trimpath -ldflags "${BUILDTAG} -X 'github.com/metacubex/mihomo/constant.Version=${VERSION}' -X 'github.com/metacubex/mihomo/constant.BuildTime=${BUILDTIME}' -w -s -buildid="
if [ "${{matrix.jobs.goos}}" = "windows" ]; then
cp mihomo.exe mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}.exe
zip -r mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.zip mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}.exe
else
cp mihomo mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}
gzip -c mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}} > mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.gz
rm mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}
fi
- name: Create DEB package
if: ${{ matrix.jobs.goos == 'linux' && !contains(matrix.jobs.goarch, 'mips') }}
run: |
sudo apt-get install dpkg
2024-02-27 15:11:56 +00:00
if [ "${{matrix.jobs.abi}}" = "1" ]; then
ARCH=loongarch64
else
ARCH=${{matrix.jobs.goarch}}
fi
2024-02-25 12:42:01 +00:00
mkdir -p mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/DEBIAN
mkdir -p mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/usr/bin
mkdir -p mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/etc/mihomo
mkdir -p mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/etc/systemd/system/
mkdir -p mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/usr/share/licenses/mihomo
cp mihomo mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/usr/bin/mihomo
cp LICENSE mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/usr/share/licenses/mihomo/
cp .github/mihomo.service mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/etc/systemd/system/
cat > mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/etc/mihomo/config.yaml <<EOF
mixed-port: 7890
external-controller: 127.0.0.1:9090
EOF
cat > mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/DEBIAN/control <<EOF
Package: mihomo
Version: 1.18.2-${VERSION}
Section:
Priority: extra
Architecture: ${ARCH}
2024-02-25 12:42:01 +00:00
Maintainer: MetaCubeX <none@example.com>
Homepage: https://wiki.metacubex.one/
Description: The universal proxy platform.
EOF
dpkg-deb -Z gzip --build mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}
- name: Convert DEB to RPM
if: ${{ matrix.jobs.goos == 'linux' && !contains(matrix.jobs.goarch, 'mips') }}
run: |
sudo apt-get install -y alien
alien --to-rpm --scripts mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.deb
mv mihomo*.rpm mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.rpm
# - name: Convert DEB to PKG
# if: ${{ matrix.jobs.goos == 'linux' && !contains(matrix.jobs.goarch, 'mips') && !contains(matrix.jobs.goarch, 'loong64') }}
# run: |
# docker pull archlinux
# docker run --rm -v ./:/mnt archlinux bash -c "
# pacman -Syu pkgfile base-devel --noconfirm
# curl -L https://github.com/helixarch/debtap/raw/master/debtap > /usr/bin/debtap
# chmod 755 /usr/bin/debtap
# debtap -u
# debtap -Q /mnt/mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.deb
# "
# mv mihomo*.pkg.tar.zst mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}.pkg.tar.zst
2024-02-25 12:42:01 +00:00
- name: Save version
run: |
echo ${VERSION} > version.txt
shell: bash
- name: Archive production artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.jobs.goos }}-${{ matrix.jobs.output }}
path: |
mihomo*.gz
mihomo*.deb
mihomo*.rpm
mihomo*.zip
version.txt
2023-01-15 07:04:27 +00:00
2023-02-18 17:23:06 +00:00
Upload-Prerelease:
2023-01-15 13:51:33 +00:00
permissions: write-all
if: ${{ github.ref_type == 'branch' && !startsWith(github.event_name, 'pull_request') }}
2024-02-25 12:42:01 +00:00
needs: [build]
2023-01-15 07:04:27 +00:00
runs-on: ubuntu-latest
steps:
2024-02-25 12:42:01 +00:00
- name: Download all workflow run artifacts
uses: actions/download-artifact@v4
with:
path: bin/
merge-multiple: true
- name: Delete current release assets
uses: 8Mi-Tech/delete-release-assets-action@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tag: Prerelease-${{ github.ref_name }}
deleteOnlyFromDrafts: false
- name: Set Env
run: |
echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV
shell: bash
- name: Tag Repo
uses: richardsimko/update-tag@v1
with:
tag_name: Prerelease-${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2024-02-05 05:56:39 +00:00
2024-02-25 12:42:01 +00:00
- run: |
cat > release.txt << 'EOF'
Release created at ${{ env.BUILDTIME }}
Synchronize ${{ github.ref_name }} branch code updates, keeping only the latest version
<br>
[我应该下载哪个文件? / Which file should I download?](https://github.com/MetaCubeX/mihomo/wiki/FAQ)
[二进制文件筛选 / Binary file selector](https://metacubex.github.io/Meta-Docs/startup/#_1)
[查看文档 / Docs](https://metacubex.github.io/Meta-Docs/)
EOF
- name: Upload Prerelease
uses: softprops/action-gh-release@v1
if: ${{ success() }}
with:
tag_name: Prerelease-${{ github.ref_name }}
files: |
bin/*
prerelease: true
generate_release_notes: true
body_path: release.txt
2023-02-18 17:23:06 +00:00
Upload-Release:
permissions: write-all
if: ${{ github.ref_type=='tag' }}
2024-02-25 12:42:01 +00:00
needs: [build]
2023-02-18 17:23:06 +00:00
runs-on: ubuntu-latest
steps:
2024-02-25 12:42:01 +00:00
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get tags
run: |
echo "CURRENTVERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
git fetch --tags
echo "PREVERSION=$(git describe --tags --abbrev=0 HEAD^)" >> $GITHUB_ENV
- name: Generate release notes
run: |
cp ./.github/genReleaseNote.sh ./
bash ./genReleaseNote.sh -v ${PREVERSION}...${CURRENTVERSION}
rm ./genReleaseNote.sh
2024-02-25 12:42:01 +00:00
- uses: actions/download-artifact@v4
with:
path: bin/
merge-multiple: true
2023-02-18 17:23:06 +00:00
2024-02-25 12:42:01 +00:00
- name: Display structure of downloaded files
run: ls -R
working-directory: bin
2023-02-18 17:23:06 +00:00
2024-02-25 12:42:01 +00:00
- name: Upload Release
uses: softprops/action-gh-release@v1
if: ${{ success() }}
with:
tag_name: ${{ github.ref_name }}
files: bin/*
generate_release_notes: true
body_path: release.md
2023-02-18 17:23:06 +00:00
2023-01-25 12:53:39 +00:00
Docker:
if: ${{ !startsWith(github.event_name, 'pull_request') }}
2023-01-25 12:53:39 +00:00
permissions: write-all
2024-02-25 12:42:01 +00:00
needs: [build]
2023-01-25 12:53:39 +00:00
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-02-05 05:56:39 +00:00
uses: actions/checkout@v4
2023-01-25 12:53:39 +00:00
with:
fetch-depth: 0
2024-02-05 05:56:39 +00:00
- uses: actions/download-artifact@v4
2023-01-25 12:53:39 +00:00
with:
path: bin/
2024-02-05 05:56:39 +00:00
merge-multiple: true
2023-01-25 12:53:39 +00:00
- name: Display structure of downloaded files
run: ls -R
working-directory: bin
- name: Set up QEMU
2024-02-15 13:48:48 +00:00
uses: docker/setup-qemu-action@v3
2023-01-25 12:53:39 +00:00
- name: Setup Docker buildx
2024-02-15 13:48:48 +00:00
uses: docker/setup-buildx-action@v3
2023-01-25 12:53:39 +00:00
with:
version: latest
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
2024-02-15 13:48:48 +00:00
uses: docker/metadata-action@v5
2023-01-25 12:53:39 +00:00
with:
2023-11-09 15:20:57 +00:00
images: ${{ env.REGISTRY }}/${{ github.repository }}
2023-01-25 12:53:39 +00:00
- name: Show files
run: |
ls .
ls bin/
2023-11-09 15:20:57 +00:00
- name: login to docker REGISTRY
2023-11-09 15:20:57 +00:00
uses: docker/login-action@v3
2023-01-25 12:53:39 +00:00
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
2023-01-25 12:53:39 +00:00
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
2023-11-09 15:20:57 +00:00
uses: docker/build-push-action@v5
2023-01-25 12:53:39 +00:00
with:
context: .
file: ./Dockerfile
push: ${{ github.event_name != 'pull_request' }}
platforms: |
linux/386
linux/amd64
2023-11-09 15:20:57 +00:00
linux/arm64
2023-03-01 05:41:25 +00:00
linux/arm/v7
2023-01-25 12:53:39 +00:00
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}