目的
Hardhatでコントラクトを開発する中で、テスト・コンパイル・デプロイの操作が度々あります。そのような処理をGitHub Actionsを使ってCI・CDを構築したら良いと思い実装に至りました。
対象者
- GitHub Actionsを入門したい方
- CI/CDの基礎を学びたい方
- HardhatのCI/CDを構築したい方
基礎
CI/CDとは
CI(継続的インテグレーション)
コードのテスト・ビルドを繰り返す行うことで問題の早期発見し、開発効率をあげる手法
CD(継続的デリバリー)
検証済みのコードのリリースを自動化し、開発効率をあげる手法
詳しくは下記記事を参考にしてください
GitHub Actionsとは
GitHubが提供するCI/CDプラットフォームでワークフローに書かれた処理を実行します。
特徴としては既存のCI・CDツールではないissueの追加された時にもワークフローを実行することができます。
Hardhatとは
Hardhatは Ethereum ソフトウェアをコンパイル、デプロイ、テスト、およびデバッグするための開発環境です。この他だとTruffle Suiteなどがあります。
これを使用することにより、EVM互換性をもつチェーンを扱うことができます。
実装
環境構築
# npmの初期化
$ npm init -y
# hardhatのinstall
# Create a basic sample projectを選択
# 残りは推奨されている方を選択
$ npx hardhat install
# ワークフローのファイル作成
$ mkdir .github
$ mkdir .github/workflows
$ touch .github/workflows/deploy.yml
コーディング
npmスクリプトの修正
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "deploy": "hardhat run scripts/sample-script.js",
+ "compile": "hardhat compile",
+ "test": "hardhat test"
}
ワークフローの作成
name: deploy
on:
push:
branches:
- master #ここはお好きなブランチにしてください
jobs:
unit-test:
name: Unit Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Set Node.js 12.x
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm ci
- name: Test
run: npm test
deploy:
name: Deploy
needs: unit-test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Set Node.js 12.x
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm ci
- name: compile
run: npm run compile
- name: deploy
run: npm run deploy
大まかに解説
on
onの部分では何を条件にワークフローを動こすを指定できます。今回だとmasterブランチにpush・mergeされた時に動きます。
jobs
jobsでは具体的なワークフローの定義をしていきます。今回はUnit Test・Deployというjobがあります。
動かしてみよう
ここまで準備ができましたら、あとはpushして動かすだけです。
YMLファイルで指定したブランチにPushしてみてください!
Actionsのページで動作は確認することができます。。。。
無事うまくいった模様!!
ここにうまくいったリポジトリも公開していますのでよかったら参考にしてください!
今後行うこと
マルチチェーンに対応できるようにして、ブランチごとに各チェーン上でスマートコントラクトをデプロイできるようにする!
最後に
今回はHardhatに入っているサンプルを使ってGitHub Actionsを使ってみましたが、本来はEthereum・Polygonなどでデプロイするときは秘密鍵が必要になると思います。なので、GitHubの環境変数に秘密鍵を置くなどの処理は慎重に行ってください。くれぐれも資産が入っているWalletは開発に使わないようにしてください🙇
参考記事