I use these rake tasks in Jenkins with one job per rake task. The first job must pass before triggering the second one. I then use the pipeline view to visualise this.
New task for checking erb templates for syntax issues
lunix@glenmorangie] -> rake -T | |
rake clean # Remove any temporary products. | |
rake clobber # Remove any generated file. | |
rake doc # Generate puppet documentation. | |
rake style # Check puppet module code style. | |
rake syntax # Check puppet module syntax. | |
rake erb # test erb syntax |
... | |
... | |
... | |
... | |
group :test do | |
gem 'rspec' | |
gem 'mechanize' | |
gem 'puppet-lint' | |
gem 'rake' | |
end |
# Rakefile | |
require 'rubygems' | |
require 'erb' | |
require 'open3' | |
require 'bundler' | |
Bundler.require(:rake) | |
require 'rake/clean' | |
desc "Check puppet module syntax." | |
task :syntax do | |
begin | |
require 'puppet/face' | |
rescue LoadError | |
fail 'Cannot load puppet/face, are you sure you have Puppet 2.7?' | |
end | |
def validate_manifest(file) | |
begin | |
Puppet::Face[:parser, '0.0.1'].validate(file) | |
rescue Puppet::Error => error | |
puts error.message | |
end | |
end | |
puts "Checking puppet module syntax..." | |
FileList['**/*.pp'].each do |manifest| | |
# exclude the vendor/ dir | |
next if manifest =~ /vendor/ | |
puts "Evaluating syntax for #{manifest}" | |
validate_manifest manifest | |
end | |
end | |
desc "test erb syntax" | |
task :erb do | |
FileList['**/*.erb'].each do |template| | |
# exclude the vendor/ dir | |
next if template =~ /vendor/ | |
puts "Evaluating (erb) template syntax - #{template}" | |
Open3.popen3('ruby -Ku -c') do |stdin, stdout, stderr| | |
stdin.puts(ERB.new(File.read(template), nil, '-').src) | |
stdin.close | |
if error = ((stderr.readline rescue false)) | |
puts template + error[1..-1].sub(/^[^:]*:\d+: /, '') | |
exit 1 | |
end | |
stdout.close rescue false | |
stderr.close rescue false | |
end | |
end | |
end | |
desc "Check puppet module code style." | |
task :style do | |
begin | |
require 'puppet-lint' | |
rescue LoadError | |
fail 'Cannot load puppet-lint, did you install it?' | |
end | |
puts "Checking puppet module code style..." | |
linter = PuppetLint.new | |
linter.configuration.log_format = '%{path}:%{linenumber}:%{check}:%{KIND}:%{message}' | |
linter.configuration.send("disable_80chars") | |
FileList['**/*.pp'].each do |puppet_file| | |
# exclude the vendor/ dir | |
next if puppet_file =~ /vendor/ | |
puts "Evaluating code style for #{puppet_file}" | |
linter.file = puppet_file | |
linter.run | |
end | |
fail if linter.errors? | |
end | |
#TODO: this hasn't been tested yet | |
# | |
desc "Generate documentation." | |
task :doc do |t| | |
puts "Generating puppet documentation..." | |
work_dir = File.dirname(__FILE__) | |
sh %{puppet doc \ | |
--outputdir #{work_dir}/doc \ | |
--mode rdoc \ | |
--manifestdir #{work_dir}/manifests \ | |
--modulepath #{work_dir}/modules \ | |
--manifest #{work_dir}/site.pp} | |
if File.exists? "#{work_dir}/doc/files/#{work_dir}/modules" | |
FileUtils.mv "#{work_dir}/doc/files/#{work_dir}", "#{work_dir}/doc/files" | |
end | |
Dir.glob('./**/*.*').each do |file| | |
if File.file? "#{file}" | |
sh %{sed -i "s@#{work_dir}/@/@g" "#{file}"} | |
end | |
end | |
end |