Some time ago i've written about test-driven development, or TDD, for shell scripts using shunit2 and Travis-CI. This time i want to show you how you can further enhance your shell script testing capabilities with two useful tools for static analysis and style checking.
For anyone who has no time to read the full post, check out the Github Repo i've setup which shows you how to achieve the shellcheck and bashate integration with Travis-CI.
Getting shellcheck and bashate
I assume that you're developing with macOS, so getting shellcheck and bashate is pretty easy.
You can get both using Homebrew and pip. For pip you first need to install python with Homebrew.
brew install shellcheck
brew install python
followed by a
pip install bashate
Testing a script with both tools
This is super simple. While you've installed both via Homebrew, they're now accessible in your
$PATH variable and you can easily run them on your shell script you want to test with:
Both tools will output parts of your script with the errors or warnings they found shortly explaining the problems. Shellcheck also has so called directive id's and a wiki where you can learn more about the errors found and how you can fix them.
Integrating both tools with Travis-CI
That's also quite straight forward. Easily copy and paste the following
.travis.yml into your git's root folder and upload it to Github for example.
sudo: required dist: trusty language: bash before_install: - sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse" - sudo apt-get -qq update - sudo apt-get -t trusty-backports install shellcheck - sudo pip install bashate script: - shellcheck your-script.sh - bashate your-script.sh
Since we need to add a the trusty-backports repository and Ubuntu Trusty in Travis-CI for shellcheck, we need to add the
sudo: required parameter and
dist: trusty as well as the full
before_install part. With this we add the
trusty-backports repository so we can get shellcheck from it. Bashate is simply installed using pip, whereas python and pip are pre-installed on Ubuntu.
script: section we call both tools with the path from the repository root to the shell scripts we want to test. shellcheck will
exit 1 when it finds errors and bashate will do the same except for warnings like you can see in my example repository.
Are we done here?
Yes! You have successfully setup basic static analysis and style checking for your bash scripts using shellcheck and bashate with Travis-CI. Your build status should look like this now:
Congratulations and happy testing!