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-reporter$ npm 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$ npm install --save-dev coveralls$ npm install --save-dev 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 の両方共必要な訳ではないので、使わない方は確実に削除してください!
最終編集者: @HiroyukiNaito(opens in a new tab), Invalid DateTime