name: Cross Compile Go run-name: Build and Bundle on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: node-version: '22' cache: npm cache-dependency-path: web/package-lock.json # The admin dashboard is embedded into the binary, so build it first - name: Build admin UI run: | npm ci --prefix web npm run build --prefix web - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.25' - name: Vet and test run: | go vet ./... go test ./... # SQLite needs CGO, so cross-compile ARM64 with the aarch64 C toolchain - name: Install ARM64 C toolchain run: sudo apt-get update && sudo apt-get install -y gcc-aarch64-linux-gnu # Build ARM64 - name: Build ARM64 run: CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc GOOS=linux GOARCH=arm64 go build -v -ldflags "-s -w -X main.buildCommit=${{ github.sha }}" -o crawler_main-linux-arm64 . # Build AMD64 - name: Build AMD64 run: CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -v -ldflags "-s -w -X main.buildCommit=${{ github.sha }}" -o crawler_main-linux-amd64 . # Create organized archives for download - name: Bundle Artifacts run: | # Create a directory for ARM64 release mkdir release-arm64 cp crawler_main-linux-arm64 release-arm64/crawler_main cp config.yaml release-arm64/ tar -czvf release-arm64.tar.gz -C release-arm64 . # Create a directory for AMD64 release mkdir release-amd64 cp crawler_main-linux-amd64 release-amd64/crawler_main tar -czvf release-amd64.tar.gz -C release-amd64 . - name: Upload ARM64 Artifact uses: actions/upload-artifact@v3 with: name: linux-arm64 path: release-arm64.tar.gz if-no-files-found: error - name: Upload AMD64 Artifact uses: actions/upload-artifact@v3 with: name: linux-amd64 path: release-amd64.tar.gz if-no-files-found: error