The final profile code
After all of this refactoring (and a few more minor adjustments), here’s the final code
for profile::jenkins::controller
.
# /etc/puppetlabs/code/environments/production/site/profile/manifests/jenkins/controller.pp # Class: profile::jenkins::controller # # Install a Jenkins controller that meets Puppet's internal needs. # class profile::jenkins::controller ( Boolean $backups_enabled = false, Boolean $manage_plugins = false, Boolean $ssl = false, Optional[String[1]] $site_alias = undef, Variant[String[1], Boolean] $direct_download = 'http://pkg.jenkins-ci.org/debian-stable/binary/jenkins_1.642.2_all.deb', Optional[String[1]] $jenkins_logs_to_syslog = undef, Boolean $install_jenkins_java = true, ) { # We rely on virtual resources that are ultimately declared by profile::server. include profile::server # Deploy the SSL certificate/chain/key for sites on this domain. include profile::ssl::delivery_wildcard # Some default values that vary by OS: include profile::jenkins::params $jenkins_owner = $profile::jenkins::params::jenkins_owner $jenkins_group = $profile::jenkins::params::jenkins_group $controller_config_dir = $profile::jenkins::params::controller_config_dir if $manage_plugins { # About 40 jenkins::plugin resources: include profile::jenkins::controller::plugins } motd::register { 'Jenkins CI controller (profile::jenkins::controller)': } # This adds the site_alias to the message of the day for convenience when # logging into a server via FQDN. Because of the way motd::register works, we # need a sort of funny formatting to put it at the end (order => 25) and to # list a class so there isn't a random "--" at the end of the message. if $site_alias { motd::register { 'jenkins-site-alias': content => @("END"), profile::jenkins::controller::proxy Jenkins site alias: ${site_alias} |-END order => 25, } } # This is a "private" profile that sets up an Nginx proxy -- it's only ever # declared in this class, and it would work identically pasted inline. # But because it's long, this class reads more cleanly with it separated out. class { 'profile::jenkins::controller::proxy': site_alias => $site_alias, require_ssl => $ssl, } # Sensitive info (like SSH keys) isn't checked into version control like the # rest of our modules; instead, it's served from a custom mount point on a # designated server. $secure_server = lookup('puppetlabs::ssl::secure_server') # Dependencies: # - Pull in apt if we're on Debian. # - Pull in the 'git' package, used by Jenkins for Git polling. # - Manage the 'run' directory (fix for busted Jenkins packaging). if $::osfamily == 'Debian' { include apt } package { 'git': ensure => present, } file { '/var/run/jenkins': ensure => 'directory' } # Because our account::user class manages the '${controller_config_dir}' directory # as the 'jenkins' user's homedir (as it should), we need to manage # `${controller_config_dir}/plugins` here to prevent the upstream # rtyler-jenkins module from trying to manage the homedir as the config # dir. For more info, see the upstream module's `manifests/plugin.pp` # manifest. file { "${controller_config_dir}/plugins": ensure => directory, owner => $jenkins_owner, group => $jenkins_group, mode => '0755', require => [Group[$jenkins_group], User[$jenkins_owner]], } Account::User <| tag == 'jenkins' |> class { 'jenkins': lts => true, repo => true, direct_download => $direct_download, version => 'latest', service_enable => true, service_ensure => running, configure_firewall => false, install_java => $install_jenkins_java, manage_user => false, manage_group => false, manage_datadirs => false, } # When not using the jenkins module's java version, install java8. unless $install_jenkins_java { include profile::jenkins::usage::java8 } # Manage the heap size on the controller, in MB. if($::memorysize_mb =~ Number and $::memorysize_mb > 8192) { # anything over 8GB we should keep max 4GB for OS and others $heap = sprintf('%.0f', $::memorysize_mb - 4096) } else { # This is calculated as 50% of the total memory. $heap = sprintf('%.0f', $::memorysize_mb * 0.5) } # Set java params, like heap min and max sizes. See # https://wiki.jenkins-ci.org/display/JENKINS/Features+controlled+by+system+properties jenkins::sysconfig { 'JAVA_ARGS': value => "-Xms${heap}m -Xmx${heap}m -Djava.awt.headless=true -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Dhudson.model.DirectoryBrowserSupport.CSP=\\\"default-src 'self'; img-src 'self'; style-src 'self';\\\"", } # Forward jenkins controller logs to syslog. # When set to facility.level the jenkins_log uses that value instead of a # separate log file, for example daemon.info if $jenkins_logs_to_syslog { jenkins::sysconfig { 'JENKINS_LOG': value => "$jenkins_logs_to_syslog", } } # Deploy the SSH keys that Jenkins needs to manage its agent machines and # access Git repos. file { "${controller_config_dir}/.ssh": ensure => directory, owner => $jenkins_owner, group => $jenkins_group, mode => '0700', } file { "${controller_config_dir}/.ssh/id_rsa": ensure => file, owner => $jenkins_owner, group => $jenkins_group, mode => '0600', source => "puppet://${secure_server}/secure/delivery/id_rsa-jenkins", } file { "${controller_config_dir}/.ssh/id_rsa.pub": ensure => file, owner => $jenkins_owner, group => $jenkins_group, mode => '0640', source => "puppet://${secure_server}/secure/delivery/id_rsa-jenkins.pub", } # Back up Jenkins' data. if $backups_enabled { backup::job { "jenkins-data-${::hostname}": files => $controller_config_dir, } } # (QENG-1829) Logrotate rules: # Jenkins' default logrotate config retains too much data: by default, it # rotates jenkins.log weekly and retains the last 52 weeks of logs. # Considering we almost never look at the logs, let's rotate them daily # and discard after 7 days to reduce disk usage. logrotate::job { 'jenkins': log => '/var/log/jenkins/jenkins.log', options => [ 'daily', 'copytruncate', 'missingok', 'rotate 7', 'compress', 'delaycompress', 'notifempty' ], } }