name: Release Build on: push: branches: - "**" - "!dependabot/**" - "!xgopilot/**" tags: ["*"] pull_request: branches: ["**"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: setup: runs-on: ubuntu-latest outputs: linux-cache-key: ${{ steps.cache-keys.outputs.linux-key }} steps: - name: Check out code uses: actions/checkout@v6 - name: Calculate cache keys id: cache-keys run: | LINUX_KEY="linux-sysroot-${{ hashFiles('.github/workflows/populate_linux_sysroot.sh', '.github/workflows/release-build.yml') }}-v1.0.0" echo "linux-key=$LINUX_KEY" >> $GITHUB_OUTPUT populate-linux-sysroot: runs-on: ubuntu-latest needs: setup timeout-minutes: 30 steps: - name: Check out code uses: actions/checkout@v6 - name: Check Linux sysroot cache id: cache-linux-sysroot uses: actions/cache/restore@v4 with: path: .sysroot/linux.tar.gz key: ${{ needs.setup.outputs.linux-cache-key }} lookup-only: true - name: Set up QEMU uses: docker/setup-qemu-action@v3 if: steps.cache-linux-sysroot.outputs.cache-hit != 'true' with: image: tonistiigi/binfmt:qemu-v7.0.0-28 - name: Populate Linux sysroot if: steps.cache-linux-sysroot.outputs.cache-hit != 'true' run: bash .github/workflows/populate_linux_sysroot.sh - name: Create Linux sysroot tarball if: steps.cache-linux-sysroot.outputs.cache-hit != 'true' run: tar -czvf .sysroot/linux.tar.gz -C .sysroot linux - name: Save Linux sysroot cache if: steps.cache-linux-sysroot.outputs.cache-hit != 'true' uses: actions/cache/save@v4 with: path: .sysroot/linux.tar.gz key: ${{ needs.setup.outputs.linux-cache-key }} build: runs-on: ubuntu-latest needs: [setup, populate-linux-sysroot] steps: - name: Check out code uses: actions/checkout@v6 - name: Set up Release uses: ./.github/actions/setup-goreleaser with: linux-cache-key: ${{ needs.setup.outputs.linux-cache-key }} - name: Run GoReleaser (Build & Test) env: GITHUB_TOKEN: ${{github.token}} run: | docker run \ --rm \ -e GITHUB_TOKEN=${GITHUB_TOKEN} \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(pwd):/go/src/llgo \ -w /go/src/llgo \ ghcr.io/goreleaser/goreleaser-cross:v1.22 \ release --verbose --skip=publish,nfpm,snapcraft --snapshot --clean - name: Upload Darwin AMD64 Artifacts uses: actions/upload-artifact@v5 with: name: llgo-darwin-amd64 path: .dist/*darwin-amd64.tar.gz retention-days: 3 include-hidden-files: true - name: Upload Darwin ARM64 Artifacts uses: actions/upload-artifact@v5 with: name: llgo-darwin-arm64 path: .dist/*darwin-arm64.tar.gz retention-days: 3 include-hidden-files: true - name: Upload Linux AMD64 Artifacts uses: actions/upload-artifact@v5 with: name: llgo-linux-amd64 path: .dist/*linux-amd64.tar.gz retention-days: 3 include-hidden-files: true - name: Upload Linux ARM64 Artifacts uses: actions/upload-artifact@v5 with: name: llgo-linux-arm64 path: .dist/*linux-arm64.tar.gz retention-days: 3 include-hidden-files: true - name: Upload Checksums uses: actions/upload-artifact@v5 with: name: llgo-checksums path: .dist/*checksums.txt retention-days: 3 include-hidden-files: true test-artifacts: needs: build strategy: matrix: include: - os: macos-15-intel goos: darwin goarch: amd64 go-version: "1.24.2" go-mod-version: "1.24" - os: macos-latest goos: darwin goarch: arm64 go-version: "1.24.2" go-mod-version: "1.24" - os: ubuntu-latest goos: linux goarch: amd64 go-version: "1.24.2" go-mod-version: "1.24" - os: ubuntu-24.04-arm goos: linux goarch: arm64 go-version: "1.24.2" go-mod-version: "1.24" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 - name: Install dependencies uses: ./.github/actions/setup-deps with: install-llvm: false - name: Set up Go uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} - name: Download Platform Artifact uses: actions/download-artifact@v6 with: name: llgo-${{ matrix.goos }}-${{ matrix.goarch }} path: . - name: Extract LLGO Archive run: | echo "Looking for ${{ matrix.goos }}_${{ matrix.goarch }} archive..." ARCHIVE=$(ls *.tar.gz | head -n1) mkdir -p release-llgo tar -xzf "$ARCHIVE" -C release-llgo ls -la release-llgo/ echo "${{ github.workspace }}/release-llgo/bin/" >> $GITHUB_PATH - name: Test Hello World uses: ./.github/actions/test-helloworld with: go-version: ${{matrix.go-version}} mod-version: ${{ matrix.go-mod-version }} release: needs: [setup, test-artifacts, populate-linux-sysroot] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') steps: - name: Check out code uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Release uses: ./.github/actions/setup-goreleaser with: linux-cache-key: ${{ needs.setup.outputs.linux-cache-key }} - name: Run GoReleaser (Release) env: GITHUB_TOKEN: ${{github.token}} run: | echo "Publishing release for tag: ${{ github.ref }}" echo "All artifact tests passed, proceeding with release..." docker run \ --rm \ -e GITHUB_TOKEN=${GITHUB_TOKEN} \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(pwd):/go/src/llgo \ -w /go/src/llgo \ ghcr.io/goreleaser/goreleaser-cross:v1.22 \ release --clean --verbose --skip nfpm,snapcraft