SolidityとTruffleを使って、継続的統合を設定する
Truffleを使用した継続的統合(CI)は、基本的なテストセットを実装してあれば、非常に有益な開発環境を提供します。 非常に長期的なテストを実行できるため、プルリクエスト(opens in a new tab)をマージする事前にすべてのテストに合格したことを確認でき、追加ツールを使って様々な統計を追跡することができます。
今回は、Truffle Metacoin Box(opens in a new tab)を使用して継続的統合を設定します。 以下の内容は、Travis CIまたはCircle CIを使って実行できます。
Travis CIの設定
Travis CI(opens in a new tab)は、簡単に追加できます。 プロジェクトのルートフォルダに、.travis.yml
設定ファイルを追加するだけです。
1language: node_js2node_js:3 - 1045cache: npm67before_script:8 - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p910script:11 - npm testすべて表示
ここでは、Truffleで単体テストを実行する場合のみテストスクリプトが実行されるシンプルな状態にしておきましょう。 しかし、Travis CIマシンが利用できるブロックチェーンが存在しないという問題があります。 しかしこれは、テスト前にnpm install ganache-cli
を実行するだけで解決できます。 具体的には、ganache-cli > /dev/null
のnpxコマンドを含むBashスクリプトをnpx truffle test
の呼び出しの前に追加します。 こちら(opens in a new tab)でBashスクリプトの完全な例をご覧ください。
Circle CIの設定
CircleCi(opens in a new tab)では、より長い設定ファイルが必要になります。 Travisでは、自動でnpm ci
(opens in a new tab)コマンドが追加されます。 これにより、npmのインストール
よりも高速かつセキュアに依存関係をインストールできます。 ここでも、Travisの場合と同じスクリプトを使って、テストの前にganache-cliを実行します。
1version: 223aliases:4 - &defaults5 docker:6 - image: circleci/node:1078 - &cache_key_node_modules9 key: v1-node_modules-{{ checksum "package-lock.json" }}1011jobs:12 dependencies:13 <<: *defaults14 steps:15 - checkout16 - restore_cache:17 <<: *cache_key_node_modules18 - run:19 name: Install npm dependencies20 command: |21 if [ ! -d node_modules ]; then22 npm ci23 fi24 - persist_to_workspace:25 root: .26 paths:27 - node_modules28 - build29 - save_cache:30 paths:31 - node_modules32 <<: *cache_key_node_modules3334 test:35 <<: *defaults36 steps:37 - checkout38 - attach_workspace:39 at: .40 - run:41 name: Unit tests42 command: npm test4344workflows:45 version: 246 everything:47 jobs:48 - dependencies49 - test:50 requires:51 - dependenciesすべて表示
eth-gas-reporterプラグインを追加する
eth-gas-reporterプラグインは、スマートコントラクトの関数で発生するガス代を追跡する上でとても役立ちます。 このプラグインをCIに追加しておけば、プルリクエストを追加する際に差分を表示するためにも有益です。
ステップ1:eth-gas-reporterプラグインとcodechecksをインストールする
npm install --save-dev eth-gas-reporternpm install --save-dev @codechecks/client
ステップ2:truffle-config.jsのmocha設定で、eth-gas-reporterプラグインを追加する
設定のオプションを確認してください。(opens in a new tab)
1module.exports = {2 networks: { ... },3 mocha: {4 reporter: 'eth-gas-reporter',5 reporterOptions: {6 excludeContracts: ['Migrations']7 }8 }9};すべて表示コピー
ステップ3:プロジェクトのルートディレクトリに、codechecks.ymlを追加する
1checks:2 - name: eth-gas-reporter/codechecks
ステップ4:テストコマンドの後に、codechecksを実行する
- npm test- npx codechecks
ステップ5:Codechecksのアカウントを作成する
- Codechecks(opens in a new tab)のアカウントを作成します。
- GitHubリポジトリに追加します。
- シークレットをコピーし、
CC_SECRET=COPIED SECRET
をCIに追加します(Travisの場合はこちら(opens in a new tab)、CircleCiの場合はこちら(opens in a new tab)を参照してください)。 - プルリクエストの作成に進んでください。
以上です。 これで、プルリクエストでガス代の変化に対して素晴らしいレポートが表示されます。
solidity-coverageプラグインを追加する
solidity-coverageプラグインを使用すると、コードパスのうちテスト対象に含まれる割合がどの程度か確認できます。 CI上で設定しておくと、非常に便利になります。
ステップ1:メタコインプロジェクトを作成し、カバレッジツールをインストールします。
npm install --save-dev truffle coveralls solidity-coverage
ステップ2:truffle-config.jsのプラグイン配列に、solidity-coverageを追加します。
1module.exports = {2 networks: {...},3 plugins: ["solidity-coverage"]4}コピー
ステップ3:.travis.ymlまたはCircle CI config.ymlに、カバレッジコマンドを追加します。
- npx truffle run coverage- cat coverage/lcov.info | npx coveralls
Soidityカバレッジは、それ自体でganache-cliを開始しますので、ganache-cliをインストールする必要はありません。 ただし、カバレッジのganache-cliは動作が異なり、通常の単体テスト実行の代替とはならないため、通常のテストコマンドは置き換えないでください。
ステップ4:Coverallsにレポジトリを追加します。
- Coveralls(opens in a new tab)のアカウントを作成します。
- 作成したアカウントをGitHubリポジトリに追加します。
- プルリクエストの作成に進んでください。
追加のヒント
- MythX(opens in a new tab):MythXでは、スマートコントラクトのセキュリティを自動で分析できます。 ですから、CIに追加する(opens in a new tab)のはよいアイディアでしょう。
- Linting(opens in a new tab):Lintingツールを活用することで、ある程度まで強制的によいコードを書くことができます。 Eslint(opens in a new tab)は、JavaScriptと相性が良くセットアップが簡単(opens in a new tab)です。一方Solhint(opens in a new tab)は、Solidityで使用できます。
- 長期テスト:数百人のユーザーを対象としてコントラクトをテストするなど、ストレスが極端に大きいテストを実行したい場合もあるでしょう。 このようなテストは、長時間を要します。 テストごとに実行する代わりに、CIに追加します。
これで完了です。 開発環境において非常に有益な戦略であることが理解できたと思います。 完全な実例は、Truffle-CI-Example(opens in a new tab)で確認してください。 Circle-CIとTravisの両方共必要な訳ではないので、使わない方は確実に削除してください!
最終編集者: @nhsz(opens in a new tab), 2023年8月15日