name: release on: push: # run only against tags tags: - '*' permissions: contents: write env: GO_VERSION: '1.26.4' jobs: build-hosted: name: build ${{ matrix.target }} runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: include: - target: linux-amd64 runner: ubuntu-latest goos: linux goarch: amd64 asset_arch: amd64 archive_format: tar.gz - target: linux-arm64 runner: ubuntu-24.04-arm goos: linux goarch: arm64 asset_arch: aarch64 archive_format: tar.gz - target: darwin-amd64 runner: macos-15-intel goos: darwin goarch: amd64 asset_arch: amd64 archive_format: tar.gz - target: darwin-arm64 runner: macos-15 goos: darwin goarch: arm64 asset_arch: aarch64 archive_format: tar.gz - target: windows-amd64 runner: windows-latest goos: windows goarch: amd64 asset_arch: amd64 archive_format: zip - target: windows-arm64 runner: windows-11-arm goos: windows goarch: arm64 asset_arch: aarch64 archive_format: zip steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Refresh models catalog shell: bash run: | set -euo pipefail git fetch --depth 1 https://github.com/router-for-me/models.git main git show FETCH_HEAD:models.json > internal/registry/models/models.json - name: Fetch tags shell: bash run: git fetch --force --tags - uses: actions/setup-go@v6 with: go-version: ${{ env.GO_VERSION }} cache: true - uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: go-${{ runner.os }}-${{ runner.arch }}-${{ matrix.target }}-${{ hashFiles('go.sum') }} restore-keys: | go-${{ runner.os }}-${{ runner.arch }}-${{ matrix.target }}- go-${{ runner.os }}-${{ runner.arch }}- - name: Generate Build Metadata shell: bash run: | set -euo pipefail echo "RELEASE_VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_ENV" echo "COMMIT=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV" echo "BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_ENV" - name: Build archive shell: bash env: TARGET: ${{ matrix.target }} GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} ASSET_ARCH: ${{ matrix.asset_arch }} ARCHIVE_FORMAT: ${{ matrix.archive_format }} run: | set -euo pipefail binary_name="cli-proxy-api" if [[ "$GOOS" == "windows" ]]; then binary_name="cli-proxy-api.exe" fi archive_dir="dist/${TARGET}/archive" archive_name="CLIProxyAPI_${RELEASE_VERSION}_${GOOS}_${ASSET_ARCH}.${ARCHIVE_FORMAT}" rm -rf "dist/${TARGET}" mkdir -p "$archive_dir" CGO_ENABLED=1 GOOS="$GOOS" GOARCH="$GOARCH" go build \ -ldflags="-s -w -X main.Version=${RELEASE_VERSION} -X main.Commit=${COMMIT} -X main.BuildDate=${BUILD_DATE}" \ -o "$archive_dir/$binary_name" ./cmd/server/ cp LICENSE README.md README_CN.md config.example.yaml "$archive_dir/" if [[ "$ARCHIVE_FORMAT" == "zip" ]]; then powershell -NoProfile -Command "Compress-Archive -Path '${archive_dir}/*' -DestinationPath 'dist/${archive_name}' -Force" else tar -C "$archive_dir" -czf "dist/$archive_name" "$binary_name" LICENSE README.md README_CN.md config.example.yaml fi - uses: actions/upload-artifact@v4 with: name: ${{ matrix.target }} path: dist/CLIProxyAPI_* if-no-files-found: error build-freebsd: name: build freebsd-${{ matrix.goarch }} runs-on: ubuntu-latest env: TARGET: freebsd-${{ matrix.goarch }} GOARCH: ${{ matrix.goarch }} ASSET_ARCH: ${{ matrix.asset_arch }} strategy: fail-fast: false matrix: include: - goarch: amd64 vm_arch: x86-64 asset_arch: amd64 - goarch: arm64 vm_arch: arm64 asset_arch: aarch64 steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Refresh models catalog run: | git fetch --depth 1 https://github.com/router-for-me/models.git main git show FETCH_HEAD:models.json > internal/registry/models/models.json - name: Fetch tags run: git fetch --force --tags - uses: actions/cache@v4 with: path: | .freebsd-cache/${{ matrix.goarch }}/go .freebsd-cache/${{ matrix.goarch }}/gocache .freebsd-cache/${{ matrix.goarch }}/gomodcache key: freebsd-${{ matrix.goarch }}-go${{ env.GO_VERSION }}-${{ hashFiles('go.sum') }} restore-keys: | freebsd-${{ matrix.goarch }}-go${{ env.GO_VERSION }}- freebsd-${{ matrix.goarch }}- - name: Generate Build Metadata run: | echo "RELEASE_VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV echo COMMIT=`git rev-parse --short HEAD` >> $GITHUB_ENV echo BUILD_DATE=`date -u +%Y-%m-%dT%H:%M:%SZ` >> $GITHUB_ENV - name: Start FreeBSD ${{ matrix.goarch }} VM uses: cross-platform-actions/action@v1.2.0 with: operating_system: freebsd architecture: ${{ matrix.vm_arch }} version: '13.5' shell: sh memory: 5G cpu_count: 4 environment_variables: GO_VERSION RELEASE_VERSION COMMIT BUILD_DATE TARGET GOARCH ASSET_ARCH - name: Build FreeBSD archive shell: cpa.sh {0} run: | set -eu cache_root=".freebsd-cache/${GOARCH}" go_root="${cache_root}/go" mkdir -p "${cache_root}/gocache" "${cache_root}/gomodcache" if [ ! -x "${go_root}/bin/go" ]; then fetch -o /tmp/go.tar.gz "https://go.dev/dl/go${GO_VERSION}.freebsd-${GOARCH}.tar.gz" rm -rf "$go_root" mkdir -p "$cache_root" tar -C "$cache_root" -xzf /tmp/go.tar.gz fi export GOCACHE="$PWD/${cache_root}/gocache" export GOMODCACHE="$PWD/${cache_root}/gomodcache" export PATH="$PWD/${go_root}/bin:$PATH" go version archive_dir="dist/${TARGET}/archive" archive_name="CLIProxyAPI_${RELEASE_VERSION}_freebsd_${ASSET_ARCH}.tar.gz" rm -rf "dist/${TARGET}" mkdir -p "$archive_dir" CGO_ENABLED=1 GOOS=freebsd GOARCH="$GOARCH" go build \ -ldflags="-s -w -X main.Version=${RELEASE_VERSION} -X main.Commit=${COMMIT} -X main.BuildDate=${BUILD_DATE}" \ -o "$archive_dir/cli-proxy-api" ./cmd/server/ cp LICENSE README.md README_CN.md config.example.yaml "$archive_dir/" tar -C "$archive_dir" -czf "dist/$archive_name" cli-proxy-api LICENSE README.md README_CN.md config.example.yaml - uses: actions/upload-artifact@v4 with: name: freebsd-${{ matrix.goarch }} path: dist/CLIProxyAPI_* if-no-files-found: error publish-release: runs-on: ubuntu-latest needs: - build-hosted - build-freebsd steps: - uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Create checksums run: | set -euo pipefail cd dist sha256sum CLIProxyAPI_* | sort -k2 > checksums.txt - name: Publish release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then gh release upload "$GITHUB_REF_NAME" dist/* --clobber else gh release create "$GITHUB_REF_NAME" dist/* --title "$GITHUB_REF_NAME" --generate-notes fi