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); |
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 |
./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; |
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}" {} \; |
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; |
## 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.