diff --git a/.github/actions/setup-goreleaser/action.yml b/.github/actions/setup-goreleaser/action.yml new file mode 100644 index 00000000..d4ef8665 --- /dev/null +++ b/.github/actions/setup-goreleaser/action.yml @@ -0,0 +1,37 @@ +name: "Setup GoReleaser" +description: "Setup GoReleaser environment" +inputs: + darwin-cache-key: + description: "Darwin sysroot cache key" + required: true + linux-cache-key: + description: "Linux sysroot cache key" + required: true +runs: + using: "composite" + steps: + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.24.x + - name: Restore Darwin sysroot cache + id: cache-darwin-sysroot + uses: actions/cache/restore@v4 + with: + path: .sysroot/darwin.tar.gz + key: ${{ inputs.darwin-cache-key }} + - name: Restore Linux sysroot cache + id: cache-linux-sysroot + uses: actions/cache/restore@v4 + with: + path: .sysroot/linux.tar.gz + key: ${{ inputs.linux-cache-key }} + - name: Populate Darwin sysroot + run: tar -xzvf .sysroot/darwin.tar.gz -C .sysroot + shell: bash + - name: Populate Linux sysroot + run: tar -xzvf .sysroot/linux.tar.gz -C .sysroot + shell: bash + - name: Check file + run: tree .sysroot + shell: bash diff --git a/.github/actions/test-helloworld/action.yml b/.github/actions/test-helloworld/action.yml index 76b92a70..9ce49ef9 100644 --- a/.github/actions/test-helloworld/action.yml +++ b/.github/actions/test-helloworld/action.yml @@ -1,11 +1,11 @@ -name: 'Test Hello World' -description: 'Test Hello World with specific Go and module versions' +name: "Test Hello World" +description: "Test Hello World with specific Go and module versions" inputs: go-version: - description: 'Go version being tested' + description: "Go version being tested" required: true mod-version: - description: 'Go module version to use' + description: "Go module version to use" required: true runs: using: "composite" @@ -24,12 +24,30 @@ runs: import ( "fmt" "github.com/goplus/lib/c" + "github.com/goplus/lib/cpp/std" ) func main() { fmt.Println("Hello, LLGo!") println("Hello, LLGo!") c.Printf(c.Str("Hello, LLGo!\n")) + c.Printf(std.Str("Hello LLGo by cpp/std.Str\n").CStr()) } EOL go mod tidy - llgo run . + EXPECTED="Hello, LLGo! + Hello, LLGo! + Hello, LLGo! + Hello LLGo by cpp/std.Str" + OUTPUT=$(llgo run . 2>&1) + if echo "$OUTPUT" | grep -qF "$EXPECTED"; then + echo "Basic test passed" + else + echo "Basic test failed" + echo "Expected to contain:" + echo "$EXPECTED" + echo "Got:" + echo "$OUTPUT" + exit 1 + fi + + #TODO(zzy): Test embed targets, need dispatch target dir diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 717fff66..49399c70 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -2,60 +2,228 @@ name: Release Build on: push: - tags: - - "*" + branches: ["**"] + 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: + darwin-cache-key: ${{ steps.cache-keys.outputs.darwin-key }} + linux-cache-key: ${{ steps.cache-keys.outputs.linux-key }} + steps: + - name: Check out code + uses: actions/checkout@v5 + - name: Calculate cache keys + id: cache-keys + run: | + DARWIN_KEY="darwin-sysroot-${{ hashFiles('.github/workflows/populate_darwin_sysroot.sh', '.github/workflows/release-build.yml') }}" + LINUX_KEY="linux-sysroot-${{ hashFiles('.github/workflows/populate_linux_sysroot.sh', '.github/workflows/release-build.yml') }}" + echo "darwin-key=$DARWIN_KEY" >> $GITHUB_OUTPUT + echo "linux-key=$LINUX_KEY" >> $GITHUB_OUTPUT + populate-darwin-sysroot: runs-on: macos-latest timeout-minutes: 30 + needs: setup steps: - name: Check out code uses: actions/checkout@v5 + - name: Check Darwin sysroot cache + id: cache-darwin-sysroot + uses: actions/cache/restore@v4 + with: + path: .sysroot/darwin.tar.gz + key: ${{ needs.setup.outputs.darwin-cache-key }} + lookup-only: true - name: Populate Darwin sysroot + if: steps.cache-darwin-sysroot.outputs.cache-hit != 'true' run: bash .github/workflows/populate_darwin_sysroot.sh - name: Create Darwin sysroot tarball + if: steps.cache-darwin-sysroot.outputs.cache-hit != 'true' run: tar -czvf .sysroot/darwin.tar.gz -C .sysroot darwin - - name: Upload Darwin sysroot tarball - uses: actions/upload-artifact@v4 + - name: Save Darwin sysroot cache + if: steps.cache-darwin-sysroot.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 with: - name: darwin-sysroot-tarball path: .sysroot/darwin.tar.gz - compression-level: 0 - build: + key: ${{ needs.setup.outputs.darwin-cache-key }} + populate-linux-sysroot: runs-on: ubuntu-latest - needs: populate-darwin-sysroot + needs: setup timeout-minutes: 30 steps: - name: Check out code uses: actions/checkout@v5 + - name: Check Linux sysroot cache + id: cache-linux-sysroot + uses: actions/cache/restore@v4 with: - fetch-depth: 0 - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version: 1.24.x + 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: Download Darwin sysroot tarball - uses: actions/download-artifact@v5 - with: - name: darwin-sysroot-tarball - path: .sysroot - - name: Populate Darwin sysroot - run: tar -xzvf .sysroot/darwin.tar.gz -C .sysroot - name: Populate Linux sysroot + if: steps.cache-linux-sysroot.outputs.cache-hit != 'true' run: bash .github/workflows/populate_linux_sysroot.sh - - name: Run GoReleaser + - 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-darwin-sysroot, populate-linux-sysroot] + steps: + - name: Check out code + uses: actions/checkout@v5 + - name: Set up Release + uses: ./.github/actions/setup-goreleaser + with: + darwin-cache-key: ${{ needs.setup.outputs.darwin-cache-key }} + 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 --skip=publish,nfpm,snapcraft --snapshot --clean + + - name: Upload Darwin AMD64 Artifacts + uses: actions/upload-artifact@v4 + 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@v4 + 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@v4 + 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@v4 + 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@v4 + with: + name: llgo-checksums + path: .dist/*checksums.txt + retention-days: 3 + include-hidden-files: true + + test-artifacts: + needs: build + strategy: + matrix: + include: + - os: macos-13 + 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@v5 + - name: Install dependencies + uses: ./.github/actions/setup-deps + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + - name: Download Platform Artifact + uses: actions/download-artifact@v5 + 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, build, test-artifacts] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Check out code + uses: actions/checkout@v5 + with: + fetch-depth: 0 + - name: Set up Release + uses: ./.github/actions/setup-goreleaser + with: + darwin-cache-key: ${{ needs.setup.outputs.darwin-cache-key }} + 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} \