chore(build): update to Go 1.25 #605
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| branches: | |
| - "main" | |
| - "develop" | |
| tags: | |
| - 'v*' | |
| paths-ignore: | |
| - '.github/ISSUE_TEMPLATE/**' | |
| - '.github/images/**' | |
| - 'config.toml' | |
| - 'docker-compose.yml' | |
| - 'Makefile' | |
| - '**.md' | |
| pull_request: | |
| paths-ignore: | |
| - '.github/ISSUE_TEMPLATE/**' | |
| - '.github/images/**' | |
| - 'config.toml' | |
| - 'docker-compose.yml' | |
| - 'Makefile' | |
| - '**.md' | |
| env: | |
| REGISTRY: ghcr.io | |
| REGISTRY_IMAGE: ghcr.io/${{ github.repository }} | |
| permissions: | |
| contents: write | |
| packages: write | |
| jobs: | |
| test: | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| os: [ ubuntu-latest ] | |
| name: Test ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version-file: go.mod | |
| cache: true | |
| - name: Run Tests with Race Detection | |
| run: make test-race | |
| - name: Generate Test Summary | |
| run: go run gotest.tools/gotestsum@latest --junitfile unit-tests.xml --format pkgname | |
| - name: Test Summary | |
| uses: test-summary/action@v2 | |
| with: | |
| paths: "unit-tests.xml" | |
| if: always() | |
| testother: | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| os: [ macos-latest, windows-latest ] | |
| name: Test ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| env: | |
| GOPATH: ${{ startsWith(matrix.os, 'windows') && 'D:\golang\go' || '' }} | |
| GOCACHE: ${{ startsWith(matrix.os, 'windows') && 'D:\golang\cache' || '' }} | |
| GOMODCACHE: ${{ startsWith(matrix.os, 'windows') && 'D:\golang\modcache' || '' }} | |
| USERPROFILE: ${{ startsWith(matrix.os, 'windows') && 'D:\homedir' || '' }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version-file: go.mod | |
| cache: true | |
| - name: Run Tests (MacOS) | |
| if: matrix.os == 'macos-latest' | |
| env: | |
| CGO_ENABLED: 0 | |
| run: go test ./... | |
| - name: Run Tests (Windows) | |
| if: matrix.os == 'windows-latest' | |
| env: | |
| CGO_ENABLED: 0 | |
| run: go test -short ./... | |
| - name: Generate Test Summary | |
| if: matrix.os != 'windows-latest' | |
| run: go run gotest.tools/gotestsum@latest --junitfile unit-tests.xml --format pkgname | |
| - name: Test Summary | |
| uses: test-summary/action@v2 | |
| with: | |
| paths: "unit-tests.xml" | |
| if: always() && matrix.os != 'windows-latest' | |
| pgo: | |
| name: Generate PGO Profile | |
| runs-on: ubuntu-latest | |
| needs: [ test, testother ] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version-file: go.mod | |
| cache: true | |
| # Create test data for profiling | |
| - name: Create test data | |
| shell: bash | |
| run: | | |
| mkdir -p test_data | |
| dd if=/dev/urandom of=test_data/test1.bin bs=1M count=100 | |
| dd if=/dev/urandom of=test_data/test2.bin bs=1M count=100 | |
| for i in {1..20000}; do dd if=/dev/urandom bs=1023 count=1 of=test_data/file$i.bin >/dev/null 2>&1; done | |
| - name: Generate Profile | |
| env: | |
| CGO_ENABLED: 0 | |
| run: | | |
| # Build initial binary | |
| go build -o mkbrr | |
| # Run different workload scenarios | |
| ./mkbrr create test_data/test1.bin --cpuprofile=cpu1.pprof | |
| ./mkbrr create test_data/test2.bin --cpuprofile=cpu2.pprof | |
| ./mkbrr create test_data --cpuprofile=cpu3.pprof | |
| # Verify profiles exist | |
| if [ ! -f cpu1.pprof ] || [ ! -f cpu2.pprof ] || [ ! -f cpu3.pprof ]; then | |
| echo "Error: One or more profile files not generated" | |
| ls -la *.pprof | |
| exit 1 | |
| fi | |
| # Merge profiles | |
| go tool pprof -proto cpu1.pprof cpu2.pprof cpu3.pprof > cpu.pprof | |
| # Verify final profile | |
| if [ ! -s cpu.pprof ]; then | |
| echo "Error: Final profile not generated or empty" | |
| exit 1 | |
| fi | |
| - name: Upload pprof | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: pprof | |
| path: cpu.pprof | |
| goreleaserbuild: | |
| name: Build distribution binaries | |
| runs-on: ubuntu-latest | |
| needs: [ pgo ] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version-file: go.mod | |
| cache: true | |
| - name: Download pprof | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: pprof | |
| path: . | |
| - name: Run GoReleaser build | |
| if: github.event_name == 'pull_request' | |
| uses: goreleaser/goreleaser-action@v6 | |
| with: | |
| distribution: goreleaser | |
| version: "~> v2" | |
| args: release --clean --skip=validate,publish --parallelism 5 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| BUILDER: ${{ github.actor }}@github-actions | |
| - name: Run GoReleaser build and publish tags | |
| if: startsWith(github.ref, 'refs/tags/') | |
| uses: goreleaser/goreleaser-action@v6 | |
| with: | |
| distribution: goreleaser | |
| version: "~> v2" | |
| args: release --clean | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| BUILDER: ${{ github.actor }}@github-actions | |
| - name: Upload assets | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: mkbrr | |
| path: | | |
| dist/*.tar.gz | |
| dist/*.zip | |
| dist/*.deb | |
| dist/*.rpm | |
| docker: | |
| name: Build Docker images | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| platform: | |
| - linux/386 | |
| - linux/amd64 | |
| - linux/amd64/v2 | |
| - linux/amd64/v3 | |
| - linux/arm/v6 | |
| - linux/arm/v7 | |
| - linux/arm64 | |
| # - linux/mips64le | |
| # - linux/mips64 | |
| - linux/ppc64le | |
| # - linux/riscv64 | |
| - linux/s390x | |
| needs: [ pgo, test ] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Download pprof profile | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: pprof | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.repository_owner }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.REGISTRY_IMAGE }} | |
| tags: | | |
| type=semver,pattern={{version}},prefix=v | |
| type=semver,pattern={{major}}.{{minor}},prefix=v | |
| type=ref,event=branch | |
| type=ref,event=pr | |
| flavor: | | |
| latest=auto | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Supported Architectures | |
| run: docker buildx ls | |
| - name: Build and publish image | |
| id: docker_build | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: './ci.Dockerfile' | |
| platforms: ${{ matrix.platform }} | |
| outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request') && 'true' || 'false' }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-args: | | |
| BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} | |
| VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }} | |
| REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max | |
| provenance: false | |
| - name: Export image digest | |
| id: digest-prep | |
| run: | | |
| mkdir -p /tmp/digests | |
| digest="${{ steps.docker_build.outputs.digest }}" | |
| echo "manifest-hash=${digest#sha256:}" >> "$GITHUB_OUTPUT" | |
| touch "/tmp/digests/${digest#sha256:}" | |
| - name: Upload image digest | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: docker-digests-${{ steps.digest-prep.outputs.manifest-hash }} | |
| path: /tmp/digests/* | |
| if-no-files-found: error | |
| retention-days: 1 | |
| docker-merge: | |
| name: Publish Docker multi-arch manifest | |
| if: ${{ github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request' }} | |
| runs-on: ubuntu-latest | |
| needs: [ docker ] | |
| steps: | |
| - name: Download image digests | |
| uses: actions/download-artifact@v5 | |
| with: | |
| path: /tmp/digests | |
| pattern: docker-digests-* | |
| merge-multiple: true | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.repository_owner }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.REGISTRY_IMAGE }} | |
| tags: | | |
| type=semver,pattern={{version}},prefix=v | |
| type=semver,pattern={{major}}.{{minor}},prefix=v | |
| type=ref,event=branch | |
| type=ref,event=pr | |
| flavor: | | |
| latest=auto | |
| - name: Create manifest list and push | |
| working-directory: /tmp/digests | |
| run: | | |
| docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | |
| $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) | |
| - name: Inspect image | |
| run: | | |
| docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} |