♾️

ICPのDapp開発用のGitHubActionsを整備してみる

2025/01/26に公開

挨拶

こんにちは、T4D4です。
いきなりですが、年末年始に「脳に収まるコードの書き方」という本を読みました。
https://www.oreilly.co.jp/books/9784814400799/
この本は、凄くざっくりと纏めるとコードの書き方や開発の進め方に関するさまざまなプラクティスを紹介しています。それらのプラクティスの中ですぐに実践できそうなプラクティスの内の1つとして、以下のアドバイスが記述されていました。

コードがなければ、コンパイルやテスト、デプロイの自動化は簡単です。既存のコードベースに継続的デリバリーを組み込むのは恐ろしく手間のかかる作業です。そのため、新しいコードベースを扱い始めたらすぐにやりましょう

ということで、今回はちょうどICP Japan主催のICP Hackathon 2025に参加するのでICPのDapp開発用のGitHubActionsを整備してみることにしました。
https://app.akindo.io/wave-hacks/0nvK8Rd9dfzj63PZV

何を自動化するか確認する

まずは、自動化する内容を決めます。
ICPの開発を加速するために、以下の操作を自動化したいと思います。

  • リントとフォーマット
  • ビルド
  • テスト
  • デプロイ

これらを手動で行う時にはそれぞれ以下のコマンドを実行します。

# リントとフォーマット
cargo fmt
cargo clippy
# ビルド
dfx build <canister-name>
# テスト
cargo test
# デプロイ(テストネット)
dfx deploy

GitHubActionsの設定

GitHubActionsを使って、上記の操作を自動化する設定を行います。
まず、導入したい新規プロジェクトのルートに.github/workflowsディレクトリを作成します。
その中にci.ymlというファイルを作成し、以下の記述を追加します。
作成には以下の記事とGitHubCopilotを参考にしました。
https://qiita.com/shun198/items/14cdba2d8e58ab96cf95

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自体は解説できる程詳しくないので割愛いたします。
このワークフローは、以下の順序で実行されます。

  1. リポジトリのソースコードをチェックアウト
  2. Rustのセットアップ
  3. WebAssemblyターゲットの追加
    • 後でデプロイする際に必要
  4. Clippyによるリントチェック
  5. フォーマットチェック
  6. テスト実行
    • ここまでがRustのコードのみを対象にしたCI。
  7. DFXのセットアップ
    • 恐らく最新のDFXをインストールしている
  8. DFXのバージョン確認
  9. ローカルネットワークの起動
  10. キャニスターのデプロイ
    • デプロイしたキャニスターの関数を呼び出してテストする際はこの次に追加します。
      dfx canister call <canister-name> <function-name> <args>でデプロイしたキャニスターの関数を呼び出すことができます。
  11. DFXの停止
    • テストが終わったらローカルネットワークを停止します。
      止めないとGitHubのVMが動き続けてしまうかも?なので止めといた方が良いと思っています

まとめ

以上で、ICPのDapp開発用のGitHubActionsを整備することができました。
今回使用したレポジトリは以下です。
https://github.com/T4D4-IU/icp_actions_template
レポジトリのActionsの履歴を見て貰えばわかると思うのですが、DFXのセットアップでエラーが出まくってかなり苦労しました。
最初はGitHubActionsに詳しくないのでGitHubCopilot頼りで書いていたのですが、なかなか解決できないのでググったらDfinity公式のsetup-dfxというレポジトリを見つけて、それを使うことで解決できました。まだGoogle検索は死んでいないみたいですねw
まだまだGitHubActionsは初心者で多分今回作成したものは改善の余地があると思うのでGitHubActionsに詳しい方がいれば教えていただけると嬉しいです。

Discussion