-
Notifications
You must be signed in to change notification settings - Fork 116
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(ci): enhance workflow dispatch support for node deployments
- Add dynamic network matrix selection for workflow dispatch - Support manual log file configuration - Remove single instance deployment job - Adjust environment labeling for manual deployments - Simplify deployment workflow conditions
- Loading branch information
1 parent
8455c43
commit 3427488
Showing
1 changed file
with
36 additions
and
116 deletions.
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -229,12 +229,28 @@ jobs: | |
# Runs: | ||
# - on every push to the `main` branch | ||
# - on every release, when it's published | ||
# - on workflow_dispatch for manual deployments | ||
|
||
# Determine which networks to deploy based on the trigger | ||
set-matrix: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
networks: ${{ steps.set-networks.outputs.matrix }} | ||
steps: | ||
- id: set-networks | ||
run: | | ||
Check warning on line 241 in .github/workflows/cd-deploy-nodes-gcp.yml
|
||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | ||
echo "matrix=[${{ toJSON(inputs.network) }}]" >> $GITHUB_OUTPUT | ||
else | ||
echo 'matrix=["Mainnet","Testnet"]' >> $GITHUB_OUTPUT | ||
fi | ||
deploy-nodes: | ||
strategy: | ||
matrix: | ||
network: [Mainnet, Testnet] | ||
network: ${{ fromJSON(needs.set-matrix.outputs.networks) }} | ||
name: Deploy ${{ matrix.network }} nodes | ||
needs: [ build, versioning, test-configuration-file, test-zebra-conf-path, get-disk-name ] | ||
needs: [ set-matrix, build, versioning, test-configuration-file, test-zebra-conf-path, get-disk-name ] | ||
runs-on: ubuntu-latest | ||
timeout-minutes: 60 | ||
env: | ||
|
@@ -243,7 +259,11 @@ jobs: | |
permissions: | ||
contents: 'read' | ||
id-token: 'write' | ||
if: ${{ !cancelled() && !failure() && ((github.event_name == 'push' && github.ref_name == 'main') || github.event_name == 'release') }} | ||
if: ${{ !cancelled() && !failure() && ( | ||
(github.event_name == 'push' && github.ref_name == 'main') || | ||
github.event_name == 'release' || | ||
github.event_name == 'workflow_dispatch' | ||
) }} | ||
|
||
steps: | ||
- uses: actions/[email protected] | ||
|
@@ -257,17 +277,14 @@ jobs: | |
|
||
# Makes the Zcash network name lowercase. | ||
# | ||
# Labels and disks in GCP are required to be in lowercase, but the blockchain network | ||
# uses sentence case, so we need to downcase the ${{ matrix.network }}. | ||
# Labels in GCP are required to be in lowercase, but the blockchain network | ||
# uses sentence case, so we need to downcase the network. | ||
# | ||
# Passes ${{ matrix.network }} to subsequent steps using $NETWORK env variable. | ||
# Passes ${{ env.GITHUB_REF_SLUG_URL }} to subsequent steps using $SHORT_GITHUB_REF env variable. | ||
# Passes lowercase network to subsequent steps using $NETWORK env variable. | ||
- name: Downcase network name for labels | ||
run: | | ||
NETWORK_CAPS="${{ matrix.network }}" | ||
echo "NETWORK=${NETWORK_CAPS,,}" >> "$GITHUB_ENV" | ||
LONG_GITHUB_REF="${{ env.GITHUB_REF_SLUG_URL }}" | ||
echo "SHORT_GITHUB_REF=${LONG_GITHUB_REF:0:12}" >> "$GITHUB_ENV" | ||
# Setup gcloud CLI | ||
- name: Authenticate to Google Cloud | ||
|
@@ -280,25 +297,6 @@ jobs: | |
- name: Set up Cloud SDK | ||
uses: google-github-actions/[email protected] | ||
|
||
# TODO: The sub-find-cached-disks.yml reusable workflow does not supports matrix strategy | ||
# We need to find a way to pass the matching network from the `get-disk-name` job | ||
# In the meanwhile we're repeating the logic of sub-find-cached-disks.yml here | ||
- name: Check if cached state disks exists | ||
id: get-available-disks | ||
env: | ||
GITHUB_REF: ${{ env.SHORT_GITHUB_REF }} | ||
NETWORK: ${{ env.NETWORK }} # use lowercase version from env, not input | ||
DISK_PREFIX: zebrad-cache | ||
DISK_SUFFIX: ${{ inputs.cached_disk_type || 'tip' }} | ||
PREFER_MAIN_CACHED_STATE: ${{ inputs.prefer_main_cached_state }} | ||
run: | | ||
source ./.github/workflows/scripts/gcp-get-cached-disks.sh | ||
echo "state_version=${LOCAL_STATE_VERSION}" >> "${GITHUB_OUTPUT}" | ||
echo "cached_disk_name=${CACHED_DISK_NAME}" >> "${GITHUB_OUTPUT}" | ||
echo "lwd_tip_disk=${LWD_TIP_DISK}" >> "${GITHUB_OUTPUT}" | ||
echo "zebra_tip_disk=${ZEBRA_TIP_DISK}" >> "${GITHUB_OUTPUT}" | ||
echo "zebra_checkpoint_disk=${ZEBRA_CHECKPOINT_DISK}" >> "${GITHUB_OUTPUT}" | ||
- name: Get IP address for long-running release nodes | ||
if: ${{ github.event_name == 'release' }} | ||
run: echo "IP_ADDRESS=$(gcloud compute addresses describe zebra-${NETWORK} --region ${{ vars.GCP_REGION }} --format='value(address)')" >> "$GITHUB_ENV" | ||
Check warning on line 302 in .github/workflows/cd-deploy-nodes-gcp.yml
|
||
|
@@ -325,6 +323,13 @@ jobs: | |
exit 1 | ||
fi | ||
# Set log file based on input or default | ||
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then | ||
LOG_FILE="${{ inputs.log_file }}" | ||
else | ||
LOG_FILE="${{ vars.CD_LOG_FILE }}" | ||
fi | ||
gcloud compute instance-templates create-with-container zebrad-${{ needs.versioning.outputs.major_version || env.GITHUB_REF_SLUG_URL }}-${{ env.GITHUB_SHA_SHORT }}-${NETWORK} \ | ||
--machine-type ${{ vars.GCP_SMALL_MACHINE }} \ | ||
--boot-disk-size=10GB \ | ||
|
@@ -338,11 +343,11 @@ jobs: | |
--container-stdin \ | ||
--container-tty \ | ||
--container-image ${{ vars.GAR_BASE }}/zebrad@${{ needs.build.outputs.image_digest }} \ | ||
--container-env "NETWORK=${{ matrix.network }},LOG_FILE=${{ vars.CD_LOG_FILE }},LOG_COLOR=false,SENTRY_DSN=${{ vars.SENTRY_DSN }}" \ | ||
--container-env "NETWORK=${{ matrix.network }},LOG_FILE=${LOG_FILE},LOG_COLOR=false,SENTRY_DSN=${{ vars.SENTRY_DSN }}" \ | ||
--service-account ${{ vars.GCP_DEPLOYMENTS_SA }} \ | ||
--scopes cloud-platform \ | ||
--metadata google-logging-enabled=true,google-logging-use-fluentbit=true,google-monitoring-enabled=true \ | ||
--labels=app=zebrad,environment=staging,network=${NETWORK},github_ref=${{ env.GITHUB_REF_SLUG_URL }} \ | ||
--labels=app=zebrad,environment=${{ github.event_name == 'workflow_dispatch' && 'qa' || 'staging' }},network=${NETWORK},github_ref=${{ env.GITHUB_REF_SLUG_URL }} \ | ||
--tags zebrad | ||
# Check if our destination instance group exists already | ||
|
@@ -373,95 +378,10 @@ jobs: | |
--version template="zebrad-${{ needs.versioning.outputs.major_version || env.GITHUB_REF_SLUG_URL }}-${{ env.GITHUB_SHA_SHORT }}-${NETWORK}" \ | ||
--region "${{ vars.GCP_REGION }}" | ||
# This jobs handles the deployment of a single node (1) in the configured GCP zone | ||
# when an instance is required to test a specific commit | ||
# | ||
# Runs: | ||
# - on request, using workflow_dispatch with regenerate-disks | ||
# | ||
# Note: this instances are not automatically replaced or deleted | ||
deploy-instance: | ||
name: Deploy single ${{ inputs.network }} instance | ||
needs: [ build, test-configuration-file, test-zebra-conf-path, get-disk-name ] | ||
runs-on: ubuntu-latest | ||
timeout-minutes: 30 | ||
env: | ||
CACHED_DISK_NAME: ${{ needs.get-disk-name.outputs.cached_disk_name }} | ||
permissions: | ||
contents: 'read' | ||
id-token: 'write' | ||
# Run even if we don't need a cached disk, but only when triggered by a workflow_dispatch | ||
if: ${{ !failure() && github.event_name == 'workflow_dispatch' }} | ||
|
||
steps: | ||
- uses: actions/[email protected] | ||
with: | ||
persist-credentials: false | ||
|
||
- name: Inject slug/short variables | ||
uses: rlespinasse/github-slug-action@v5 | ||
with: | ||
short-length: 7 | ||
|
||
# Makes the Zcash network name lowercase. | ||
# | ||
# Labels in GCP are required to be in lowercase, but the blockchain network | ||
# uses sentence case, so we need to downcase the network. | ||
# | ||
# Passes the lowercase network to subsequent steps using $NETWORK env variable. | ||
- name: Downcase network name for labels | ||
run: | | ||
NETWORK_CAPS="${{ inputs.network }}" | ||
echo "NETWORK=${NETWORK_CAPS,,}" >> "$GITHUB_ENV" | ||
# Setup gcloud CLI | ||
- name: Authenticate to Google Cloud | ||
id: auth | ||
uses: google-github-actions/[email protected] | ||
with: | ||
workload_identity_provider: '${{ vars.GCP_WIF }}' | ||
service_account: '${{ vars.GCP_DEPLOYMENTS_SA }}' | ||
|
||
- name: Set up Cloud SDK | ||
uses: google-github-actions/[email protected] | ||
|
||
# Create instance template from container image | ||
- name: Manual deploy of a single ${{ inputs.network }} instance running zebrad | ||
run: | | ||
DISK_NAME="zebrad-cache-${{ env.GITHUB_HEAD_REF_SLUG_URL || env.GITHUB_REF_SLUG_URL }}-${{ env.GITHUB_SHA_SHORT }}-${NETWORK}" | ||
DISK_PARAMS="name=${DISK_NAME},device-name=${DISK_NAME},size=400GB,type=pd-balanced" | ||
if [ -n "${{ env.CACHED_DISK_NAME }}" ]; then | ||
DISK_PARAMS+=",image=${{ env.CACHED_DISK_NAME }}" | ||
elif [ ${{ !inputs.need_cached_disk && github.event_name == 'workflow_dispatch' }} ]; then | ||
echo "No cached disk required" | ||
else | ||
echo "No cached disk found for ${{ matrix.network }} in main branch" | ||
exit 1 | ||
fi | ||
gcloud compute instances create-with-container "zebrad-${{ env.GITHUB_REF_SLUG_URL }}-${{ env.GITHUB_SHA_SHORT }}-${NETWORK}" \ | ||
--machine-type ${{ vars.GCP_SMALL_MACHINE }} \ | ||
--boot-disk-size=10GB \ | ||
--boot-disk-type=pd-standard \ | ||
--image-project=cos-cloud \ | ||
--image-family=cos-stable \ | ||
--subnet=${{ vars.GCP_SUBNETWORK }} \ | ||
--create-disk="${DISK_PARAMS}" \ | ||
--container-mount-disk=mount-path='/var/cache/zebrad-cache',name=${DISK_NAME},mode=rw \ | ||
--container-stdin \ | ||
--container-tty \ | ||
--container-image ${{ vars.GAR_BASE }}/zebrad@${{ needs.build.outputs.image_digest }} \ | ||
--container-env "NETWORK=${{ inputs.network }},LOG_FILE=${{ inputs.log_file }},LOG_COLOR=false,SENTRY_DSN=${{ vars.SENTRY_DSN }}" \ | ||
--service-account ${{ vars.GCP_DEPLOYMENTS_SA }} \ | ||
--scopes cloud-platform \ | ||
--metadata google-logging-enabled=true,google-monitoring-enabled=true \ | ||
--labels=app=zebrad,environment=qa,network=${NETWORK},github_ref=${{ env.GITHUB_REF_SLUG_URL }} \ | ||
--tags zebrad \ | ||
--zone ${{ vars.GCP_ZONE }} | ||
failure-issue: | ||
name: Open or update issues for release failures | ||
# When a new job is added to this workflow, add it to this list. | ||
needs: [ versioning, build, deploy-nodes, deploy-instance ] | ||
needs: [ versioning, build, deploy-nodes ] | ||
# Only open tickets for failed or cancelled jobs that are not coming from PRs. | ||
# (PR statuses are already reported in the PR jobs list, and checked by GitHub's Merge Queue.) | ||
if: (failure() && github.event.pull_request == null) || (cancelled() && github.event.pull_request == null) | ||
|