Skip to content

Deploy Program

Deploy Program #32

name: Deploy Program
on:
workflow_dispatch:
inputs:
program:
description: Program
required: true
default: bubblegum
type: choice
options:
- bubblegum
cluster:
description: Cluster environment
required: true
default: devnet
type: choice
options:
- devnet
- mainnet-beta
publish_crate:
description: Release cargo crate
type: boolean
default: false
bump:
description: Version bump
required: true
default: patch
type: choice
options:
- patch
- minor
- major
env:
CACHE: true
jobs:
build_programs:
name: Programs
uses: ./.github/workflows/build-programs.yml
secrets: inherit
test_programs:
name: Programs
needs: build_programs
uses: ./.github/workflows/test-programs.yml
secrets: inherit
with:
program_matrix: '["${{ inputs.program }}"]'
test_js:
name: JS client
needs: test_programs
uses: ./.github/workflows/test-js-client.yml
secrets: inherit
deploy_program:
name: Program / Deploy
runs-on: ubuntu-latest
needs: test_js
permissions:
contents: write
steps:
- name: Git checkout
uses: actions/checkout@v3
with:
token: ${{ secrets.SVC_TOKEN }}
- name: Load environment variables
run: cat .github/.env >> $GITHUB_ENV
- name: Install Rust
uses: metaplex-foundation/actions/install-rust@v1
with:
toolchain: "1.75.0"
- name: Install Solana
uses: metaplex-foundation/actions/install-solana@v1
with:
version: ${{ env.DEPLOY_SOLANA_VERSION }}
cache: ${{ env.CACHE }}
- name: Install Anchor CLI
uses: metaplex-foundation/actions/install-anchor-cli@v1
with:
version: ${{ env.ANCHOR_VERSION }}
cache: ${{ env.CACHE }}
- name: Install cargo-release
uses: metaplex-foundation/actions/install-cargo-release@v1
if: github.event.inputs.publish_crate == 'true'
with:
cache: ${{ env.CACHE }}
- name: Install cargo-release
uses: metaplex-foundation/actions/install-cargo-release@v1
if: github.event.inputs.publish_crate == 'true'
with:
cache: ${{ env.CACHE }}
- name: Set RPC
run: |
if [ "${{ inputs.cluster }}" == "devnet" ]; then
echo RPC=${{ secrets.DEVNET_RPC }} >> $GITHUB_ENV
else
echo RPC=${{ secrets.MAINNET_RPC }} >> $GITHUB_ENV
fi
- name: Identify program
run: |
if [ "${{ inputs.program }}" == "bubblegum" ]; then
echo ${{ secrets.BUBBLEGUM_DEPLOY_KEY }} > ./deploy-key.json
echo ${{ secrets.BUBBLEGUM_ID }} > ./program-id.json
echo PROGRAM_NAME="bubblegum" >> $GITHUB_ENV
fi
- name: Bump program version
run: |
IDL_NAME=`echo "${{ inputs.program }}" | tr - _`
VERSION=`jq '.version' ./idls/${IDL_NAME}.json | sed 's/"//g'`
MAJOR=`echo ${VERSION} | cut -d. -f1`
MINOR=`echo ${VERSION} | cut -d. -f2`
PATCH=`echo ${VERSION} | cut -d. -f3`
if [ "${{ inputs.bump }}" == "major" ]; then
MAJOR=$((MAJOR + 1))
MINOR=0
PATCH=0
elif [ "${{ inputs.bump }}" == "minor" ]; then
MINOR=$((MINOR + 1))
PATCH=0
else
PATCH=$((PATCH + 1))
fi
PROGRAM_VERSION="${MAJOR}.${MINOR}.${PATCH}"
cp ./idls/${IDL_NAME}.json ./idls/${IDL_NAME}-previous.json
jq ".version = \"${PROGRAM_VERSION}\"" ./idls/${IDL_NAME}-previous.json > ./idls/${IDL_NAME}.json
rm ./idls/${IDL_NAME}-previous.json
echo PROGRAM_VERSION="${PROGRAM_VERSION}" >> $GITHUB_ENV
- name: Download program builds
uses: actions/download-artifact@v4
with:
name: program-builds
- name: Deploy program
run: |
echo "Deploying ${{ inputs.program }} to ${{ inputs.cluster }}"
solana -v program deploy ./programs/.bin/${{ env.PROGRAM_NAME }}.so \
-u ${{ env.RPC }} \
--program-id ./program-id.json \
-k ./deploy-key.json \
--max-sign-attempts 100 \
--use-rpc
- name: Upgrade IDL
working-directory: ./programs/${{ inputs.program }}
run: |
jq 'del(.metadata?) | del(.. | .docs?)' ../../idls/`echo "${{ inputs.program }}" | tr - _`.json > ./idl.json
anchor idl upgrade -f ./idl.json \
--provider.cluster ${{ env.RPC }} \
--provider.wallet ../../deploy-key.json \
`solana address -k ../../program-id.json`
rm ../../deploy-key.json
rm ../../program-id.json
rm ./idl.json
- name: Version program
working-directory: ./programs/${{ inputs.program }}/program
if: github.event.inputs.publish_crate == 'true' && github.event.inputs.cluster == 'mainnet-beta'
run: |
git stash
git config user.name "${{ env.COMMIT_USER_NAME }}"
git config user.email "${{ env.COMMIT_USER_EMAIL }}"
cargo login ${{ secrets.CRATES_TOKEN }}
cargo release ${{ inputs.bump }} --no-confirm --no-push --no-tag --no-publish --execute
git reset --soft HEAD~1
git stash pop
- name: Commit and tag new version
uses: stefanzweifel/git-auto-commit-action@v4
if: github.event.inputs.publish_crate == 'true' && github.event.inputs.cluster == 'mainnet-beta'
with:
commit_message: "chore: ${{ inputs.program }} version ${{ env.PROGRAM_VERSION }}"
tagging_message: v${{ env.PROGRAM_VERSION }}@${{ inputs.cluster }}