Skip to content

Deploy to app

Deploy to app #220

# App deployments are non-production deployments to mainnet. They are public, can be used as staging, but e.g. funds are real.
name: Deploy to app
on:
push:
branches:
- "deploy-to-app"
workflow_dispatch:
inputs:
mode:
type: choice
description: "The dfx canister install mode. See `dfx canister install --help` for details."
options:
- upgrade
- reinstall
- install
- auto
canisters:
type: choice
description: Which canisters to install
options:
- all
- nns-dapp
- sns_aggregator
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
deploy-app:
runs-on: ubuntu-latest-m
timeout-minutes: 60
env:
NNS_DAPP_APP_SUBNET_CANISTER_ID: "xnjld-hqaaa-aaaal-qb56q-cai"
SNS_AGGREGATOR_APP_SUBNET_CANISTER_ID: "otgyv-wyaaa-aaaak-qcgba-cai"
DFX_NETWORK: app
steps:
- name: Checkout nns-dapp
uses: actions/checkout@v4
# TODO: This builds, it doesn't use a release. We probably want at least the option of using releases.
- name: Get versions
id: tool_versions
run: echo "dfx=$(jq -r .dfx dfx.json)" >> "$GITHUB_OUTPUT"
- name: Get dfx version
run: echo "DFX_VERSION=$(jq -r .dfx dfx.json)" >> $GITHUB_ENV
- name: Install dfx
uses: dfinity/setup-dfx@main
with:
dfx-version: ${{ env.DFX_VERSION }}
- name: Set credentials
run: |
printf "%s" "${{ secrets.DFX_IDENTITY_PEM }}" | dfx identity import --storage-mode=plaintext ci /dev/stdin
dfx identity use ci
env:
DFX_IDENTITY_PEM: ${{ secrets.DFX_IDENTITY_PEM }}
- name: Get SNS scripts
uses: ./.github/actions/checkout_snsdemo
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up SNS scripts
run: |
: Install more
sudo apt-get update -yy && sudo apt-get install -yy moreutils
: Add scripts to the path
echo "$PWD/snsdemo/bin" >> $GITHUB_PATH
- name: Verify identity
run: |
dfx identity whoami
dfx identity get-principal
- name: Set nns-dapp canister ID
run: |
set -x
CANISTER_NAME="nns-dapp"
export DFX_NETWORK CANISTER_NAME
jq 'del(.canisters[env.CANISTER_NAME].remote.id[env.DFX_NETWORK])' dfx.json | sponge dfx.json
dfx-canister set-id --network "$DFX_NETWORK" --canister_name "$CANISTER_NAME" --canister_id "$NNS_DAPP_APP_SUBNET_CANISTER_ID"
- name: Set sns_aggregator canister ID
run: |
set -x
CANISTER_NAME="sns_aggregator"
export DFX_NETWORK CANISTER_NAME
jq 'del(.canisters[env.CANISTER_NAME].remote.id[env.DFX_NETWORK])' dfx.json | sponge dfx.json
DFX_NETWORK="$DFX_NETWORK" jq 'del(.canisters.internet_identity.remote.id[env.DFX_NETWORK])' dfx.json | sponge dfx.json
dfx-canister set-id --network "$DFX_NETWORK" --canister_name "$CANISTER_NAME" --canister_id "$SNS_AGGREGATOR_APP_SUBNET_CANISTER_ID"
- name: Build wasms and config
uses: ./.github/actions/build_nns_dapp # Builds sns_aggregator as well.
with:
token: ${{ secrets.GITHUB_TOKEN }}
network: ${{ env.DFX_NETWORK }}
- name: Log the current state of the canisters
run: |
for canister in nns-dapp sns_aggregator ; do
echo "==== $canister ===="
set -x
dfx canister id --network app "$canister"
dfx canister info --network app "$canister"
dfx canister status --network app "$canister"
set +x
done
- name: Deploy nns-dapp
if: (inputs.canisters == 'all') || (inputs.canisters == 'nns-dapp') || ( github.event_name != 'workflow_dispatch' )
run: |
set -x
CANISTER_NAME="nns-dapp"
scripts/nns-dapp/split-assets
# Note: inputs.mode is set if this workflow is run manually, using `workflow_dispatch` defined above.
# If the workflow is triggered in another way, the inputs are not defined so we need to specify a default again.
ARGUMENT="$(cat "out/nns-dapp-arg-${DFX_NETWORK}.did")"
# There have been issues with the uploading of assets causing
# "heap out of bounds" so we output logs to help debug when it happens
# again.
# The canister only keeps a small amount of logs so we output them
# before and after every step to miss as little as possible.
dfx canister logs --network "$DFX_NETWORK" "$CANISTER_NAME"
dfx canister install --mode "${{ inputs.mode || 'upgrade' }}" --yes --network "$DFX_NETWORK" "$CANISTER_NAME" --argument "$ARGUMENT" --wasm out/nns-dapp_noassets.wasm.gz
dfx canister logs --network "$DFX_NETWORK" "$CANISTER_NAME"
./scripts/nns-dapp/upload-asset-tarball --network "$DFX_NETWORK" --chunk out/chunks/assets.xaa.tar.xz
dfx canister logs --network "$DFX_NETWORK" "$CANISTER_NAME"
./scripts/nns-dapp/upload-asset-tarball --network "$DFX_NETWORK" --chunk out/chunks/assets.xab.tar.xz
dfx canister logs --network "$DFX_NETWORK" "$CANISTER_NAME"
./scripts/nns-dapp/upload-asset-tarball --network "$DFX_NETWORK" --chunk out/chunks/assets.xac.tar.xz
dfx canister logs --network "$DFX_NETWORK" "$CANISTER_NAME"
- name: Deploy sns_aggregator
if: (inputs.canisters == 'all') || (inputs.canisters == 'sns_aggregator') || ( github.event_name != 'workflow_dispatch' )
run: |
set -x
CANISTER_NAME="sns_aggregator"
dfx canister install --mode "${{ inputs.mode || 'upgrade' }}" --yes --network "$DFX_NETWORK" "$CANISTER_NAME" --wasm out/sns_aggregator.wasm.gz
- name: Canister info
run: |
# How to add a GitHub summary: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-of-adding-a-job-summary
set -x
{
MODE="${{ inputs.mode || 'upgrade' }}"
printf "## %s %s\n\nCommit: %s\nRef: %s\n\n" \
"${MODE^}" "${{ inputs.canisters }}" \
"[${GITHUB_SHA}](https://github.com/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA})" \
"[${GITHUB_REF_NAME}](https://github.com/${GITHUB_REPOSITORY}/tree/${GITHUB_REF_NAME})"
for canister in nns-dapp sns_aggregator ; do
printf "## %s\n\n" "$canister"
printf "URL: "
dfx-canister-url --network "$DFX_NETWORK" "$canister"
printf "Commit: "
dfx canister metadata --network "$DFX_NETWORK" "$canister" git_commit_id || printf "NONE"
echo
dfx canister info --network "$DFX_NETWORK" "$canister"
echo
done
} >> $GITHUB_STEP_SUMMARY || true