Skip to main content

Solidity and Truffle continuous integration setup

soliditysmart contractstestingtruffleganache
Intermediate
Markus Waas
soliditydeveloper.com(opens in a new tab)
June 5, 2020
4 minute read minute read

Continuous integration (CI) with Truffle is great for developing once you have a basic set of tests implemented. It allows you to run very long tests, ensure all tests pass before merging a pull request(opens in a new tab) and to keep track of various statistics using additional tools.

We will use the Truffle Metacoin Box(opens in a new tab) to setup our continuous integration. You can either choose Travis CI or Circle CI.

Setting up Travis CI

Adding Travis CI(opens in a new tab) is straight-forward. You will only need to add a .travis.yml config file to the root folder of the project:

1language: node_js
2node_js:
3 - 10
4
5cache: npm
6
7before_script:
8 - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
9
10script:
11 - npm test
Show all

We are keeping it simple for now and are only running the test script which executes the Truffle unit tests. But we have one problem, there won't be a blockchain available on the Travis CI machine. A simple fix for this is to npm install ganache-cli and simply run it before the test. You can do this by adding a bash script with the line npx ganache-cli > /dev/null and before the npx truffle test call. The full example bash script(opens in a new tab).

Setting up Circle CI

CircleCi(opens in a new tab) requires a longer config file. The additional npm ci(opens in a new tab) command is automatically done in Travis. It installs dependencies faster and more securely than npm install does. We again use the same script from the Travis version to run ganache-cli before the tests.

1version: 2
2
3aliases:
4 - &defaults
5 docker:
6 - image: circleci/node:10
7
8 - &cache_key_node_modules
9 key: v1-node_modules-{{ checksum "package-lock.json" }}
10
11jobs:
12 dependencies:
13 <<: *defaults
14 steps:
15 - checkout
16 - restore_cache:
17 <<: *cache_key_node_modules
18 - run:
19 name: Install npm dependencies
20 command: |
21 if [ ! -d node_modules ]; then
22 npm ci
23 fi
24 - persist_to_workspace:
25 root: .
26 paths:
27 - node_modules
28 - build
29 - save_cache:
30 paths:
31 - node_modules
32 <<: *cache_key_node_modules
33
34 test:
35 <<: *defaults
36 steps:
37 - checkout
38 - attach_workspace:
39 at: .
40 - run:
41 name: Unit tests
42 command: npm test
43
44workflows:
45 version: 2
46 everything:
47 jobs:
48 - dependencies
49 - test:
50 requires:
51 - dependencies
Show all

Adding the eth-gas-reporter plugin

The eth-gas-reporter plugin is quite useful for keeping track of the gas costs of your smart contract functions. Having it in your CI will further be useful for showing diffs when adding pull requests.

Step 1: Install the eth-gas-reporter plugin and codechecks

npm install --save-dev eth-gas-reporter
npm install --save-dev @codechecks/client

Step 2: Add the plugin to the mocha settings inside your truffle-config.js

See options(opens in a new tab)

1module.exports = {
2 networks: { ... },
3 mocha: {
4 reporter: 'eth-gas-reporter',
5 reporterOptions: {
6 excludeContracts: ['Migrations']
7 }
8 }
9};
Show all
Copy

Step 3: Add a codechecks.yml to your project's root directory

1checks:
2 - name: eth-gas-reporter/codechecks

Step 4: Run codechecks after the test command

- npm test
- npx codechecks

Step 5: Create a Codechecks account

That's it. You will now find a nice report about changes in gas costs of your pull request.

Example gas reports

Adding the solidity-coverage plugin

With the solidity-coverage plugin you can check how much of your code paths are covered by your tests. Adding this to your CI makes is very convenient to use once it is set up.

Step 1: Create a metacoin project and install coverage tools

npm install --save-dev truffle coveralls solidity-coverage

Step 2: Add solidity-coverage to the plugins array in truffle-config.js

1module.exports = {
2 networks: {...},
3 plugins: ["solidity-coverage"]
4}
Copy

Step 3: Add the coverage commands to the .travis.yml or Circle CI config.yml

- npx truffle run coverage
- cat coverage/lcov.info | npx coveralls

Solidity coverage starts its own ganache-cli, so we don't have to worry about this. Do not replace the regular test command though, coverage's ganache-cli works differently and is therefore no replacement for running regular unit tests.

Step 4: Add repository to coveralls

Example coverall

Further ideas

There you have it. Continuous integration is a very useful strategy for your developments. You can check out a full example at Truffle-CI-Example(opens in a new tab). Just make sure to remove Circle-CI or Travis, one is enough!

Last edit: @nhsz(opens in a new tab), August 15, 2023

Was this tutorial helpful?

Website last updated: June 19, 2024

Learn

  • Learn Hub
  • What is Ethereum?
  • What is ether (ETH)?
  • Ethereum wallets
  • What is Web3?
  • Smart contracts
  • Gas fees
  • Run a node
  • Ethereum security and scam prevention
  • Quiz Hub
  • Ethereum glossary
(opens in a new tab)(opens in a new tab)(opens in a new tab)
  • About us
  • Ethereum brand assets
  • Code of conduct
  • Jobs
  • Privacy policy
  • Terms of use
  • Cookie policy
  • Press Contact(opens in a new tab)