Build and Push SnarkOS (telemetry / history-telemetry / none) #97
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: Build and Push SnarkOS (telemetry / history-telemetry / none) | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| commit_or_tag: | |
| description: 'snarkOS commit SHA or tag' | |
| required: false | |
| tag_name: | |
| description: 'Optional tag name to use for the image' | |
| required: false | |
| default: '' | |
| features: | |
| description: 'Which feature set to build' | |
| type: choice | |
| required: true | |
| default: telemetry | |
| options: | |
| - telemetry | |
| - history-telemetry | |
| - none | |
| jobs: | |
| extractor: | |
| runs-on: ubuntu-latest | |
| if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository | |
| outputs: | |
| tag_name: ${{ steps.release_info.outputs.tag_name }} | |
| network: ${{ steps.release_info.outputs.network }} | |
| steps: | |
| - name: Clone and Extract Info | |
| id: release_info | |
| run: | | |
| git clone https://github.com/ProvableHQ/snarkOS.git snarkos | |
| cd snarkos | |
| git checkout ${{ github.event.inputs.commit_or_tag }} | |
| git fetch --tags | |
| TAG_NAME="${{ github.event.inputs.tag_name }}" | |
| if [[ -z "$TAG_NAME" ]]; then | |
| TAG_NAME=$(git tag --contains ${{ github.event.inputs.commit_or_tag }} | head -n1 || echo "") | |
| fi | |
| if [[ -z "$TAG_NAME" ]]; then | |
| echo "No tag found for commit ${{ github.event.inputs.commit_or_tag }}" | |
| exit 1 | |
| fi | |
| echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT | |
| if [[ "$TAG_NAME" == testnet-* ]]; then | |
| NETWORK="testnet" | |
| elif [[ "$TAG_NAME" == canary-* ]]; then | |
| NETWORK="canary" | |
| else | |
| NETWORK="mainnet" | |
| fi | |
| echo "network=$NETWORK" >> $GITHUB_OUTPUT | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| build-amd64: | |
| needs: extractor | |
| runs-on: snarkos-amd64-builder | |
| name: Build SnarkOS for AMD64 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Export Environment Variables from GitHub Variables | |
| run: | | |
| echo "GCP_PROJECT_ID=${{ vars.GCP_PROJECT_ID }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REGISTRY_REGION=${{ vars.GCP_ARTIFACT_REGISTRY_REGION }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REPO=${{ vars.GCP_ARTIFACT_REPO }}" >> $GITHUB_ENV | |
| echo "DOCKERHUB_REPO=${{ vars.DOCKERHUB_SNARKOS_REPO }}" >> $GITHUB_ENV | |
| - name: Setup Google Cloud SDK | |
| uses: google-github-actions/setup-gcloud@v2 | |
| with: | |
| project_id: ${{ env.GCP_PROJECT_ID }} | |
| service_account_key: ${{ secrets.GCP_SA_IMG_BUILDER_KEY }} | |
| - name: Authenticate to Google Cloud | |
| uses: google-github-actions/auth@v2 | |
| with: | |
| credentials_json: ${{ secrets.GCP_SA_IMG_BUILDER_KEY }} | |
| - name: Configure Docker for Artifact Registry | |
| run: gcloud auth configure-docker us-east1-docker.pkg.dev | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Map NETWORK and feature → Dockerfile/tag suffix | |
| run: | | |
| case "${{ needs.extractor.outputs.network }}" in | |
| mainnet) echo "NETWORK=0" >> $GITHUB_ENV && echo "NETWORK_DIR=mainnet" >> $GITHUB_ENV ;; | |
| testnet) echo "NETWORK=1" >> $GITHUB_ENV && echo "NETWORK_DIR=testnet" >> $GITHUB_ENV ;; | |
| canary) echo "NETWORK=2" >> $GITHUB_ENV && echo "NETWORK_DIR=canary" >> $GITHUB_ENV ;; | |
| *) echo "Unknown network" && exit 1 ;; | |
| esac | |
| case "${{ github.event.inputs.features }}" in | |
| telemetry) | |
| echo "DOCKERFILE=./service/snarkos-telemetry/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=-telemetry" >> $GITHUB_ENV | |
| ;; | |
| history-telemetry) | |
| echo "DOCKERFILE=./service/snarkos-history-telemetry/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=-history-telemetry" >> $GITHUB_ENV | |
| ;; | |
| none) | |
| echo "DOCKERFILE=./service/snarkos-no-features/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=" >> $GITHUB_ENV | |
| ;; | |
| *) | |
| echo "Unknown features selection"; exit 1;; | |
| esac | |
| - name: Build and Push for AMD64 | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ${{ env.DOCKERFILE }} | |
| push: true | |
| platforms: linux/amd64 | |
| provenance: false | |
| tags: | | |
| us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-amd64 | |
| ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-amd64 | |
| build-args: | | |
| COMMIT_OR_TAG=${{ github.event.inputs.commit_or_tag }} | |
| NETWORK=${{ needs.extractor.outputs.network }} | |
| build-arm64: | |
| needs: extractor | |
| runs-on: snarkos-arm64-builder | |
| name: Build SnarkOS for ARM64 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Export Environment Variables from GitHub Variables | |
| run: | | |
| echo "GCP_PROJECT_ID=${{ vars.GCP_PROJECT_ID }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REGISTRY_REGION=${{ vars.GCP_ARTIFACT_REGISTRY_REGION }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REPO=${{ vars.GCP_ARTIFACT_REPO }}" >> $GITHUB_ENV | |
| echo "DOCKERHUB_REPO=${{ vars.DOCKERHUB_SNARKOS_REPO }}" >> $GITHUB_ENV | |
| - name: Setup Google Cloud SDK | |
| uses: google-github-actions/setup-gcloud@v2 | |
| with: | |
| project_id: ${{ env.GCP_PROJECT_ID }} | |
| service_account_key: ${{ secrets.GCP_SA_IMG_BUILDER_KEY }} | |
| - name: Authenticate to Google Cloud | |
| uses: google-github-actions/auth@v2 | |
| with: | |
| credentials_json: ${{ secrets.GCP_SA_IMG_BUILDER_KEY }} | |
| - name: Configure Docker for Artifact Registry | |
| run: gcloud auth configure-docker us-east1-docker.pkg.dev | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Map NETWORK and feature → Dockerfile/tag suffix | |
| run: | | |
| case "${{ needs.extractor.outputs.network }}" in | |
| mainnet) echo "NETWORK=0" >> $GITHUB_ENV && echo "NETWORK_DIR=mainnet" >> $GITHUB_ENV ;; | |
| testnet) echo "NETWORK=1" >> $GITHUB_ENV && echo "NETWORK_DIR=testnet" >> $GITHUB_ENV ;; | |
| canary) echo "NETWORK=2" >> $GITHUB_ENV && echo "NETWORK_DIR=canary" >> $GITHUB_ENV ;; | |
| *) echo "Unknown network" && exit 1 ;; | |
| esac | |
| case "${{ github.event.inputs.features }}" in | |
| telemetry) | |
| echo "DOCKERFILE=./service/snarkos-telemetry/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=-telemetry" >> $GITHUB_ENV | |
| ;; | |
| history-telemetry) | |
| echo "DOCKERFILE=./service/snarkos-history-telemetry/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=-history-telemetry" >> $GITHUB_ENV | |
| ;; | |
| none) | |
| echo "DOCKERFILE=./service/snarkos-no-features/Dockerfile" >> $GITHUB_ENV | |
| echo "TAG_SUFFIX=" >> $GITHUB_ENV | |
| ;; | |
| *) | |
| echo "Unknown features selection"; exit 1;; | |
| esac | |
| - name: Build and Push for ARM64 | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ${{ env.DOCKERFILE }} | |
| push: true | |
| platforms: linux/arm64 | |
| provenance: false | |
| tags: | | |
| us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-arm64 | |
| ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-arm64 | |
| build-args: | | |
| COMMIT_OR_TAG=${{ github.event.inputs.commit_or_tag }} | |
| NETWORK=${{ needs.extractor.outputs.network }} | |
| create-manifest: | |
| needs: [extractor, build-amd64, build-arm64] | |
| runs-on: snarkos-amd64-builder | |
| steps: | |
| - name: Set up Docker CLI for manifest | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Export Environment Variables from GitHub Variables | |
| run: | | |
| echo "GCP_PROJECT_ID=${{ vars.GCP_PROJECT_ID }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REGISTRY_REGION=${{ vars.GCP_ARTIFACT_REGISTRY_REGION }}" >> $GITHUB_ENV | |
| echo "GCP_ARTIFACT_REPO=${{ vars.GCP_ARTIFACT_REPO }}" >> $GITHUB_ENV | |
| echo "DOCKERHUB_REPO=${{ vars.DOCKERHUB_SNARKOS_REPO }}" >> $GITHUB_ENV | |
| - name: Authenticate with GCP | |
| uses: google-github-actions/auth@v2 | |
| with: | |
| credentials_json: ${{ secrets.GCP_SA_IMG_BUILDER_KEY }} | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Map NETWORK and feature → tag suffix | |
| run: | | |
| case "${{ needs.extractor.outputs.network }}" in | |
| mainnet) echo "NETWORK_DIR=mainnet" >> $GITHUB_ENV ;; | |
| testnet) echo "NETWORK_DIR=testnet" >> $GITHUB_ENV ;; | |
| canary) echo "NETWORK_DIR=canary" >> $GITHUB_ENV ;; | |
| *) echo "Unknown network" && exit 1 ;; | |
| esac | |
| case "${{ github.event.inputs.features }}" in | |
| telemetry) echo "TAG_SUFFIX=-telemetry" >> $GITHUB_ENV ;; | |
| history-telemetry) echo "TAG_SUFFIX=-history-telemetry" >> $GITHUB_ENV ;; | |
| none) echo "TAG_SUFFIX=" >> $GITHUB_ENV ;; | |
| *) echo "Unknown features selection"; exit 1;; | |
| esac | |
| - name: Configure Docker | |
| run: gcloud auth configure-docker us-east1-docker.pkg.dev | |
| - name: Create and Push Multi-Arch Manifest (GCP + Docker Hub) | |
| run: | | |
| # ---- GCP ---- | |
| docker manifest create \ | |
| us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }} \ | |
| --amend us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-amd64 \ | |
| --amend us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-arm64 | |
| docker manifest push \ | |
| us-east1-docker.pkg.dev/${{ env.GCP_PROJECT_ID }}/${{ env.GCP_ARTIFACT_REPO }}/${{ env.NETWORK_DIR }}/snarkos:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }} | |
| # ---- Docker Hub ---- | |
| docker manifest create \ | |
| ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }} \ | |
| --amend ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-amd64 \ | |
| --amend ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }}-arm64 | |
| docker manifest push \ | |
| ${{ env.DOCKERHUB_REPO }}:${{ needs.extractor.outputs.tag_name }}${{ env.TAG_SUFFIX }} |