name: Release on: push: tags: ["v*"] permissions: contents: write jobs: distro-amd64: runs-on: ubuntu-24.04 steps: - name: Checkout Spinifex uses: actions/checkout@v6 with: path: spinifex - name: Checkout Predastore uses: actions/checkout@v6 with: repository: mulgadc/predastore path: predastore - name: Checkout Viperblock uses: actions/checkout@v6 with: repository: mulgadc/viperblock path: viperblock - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Build amd64 Tarball env: VERSION: ${{ github.ref_name }} run: cd spinifex && make distro-amd64 VERSION="$VERSION" - name: Upload amd64 Artifacts uses: actions/upload-artifact@v7 with: name: distro-amd64 path: | spinifex/dist/spinifex-${{ github.ref_name }}-linux-amd64.tar.gz spinifex/dist/spinifex-${{ github.ref_name }}-linux-amd64.tar.gz.sha256 spinifex/scripts/setup.sh distro-arm64: runs-on: ubuntu-24.04-arm steps: - name: Checkout Spinifex uses: actions/checkout@v6 with: path: spinifex - name: Checkout Predastore uses: actions/checkout@v6 with: repository: mulgadc/predastore path: predastore - name: Checkout Viperblock uses: actions/checkout@v6 with: repository: mulgadc/viperblock path: viperblock - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Build arm64 Tarball env: VERSION: ${{ github.ref_name }} run: cd spinifex && make distro-arm64 VERSION="$VERSION" - name: Upload arm64 Artifacts uses: actions/upload-artifact@v7 with: name: distro-arm64 path: | spinifex/dist/spinifex-${{ github.ref_name }}-linux-arm64.tar.gz spinifex/dist/spinifex-${{ github.ref_name }}-linux-arm64.tar.gz.sha256 release: needs: [distro-amd64, distro-arm64] runs-on: ubuntu-24.04 steps: - name: Download amd64 Artifacts uses: actions/download-artifact@v8 with: name: distro-amd64 path: artifacts - name: Download arm64 Artifacts uses: actions/download-artifact@v8 with: name: distro-arm64 path: artifacts - name: Create Draft GitHub Release uses: softprops/action-gh-release@v3 with: draft: true files: | artifacts/**/*.tar.gz artifacts/**/*.sha256 artifacts/**/setup.sh generate_release_notes: true - name: Upload Tarball for Verify Job uses: actions/upload-artifact@v7 with: name: release-assets path: artifacts/ verify: needs: release runs-on: [self-hosted, ci-single] timeout-minutes: 25 env: TOFU_LOG: /tmp/release-verify-${{ github.run_id }}.log TAG: ${{ github.ref_name }} REPO: ${{ github.repository }} steps: - name: Clean Workspace run: rm -rf "$GITHUB_WORKSPACE"/* - uses: actions/create-github-app-token@v3 id: app-token with: client-id: ${{ secrets.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} repositories: mulga - uses: actions/checkout@v6 with: repository: mulgadc/mulga token: ${{ steps.app-token.outputs.token }} sparse-checkout: scripts/tofu-cluster path: mulga - name: Download Release Assets uses: actions/download-artifact@v8 with: name: release-assets path: release-assets - name: Provision VM working-directory: mulga/scripts/tofu-cluster run: | tofu init -input=false >> "$TOFU_LOG" 2>&1 tofu workspace select -or-create "${SPINIFEX_CI_ENV}" >> "$TOFU_LOG" 2>&1 tofu destroy -var-file=envs/${SPINIFEX_CI_ENV}.tfvars -auto-approve -input=false >> "$TOFU_LOG" 2>&1 || true ./scrub-env.sh "${SPINIFEX_CI_ENV}" >> "$TOFU_LOG" 2>&1 || true tofu apply -var-file=envs/${SPINIFEX_CI_ENV}.tfvars -auto-approve -input=false >> "$TOFU_LOG" 2>&1 - name: Bootstrap via Binary Install working-directory: mulga/scripts/tofu-cluster run: | SETUP_SH=$(find "${GITHUB_WORKSPACE}/release-assets" -name "setup.sh" | head -1) TARBALL=$(find "${GITHUB_WORKSPACE}/release-assets" -name "*-linux-amd64.tar.gz" | head -1) ./bootstrap-install.sh "${SPINIFEX_CI_ENV}" "$SETUP_SH" "$TARBALL" - name: Promote Release if: success() env: GH_TOKEN: ${{ github.token }} run: | if [[ "$TAG" =~ -(dev|rc|alpha|beta) ]]; then gh release edit "$TAG" --repo "$REPO" --draft=false --prerelease echo "Release ${TAG} promoted as prerelease" else gh release edit "$TAG" --repo "$REPO" --draft=false echo "Release ${TAG} promoted to latest" fi - name: Mark Release Failed if: failure() env: GH_TOKEN: ${{ github.token }} run: | EXISTING_BODY=$(gh release view "$TAG" --repo "$REPO" --json body -q .body) NOTES_FILE=$(mktemp) printf 'Verification failed — see workflow run for details.\n\n%s' "$EXISTING_BODY" > "$NOTES_FILE" gh release edit "$TAG" --repo "$REPO" --notes-file "$NOTES_FILE" rm -f "$NOTES_FILE" - name: Teardown if: always() working-directory: mulga/scripts/tofu-cluster run: | tofu workspace select -or-create "${SPINIFEX_CI_ENV}" >> "$TOFU_LOG" 2>&1 tofu destroy -var-file=envs/${SPINIFEX_CI_ENV}.tfvars -auto-approve -input=false >> "$TOFU_LOG" 2>&1 ./scrub-env.sh "${SPINIFEX_CI_ENV}" >> "$TOFU_LOG" 2>&1 || true