View the wiki page. See presentation slides from Jenkins World 2018.
Join our Jenkins Configuration as Code office hours meeting scheduled for every second Wednesday. Use the Hangout on Air link from our Gitter chat channel. As an alternative, use the link from the invitation. See previous meeting minutes.
Setting up Jenkins is a complex process, as both Jenkins and its plugins require some tuning and configuration,
with dozens of parameters to set within the web UI manage
section.
Experienced Jenkins users rely on groovy init scripts to customize Jenkins and enforce desired state. Those scripts directly invoke Jenkins API and as such can do everything (at your own risk). But they also require you know Jenkins internals, and are confident in writing groovy scripts on top of Jenkins API.
The Configuration as Code plugin has been designed as an opinionated way to configure Jenkins based on human-readable declarative configuration files. Writing such a file should be feasible without being a Jenkins expert, just translating into code a configuration process one is used to executing in the web UI.
This plugin aims to replace above user interface based configuration with the below text based configuration.
jenkins:
securityRealm:
ldap:
configurations:
- groupMembershipStrategy:
fromUserRecord:
attributeName: "memberOf"
inhibitInferRootDN: false
rootDN: "dc=acme,dc=org"
server: "ldaps://ldap.acme.org:1636"
In addition, we want to have a well documented syntax file, and tooling to assist in writing and testing, so end users have full guidance in using this tool set and do not have to search for examples on the Internet.
First, start a Jenkins instance with the Configuration as Code plugin installed.
Second, the plugin looks for the CASC_JENKINS_CONFIG
environment variable. The variable can point to any of the following:
/var/jenkins_home/casc_configs
./var/jenkins_home/casc_configs/jenkins.yaml
.https://acme.org/jenkins.yaml
.If CASC_JENKINS_CONFIG
points to a folder, the plugin will recursively traverse the folder to find file (suffix with .yml,.yaml,.YAML,.YML), but doesn't contain hidden files or hidden subdirectories. It doesn't follow symbolic links.
If you do not set the CASC_JENKINS_CONFIG
environment variable, the plugin will
default to looking for a single config file in $JENKINS_ROOT/jenkins.yaml
.
If everything was setup correctly, you should now be able to browse the Configuration as Code page with Manage Jenkins
-> Configuration as Code
.
Prerequisites: Java, Maven & IntelliJ IDEA
Ensure Java 8 is available. There are unresolved issues with Java 10/11 as of October 24, 2018.
/usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
/usr/libexec/java_home --verbose
Matching Java Virtual Machines (3):
11.0.1, x86_64: "Java SE 11.0.1" /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
10.0.2, x86_64: "Java SE 10.0.2" /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
1.8.0_192, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home
Ensure Maven is included in the PATH environment variable.
export PATH=$PATH:/path/to/apache-maven-x.y.z/bin
Run
in the menu. Select Edit Configurations
in the menu item.Add New Configuration
(+
) in the top left of the shown dialog. Select Maven
.Parameters
tab group, Working directory:
is /path/to/configuration-as-code-plugin/plugin
.Parameters
tab group, Command line:
is hpi:run
.File
-> Preferences...
-> Build, Execution, Deployment
-> Build Tools
-> Maven
.Maven home directory:
has /path/to/apache-maven-x.y.z
value, not Bundled (Maven 3)
.plugin
child directory under the root directory of this project.export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
export PATH=$PATH:/path/to/apache-maven-x.y.z/bin
mvn hpi:run
...
INFO: Jenkins is fully up and running
When configuring the first Jenkins instance, browse the examples shown in the demos
directory of this repository. If you have a plugin that does not have an example, consult the reference
help document. Click the Documentation
link at the bottom of the Configuration as Code page.
If you want to configure a specific plugin, search the page for the name of the plugin. The page will
show you which root element belongs to the configuration. Most installed plugins belong under the unclassified
root
element.
This configuration file includes root entries for various components of your primary Jenkins installation. The jenkins
one is for the root Jenkins object, and other ones are for various global configuration elements.
jenkins:
securityRealm:
ldap:
configurations:
- groupMembershipStrategy:
fromUserRecord:
attributeName: "memberOf"
inhibitInferRootDN: false
rootDN: "dc=acme,dc=org"
server: "ldaps://ldap.acme.org:1636"
nodes:
- permanent:
name: "static-agent"
remoteFS: "/home/jenkins"
launcher:
jnlp:
slaveAgentPort: 50000
agentProtocols:
- "jnlp2"
tool:
git:
installations:
- name: git
home: /usr/local/bin/git
unclassified:
mailer:
adminAddress: admin@acme.org
replyToAddress: do-not-reply@acme.org
# Note that this does not work right now
#smtpHost: smtp.acme.org
smtpPort: 4441
credentials:
system:
domainCredentials:
credentials:
- certificate:
scope: SYSTEM
id: ssh_private_key
keyStoreSource:
fileOnMaster:
keyStoreFile: /docker/secret/id_rsa
Also see demos folder with various samples.
The configuration file format depends on the version of jenkins-core and installed plugins. Documentation is generated from a live instance, as well as a JSON schema you can use to validate configuration file with your favourite YAML tools.
Currently, you can provide initial secrets to JCasC that all rely on <key,value>
substitution of strings in the configuration. For example, Jenkins: "${some_var}"
. Default variable substitution
using the :-
operator from bash
is also available. For example, key: "${VALUE:-defaultvalue}"
will evaluate to defaultvalue
if $VALUE
is unset. To escape a string from secret interpolation, put ^
in front of the value. For example, Jenkins: "^${some_var}"
will produce the literal Jenkins: "${some_var}"
.
We can provide these initial secrets in the following ways:
/run/secrets/${KEY}
will be replaced by ${KEY}
in the configuration. The base folder /run/secrets
can be overridden by setting the environment variable SECRETS
. So this can be used as a file based secret, and not just docker secrets./run/secrets/
, and then the filename can be used as the KEY. For example:apiVersion: v1
kind: Secret
metadata:
name: secret-name
data:
filename: {{ "encoded string" | b64enc }}
can be used as:
- credentials:
- string:
id: "cred-id"
secret: ${filename}
Prerequisites:
CASC_VAULT_PW
must be present, if token is not used and appRole/Secret is not used. (Vault password.)CASC_VAULT_USER
must be present, if token is not used and appRole/Secret is not used. (Vault username.)CASC_VAULT_APPROLE
must be present, if token is not used and U/P not used. (Vault AppRole ID.)CASC_VAULT_APPROLE_SECRET
must be present, it token is not used and U/P not used. (Vault AppRole Secret ID.)CASC_VAULT_TOKEN
must be present, if U/P is not used. (Vault token.)CASC_VAULT_PATHS
must be present. (Comma separated vault key paths. For example, secret/jenkins,secret/admin
.)CASC_VAULT_URL
must be present. (Vault url, including port number.)CASC_VAULT_MOUNT
is optional. (Vault auth mount. For example, ldap
or another username & password authentication type, defaults to userpass
.)CASC_VAULT_NAMESPACE
is optional. If used, sets the Vault namespace for Enterprise Vaults.CASC_VAULT_FILE
is optional, provides a way for the other variables to be read from a file instead of environment variables.CASC_VAULT_ENGINE_VERSION
is optional. If unset, your vault path is assumed to be using kv version 2. If your vault path uses engine version 1, set this variable to 1
.auth/token/lookup-self
in order to determine its expiration time. JCasC will re-issue a token if its expiration is reached (except for CASC_VAULT_TOKEN
).If the environment variables CASC_VAULT_URL
and CASC_VAULT_PATHS
are present, JCasC will try to gather initial secrets from Vault. However for it to work properly there is a need for authentication by either the combination of CASC_VAULT_USER
and CASC_VAULT_PW
, a CASC_VAULT_TOKEN
, or the combination of CASC_VAULT_APPROLE
and CASC_VAULT_APPROLE_SECRET
. The authenticated user must have at least read access.
You can also provide a CASC_VAULT_FILE
environment variable where you load the secrets from a file.
File should be in a Java Properties format
CASC_VAULT_PW=PASSWORD
CASC_VAULT_USER=USER
CASC_VAULT_TOKEN=TOKEN
CASC_VAULT_PATHS=secret/jenkins/master,secret/admin
CASC_VAULT_URL=https://vault.dot.com
CASC_VAULT_MOUNT=ldap
A good use for CASC_VAULT_FILE
would be together with docker secrets.
version: "3.6"
services:
jenkins:
environment:
CASC_VAULT_FILE: /run/secrets/jcasc_vault
restart: always
build: .
image: jenkins.master:v1.0
ports:
- 8080:8080
- 50000:50000
volumes:
- jenkins-home:/var/jenkins_home
secrets:
- jcasc_vault
volumes:
jenkins-home:
secrets:
jcasc_vault:
file: ./secrets/jcasc_vault
TODO: Provide a Dockerfile to generate documentation from specified jenkins-core release and plugins.
We don't support installing plugins with JCasC you need to use something else for this,
Dockers users can use:
https://github.com/jenkinsci/docker/#preinstalling-plugins
Kubernetes users:
https://github.com/helm/charts/tree/master/stable/jenkins
Most plugins should be supported out-of-the-box, or maybe require some minimal changes. See this dashboard for known compatibility issues.
You have the following option to trigger a configuration reload:
via the user interface: Manage Jenkins -> Configuration -> Reload existing configuration
via http POST to JENKINS_URL/configuration-as-code/reload
Note: this needs to include a valid CRUMB and authentication information e.g. username + token of a user with admin
permissions. Since Jenkins 2.96 CRUMB is not needed for API tokens.
via Jenkins CLI
via http POST to JENKINS_URL/reload-configuration-as-code
It's disabled by default and secured via a token configured as system property casc.reload.token
.
Setting the system property enables this functionality and the requests need to include the token as
query parameter named casc-reload-token
, i.e. JENKINS_URL/reload-configuration-as-code/?casc-reload-token=32424324rdsadsa
.
curl -X POST "JENKINS_URL:8080/reload-configuration-as-code/?casc-reload-token=32424324rdsadsa"
As configuration as code is demonstrated to be a highly requested topic in Jenkins community, we have published
JEP 201 as proposal to make this a standard component
of the Jenkins project. The proposal was accepted.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型