Skip to content

Build and Push SnarkOS (telemetry / history-telemetry / none) #97

Build and Push SnarkOS (telemetry / history-telemetry / none)

Build and Push SnarkOS (telemetry / history-telemetry / none) #97

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 }}