When using Jenkins in any environment, it’s useful to have variables related to that environment available to Jenkins jobs. I recently worked on a project where I used puppet to deploy global environment variables to Jenkins for use with AWS commands — typically to execute the awscli, one must have knowledge of the region, account, and other items.
In order to make global environment variables available to Jenkins, we can create an init.groovy.d directory in $JENKINS_HOME, as part of the Jenkins puppet profile, ie:
class profile::jenkins::install () { ... file { '/var/lib/jenkins/init.groovy.d': ensure => directory, owner => jenkins, group => jenkins, mode => '0755', } ... }
We then need to create the puppet template (epp) that we will deploy to this location, as a groovy script:
import jenkins.model.Jenkins import hudson.slaves.EnvironmentVariablesNodeProperty import hudson.slaves.NodeProperty def instance = Jenkins.instance def environment_property = new EnvironmentVariablesNodeProperty(); for (property in environment_property) { property.envVars.put("AWS_VARIABLE1", "<%= @ec2_tag_variable1 -%>") property.envVars.put("AWS_VARIABLE2", "<%= @ec2_tag_variable2 -%>") property.envVars.put("AWS_VARIABLE3", "<%= @ec2_tag_variable3 -%>") } instance.nodeProperties.add(environment_property) instance.save()
Note that in this instance, I am using the ec2tagfacts puppet module that allows me to use EC2 tags as facts in puppet. I will later move to dynamic fact enumeration using a script with facter.
The next step is to add another file resource to the Jenkins puppet profile to place the groovy script in the proper location and restart the Jenkins Service:
class profile::jenkins::install () { ... file { '/var/lib/jenkins/init.groovy.d/aws-variables.groovy': ensure => present, mode => '0755', owner => jenkins, group => jenkins, notify => Service['jenkins'], content => template('jenkins/aws-variables.groovy.epp'), } ... }
Now when puppet next runs, this will deploy the groovy script and restart Jenkins to take effect.
Note that these environment variables are not viewable under System Information under Manage Jenkins, but are only available inside each Jenkins job, ie inside a shell build section:
#!/bin/bash -x echo "${AWS_VARIABLE1}"
Leave a Reply