Configuration-as-Code
1
Jenkins Configuration-as-Code
Who are we?
Name: Ewelina Wilkosz
Work: IT Consultant @ Praqma
Previous experience: Software Developer
@ Ericsson (6 years) in Krakow
Tools I work with: Jenkins (as Code), Git, Docker
@ewelinawilkosz
@ewelinawilkosz
ewe@praqma.com
Jenkins Configuration-as-Code
Who are we?
Name: Nicolas De Loof
Work: Hacker @ CloudBees
Jenkins contributor & Docker Captain
Conference organizer and Video maker
@ndeloof
@ndeloof
ndeloof@cloudbees.com
Jenkins Configuration-as-Code
2018 is “ * as code”
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Infrastructure as Code
Environment as Code
Architecture as Code
CI/CD as Code
5
Jenkins Configuration-as-Code
Manage Jenkins as Code
6
Jenkins Configuration-as-Code
Jenkins infrastructure
7
Jenkins Configuration-as-Code
Jenkins infrastructure
Using external tools
8
Jenkins Configuration-as-Code
Jenkins infrastructure
Ansible, Chef, Puppet
Docker
9
Jenkins Configuration-as-Code
jobs configuration
10
Jenkins Configuration-as-Code
Jenkins job configuration
11
Jenkins Configuration-as-Code
JobDSL
job('gr8 example') {� scm {� github 'sheehan/job-dsl-gradle-example'� }� triggers {� scm 'H/5 * * * *'� }� steps {� gradle 'clean test'� }� publishers {� archiveJunit 'build/test-results/**/*.xml'� extendedEmail 'mr.sheehan@gmail.com'� }�}
12
Jenkins Configuration-as-Code
Jenkins master configuration
13
Jenkins Configuration-as-Code
Jenkins can be installed through native system packages, Docker, or run standalone by any machine with a Java Runtime Environment (JRE) installed...
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
… and it is manually configurable
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
And we don’t (always) like that
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
So how do we solve it?
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Jenkins system configuration
20
Jenkins Configuration-as-Code
21
Jenkins Configuration-as-Code
We’re not alone
22
Jenkins Configuration-as-Code
23
Jenkins Configuration-as-Code
& & to join forces
24
Jenkins Configuration-as-Code
Let’s make it as easy as possible
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
jenkins:� systemMessage: "JCasC Demo"
numExecutors: 1
scmCheckoutRetryCount: 4
mode: NORMAL
securityRealm:
local:
allowsSignup: false
users:
- id: demoAdmin
password: ${adminpw}
jenkins.yaml
Jenkins Configuration-as-Code
Main benefits
Jenkins Configuration-as-Code
There are challenges
28
Jenkins Configuration-as-Code
human-readable config file(s)
29
Jenkins Configuration-as-Code
Web UI as implicit documentation
Config element in web UI
==
Config element in YAML
“ No need to be a Jenkins expert to do it right” � -- Obi Wan Kenobi
30
Jenkins Configuration-as-Code
Configure Jenkins in yaml
Obvious, isn’t it ?
31
jenkins:
securityRealm:
ldap:
configurations:
- server: ldap.acme.com
rootDN: dc=acme,dc=fr
managerPasswordSecret: ${LDAP_PASSWORD}
cache:
size: 100
ttl: 10
userIdStrategy: CaseSensitive
groupIdStrategy: CaseSensitive
tool:
git:
installations:
- name: git
- path: /bin/git
Jenkins Configuration-as-Code
Configure ALL jenkins initial setup
No hand on keyboard
No click on web UI
to deploy
a fully working Jenkins master
32
Jenkins Configuration-as-Code
Support ALL plugins
(*) could require some minor changes
33
Jenkins Configuration-as-Code
Generate documentation and validation tools
34
Jenkins Configuration-as-Code
Here comes JCasC
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Where to find more information
Implementation details and guide for plugin developers available in plugin’s github repository:
https://github.com/jenkinsci/configuration-as-code-plugin
Jenkins Configuration-as-Code
DEMO
37
Jenkins Configuration-as-Code
How it works
38
Jenkins Configuration-as-Code
Live Jenkins instance
Core + plugins
Data �model
39
Jenkins Configuration-as-Code
Introspection
Jenkins-core 2.xx + plugins [ git:3.7.0, ...]
=> hierarchical data model, trying to mimic Jenkins UI
40
Jenkins Configuration-as-Code
Requirements
Target components need to follow some basic design rules
We rely on UI data binding mechanism (@DataBound)
Component to directly parse StaplerRequest / JsonObject can’t be introspected
41
Jenkins Configuration-as-Code
Doc/Schema Generation
JENKISN/plugin/configuration-as-code/
JENKINS/plugin/configuration-as-code/schema
42
Jenkins Configuration-as-Code
Corner cases
Some components hardly fit this model
For those we can develop dedicated Configurator adapter classes.
43
Jenkins Configuration-as-Code
Under the hood
44
Jenkins Configuration-as-Code
Root Elements → RootElementConfigurator
45
jenkins:
securityRealm:
ldap:
configurations:
- server: ldap.acme.com
rootDN: dc=acme,dc=fr
managerPasswordSecret: ${LDAP_PASSWORD}
cache:
size: 100
ttl: 10
userIdStrategy: CaseSensitive
groupIdStrategy: CaseSensitive
tool:
git:
installations:
- name: git
- path: /bin/git
Jenkins Configuration-as-Code
Root Element
46
Jenkins Configuration-as-Code
Child element → Attribute
47
jenkins:
securityRealm:
ldap:
configurations:
- server: ldap.acme.com
rootDN: dc=acme,dc=fr
managerPasswordSecret: ${LDAP_PASSWORD}
cache:
size: 100
ttl: 10
userIdStrategy: CaseSensitive
groupIdStrategy: CaseSensitive
Jenkins Configuration-as-Code
Attribute
Configurator do describe a target component as a set of Attributes
Attribute handle :
48
Jenkins Configuration-as-Code
Generic Attribute
writable JavaBean property | DataBound constructor parameter
public void setSecurityRealm(SecurityRealm securityRealm) {
SecurityRealm is an ExtensionPoint (abstract)
Configuration-as-Code need to identify implementation
49
jenkins:
securityRealm:
ldap:
Jenkins Configuration-as-Code
Extension point implementation
SecurityRealm is an ExtensionPoints => candidates implementations:
�LegacySecurityRealm → @Symbol(“legacy”) → legacy�HudsonPrivateSecurityRealm → @Symbol(“local”) → local�ActiveDirectorySecurityRealm → ActiveDirectory → activedirectory�LDAPSecurityRealm → LDAP → ldap
50
jenkins:
securityRealm:
ldap:
Jenkins Configuration-as-Code
Build target Component
@DataBoundConstructor public LDAPSecurityRealm(� List<LDAPConfiguration> configurations, � boolean disableMailAddressResolver,� CacheConfiguration cache, � IdStrategy userIdStrategy, � IdStrategy groupIdStrategy)
+ DataBoundSetters
51
jenkins:
securityRealm:
ldap:
configurations:
...
cache:
size: 100
ttl: 10
userIdStrategy: CaseSensitive
groupIdStrategy: CaseSensitive
Jenkins Configuration-as-Code
Corner cases
52
Jenkins Configuration-as-Code
Custom Configurator, a.k.a “Glue Code”
Sample : expose a user-friendly credentials model
53
credentials:
system:
domainCredentials:
# global credentials
- credentials:
- certificate:
scope: SYSTEM
id: ssh_private_key
password: ${SSH_KEY_PASSWORD}
keyStoreSource:
fileOnMaster:
keyStoreFile: /docker/secret/id_rsa
CredentialsRootConfigurator�custom code
A fake Attribute "system"�to expose DomainCredentials (List)
with custom setter implementation:�
target.setDomainCredentialsMap(
DomainCredentials.asMap(value)
)
Jenkins Configuration-as-Code
Status
54
Jenkins Configuration-as-Code
Features
Jenkins Configuration-as-Code
JEP-201
Make this THE configuration component for Jenkins community
https://github.com/jenkinsci/jep/blob/master/jep/201/README.adoc
56
Jenkins Configuration-as-Code
alpha
0.9-alpha released
Use Experimental Plugins Update Center to install, details here
Feedback requested (jenkins-users mailing list)
Main Target audience : early adopters & plugin maintainers
57
Jenkins Configuration-as-Code
Give it a try
Report missing plugin support / broken features
Contribute test cases (easy) or fixes (not so easy :P)
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Questions?
Jenkins Configuration-as-Code
Jenkins Configuration-as-Code
Thank you!
Jenkins Configuration-as-Code