Code style checking
Prerequisites:
- You will need a recent enough version of puppet-lint that supports the
--log-format
flag. Install the gem so that the Jenkins can use it. - On Jenkins, you will need the Warnings Plugin and the HTML Publisher Plugin.
- Make sure that when checking the module from your VCS, it ends up in WORKSPACE/modules/module_name.
Configuration:
Jenkins
Go to the Configure System page and find the Compiler Warnings settings. Add a new console log parser and call it puppet-lint. I use following configuration for parsing puppet-lint warnings and errors.
The warnings plugin has been updated and now has puppet-lint support out of the box! So configuring puppet-lint manually is kind of useless now.
Name:
puppet-lint
Regular Expression:
^\s*([^:]+):([0-9]+):([^:]+):([^:]+):\s*(.*)$
Mapping Script:
import hudson.plugins.warnings.parser.Warning // map regular expression to strings String fileName = matcher.group(1); String lineNumber = matcher.group(2); String kind = matcher.group(3); String check = matcher.group(4); String message = matcher.group(5); // return a Warning. return new Warning(fileName, Integer.parseInt(lineNumber), check, kind, message); |
Example Log Message:
./manifests/params.pp:25:autoloader_layout:error:apache::params not in autoload module layout |
Jenkins job configuration
We will add several build steps that will run certain actions on our puppet modules.
- Check syntax
- Check style
- Generate documentation
1. For the syntax check, I use following shell script (add a build step):
for file in $(find . -iname '*.pp'); do puppet parser validate --color false --render-as s --modulepath=modules $file || exit 1; done; |
2. For the style check, we use puppet-lint (add another build step):
find . -iname *.pp -exec puppet-lint --log-format "%{path}:%{linenumber}:%{check}:%{KIND}:%{message}" {} \; |
3. And for generating documentation:
## Cleanup old docs. [ -d doc/ ] && rm -rf doc/ ## Dummy manifests folder. ! [ -d manifests/ ] && mkdir manifests/ ## Generate docs puppet doc --mode rdoc --manifestdir manifests/ --modulepath ./modules/ --outputdir doc ## Fix docs to how I want them, I don't like that the complete workspace is included in all file paths. if [ -d ${WORKSPACE}/doc/files/${WORKSPACE}/modules ]; then mv -v "${WORKSPACE}/doc/files/${WORKSPACE}/modules" "${WORKSPACE}/doc/files/modules" fi; grep -l -R ${WORKSPACE} * | while read fname; do sed -i "s@${WORKSPACE}/@/@g" $fname; done; |
In your post build section:
- Enable Scan for compiler warnings and select puppet-lint.
- Enable publish HTML reports (use ‘doc‘, ‘index.html‘ and ‘Puppet Docs‘ as values). This will add a link to the Job page linking your generated puppet docs.
That’s about it! Any suggestions / improvements on this are always welcome!
Notes:
- I have some examples/tests setup on my Jenkins instance for testing at http://jenkins.vstone.eu. Since I use this for testing, it might be offline / broken / buggy at times.
- The scripts I use may also require some changes if you are using an older version of puppet. I’m currently using 2.7.x for testing my modules.
Pingback: Puppet Module Patterns | vStone Blog
You can introduce parallelism to the checking process using something like this:
Pingback: Puppet – Vagrant : Smarter / Better / Stronger | Don't Make the Same Mistake Twice