ICPのDapp開発用のGitHubActionsを整備してみる
挨拶
こんにちは、T4D4です。
いきなりですが、年末年始に「脳に収まるコードの書き方」という本を読みました。
この本は、凄くざっくりと纏めるとコードの書き方や開発の進め方に関するさまざまなプラクティスを紹介しています。それらのプラクティスの中ですぐに実践できそうなプラクティスの内の1つとして、以下のアドバイスが記述されていました。
コードがなければ、コンパイルやテスト、デプロイの自動化は簡単です。既存のコードベースに継続的デリバリーを組み込むのは恐ろしく手間のかかる作業です。そのため、新しいコードベースを扱い始めたらすぐにやりましょう
ということで、今回はちょうどICP Japan主催のICP Hackathon 2025に参加するのでICPのDapp開発用のGitHubActionsを整備してみることにしました。
何を自動化するか確認する
まずは、自動化する内容を決めます。
ICPの開発を加速するために、以下の操作を自動化したいと思います。
- リントとフォーマット
- ビルド
- テスト
- デプロイ
これらを手動で行う時にはそれぞれ以下のコマンドを実行します。
# リントとフォーマット
cargo fmt
cargo clippy
# ビルド
dfx build <canister-name>
# テスト
cargo test
# デプロイ(テストネット)
dfx deploy
GitHubActionsの設定
GitHubActionsを使って、上記の操作を自動化する設定を行います。
まず、導入したい新規プロジェクトのルートに.github/workflows
ディレクトリを作成します。
その中にci.yml
というファイルを作成し、以下の記述を追加します。
作成には以下の記事とGitHubCopilotを参考にしました。
name: Rust CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
# リポジトリのソースコードをチェックアウト
- uses: actions/checkout@v4
# Rustのセットアップ(Toolchainなどを指定可能)
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
# WebAssemblyターゲットの追加
- name: Add wasm32 target
run: rustup target add wasm32-unknown-unknown
# Clippyによるリントチェック
- name: Lint with Clippy
run: cargo clippy --all-targets --all-features -- -D warnings
# フォーマットチェック
- name: Check code formatting
run: cargo fmt --all -- --check
# テスト実行
- name: Run Tests
run: cargo test --all --verbose
# DFXのセットアップ
- name: Install DFX
uses: dfinity/setup-dfx@main
# DFXのバージョン確認
- name: Check DFX version
run: dfx --version
# ローカルネットワークの起動
- name: Start DFX network
run: dfx start --clean --background
# DFXのデプロイ
- name: Deploy with DFX
run: dfx deploy
# デプロイしたキャニスターの関数を呼び出してテストする際はココに追加
# DFXの停止
- name: Stop DFX network
run: dfx stop
簡単な解説
GitHubActions自体は解説できる程詳しくないので割愛いたします。
このワークフローは、以下の順序で実行されます。
- リポジトリのソースコードをチェックアウト
- Rustのセットアップ
- WebAssemblyターゲットの追加
- 後でデプロイする際に必要
- Clippyによるリントチェック
- フォーマットチェック
- テスト実行
- ここまでがRustのコードのみを対象にしたCI。
- DFXのセットアップ
- 恐らく最新のDFXをインストールしている
- DFXのバージョン確認
- ローカルネットワークの起動
- キャニスターのデプロイ
- デプロイしたキャニスターの関数を呼び出してテストする際はこの次に追加します。
dfx canister call <canister-name> <function-name> <args>
でデプロイしたキャニスターの関数を呼び出すことができます。
- デプロイしたキャニスターの関数を呼び出してテストする際はこの次に追加します。
- DFXの停止
- テストが終わったらローカルネットワークを停止します。
止めないとGitHubのVMが動き続けてしまうかも?なので止めといた方が良いと思っています
- テストが終わったらローカルネットワークを停止します。
まとめ
以上で、ICPのDapp開発用のGitHubActionsを整備することができました。
今回使用したレポジトリは以下です。
レポジトリのActionsの履歴を見て貰えばわかると思うのですが、DFXのセットアップでエラーが出まくってかなり苦労しました。
最初はGitHubActionsに詳しくないのでGitHubCopilot頼りで書いていたのですが、なかなか解決できないのでググったらDfinity公式のsetup-dfxというレポジトリを見つけて、それを使うことで解決できました。まだGoogle検索は死んでいないみたいですねw
まだまだGitHubActionsは初心者で多分今回作成したものは改善の余地があると思うのでGitHubActionsに詳しい方がいれば教えていただけると嬉しいです。
Discussion