Merge pull request #20 from batmat/fix-jep-link

Remove original JEP and point to the jenkinsci/jep repo
This commit is contained in:
Ewelina Wilkosz 2017-11-30 14:24:35 +01:00 committed by GitHub
commit f3f19f267e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 1 additions and 240 deletions

239
JEP.adoc
View File

@ -1,239 +0,0 @@
= JEP-0000: Jenkins Configuration as Code
:toc: preamble
:toclevels: 3
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]
.Metadata
[cols="2"]
|===
| JEP
| 0000
| Title
| Jenkins Configuration as Code
| Sponsor
| https://github.com/praqma[Praqma]
| Status
// Uncomment the appropriate line.
| Not Submitted :information_source:
//| Draft :speech_balloon:
//| Deferred :hourglass:
//| Accepted :ok_hand:
//| Rejected :no_entry:
//| Withdrawn :hand:
//| Final :lock:
//| Replaced :dagger:
//| Active :smile:
| Type
| Standards
| Created
| 2017-11-07
//
//
// Uncomment if there is an associated placeholder JIRA issue.
| JIRA
| https://issues.jenkins-ci.org/browse/JENKINS-31094[JENKINS-31094]
//
//
// Uncomment if there will be a BDFL delegate for this JEP.
| BDFL-Delegate
| https://github.com/ewelinawilkosz2[Ewelina Wilkosz]
//
//
// Uncomment if discussion will occur in forum other than jenkinsci-dev@ mailing list.
//| Discussions-To
//| :bulb: Link to where discussion and final status announcement will occur :bulb:
//
//
// Uncomment if this JEP depends on one or more other JEPs.
//| Requires
//| :bulb: JEP-NUMBER, JEP-NUMBER... :bulb:
//
//
// Uncomment and fill if this JEP is rendered obsolete by a later JEP
//| Superseded-By
//| :bulb: JEP-NUMBER :bulb:
//
//
// Uncomment when this JEP status is set to Accepted, Rejected or Withdrawn.
//| Resolution
//| :bulb: Link to relevant post in the jenkinsci-dev@ mailing list archives :bulb:
|===
image:logo.png[logo]
== Abstract
Jenkins installation setup require various configuration steps users have to handle on the web UI. This provide flexibility for newcomers,
but for repeated deployment, users are all looking for some way to automate things and provide a reproducible installation.
Configuration-as-Code is a DevOps practice to manage software configuration as versioned files managed in SCM, which can be tested,
discussed and validated in various environment before they actually update the production target.
Many Companies do rely on dozens or hundred Jenkins masters, and as such require some way to control their setup and initial configuration.
== Specification
=== Declarative configuration as code
We want to introduce a simple way to define Jenkins configuration from a declarative document that would be accessible even to newcomers.
Such a document should replicate the web UI user experience so the resulting structure looks natural to end user. Jenkins components have
to be identified by convention / user friendly names better than by actual implementation class name.
=== Mimic web UI
We consider web UI as a natural documentation for end-user. As they switch to configuration-as-code they will search for the labels and
model they use to see on web UI. The configuration-as-code model should follow as much as possible this model.
=== No glue-code requirement
We want configuration-as-code to apply to all jenkins components without need for dedicated glue-code. But we also want to provide some
helper code that would make some specific components easier to configure, or better reflect the web UI user experience.
=== Documentation Generation
The configuration file format has to be well documented to assist end-user in writing. This documentation has to be generated to ensure
its in sync with the actual codebase, like Pipeline DSL documentation does.
=== Validation
The configuration file should be validated without the need to actually run a Jenkins master. At same time we generate documentation we
need to generate some schema that could also be used with adequate IDE / editor to assist writing configuration.
== Motivation
=== Goals
There's various ways to manage Jenkins configuration without human interaction :
* Chef / Puppet / Ansible recipes. Some are https://github.com/jenkinsci/puppet-jenkins[maintained by Jenkins community]
* Groovy init scripts
* CLI from shell scripts
* XML templating
* custom plugins like https://github.com/jenkinsci/system-config-dsl-plugin[system-config-dsl-plugin]
* ...
All those require a deep knowledge of Jenkins internal model and/or xml storage format, to correctly invoke API methods from script or
produce adequate xml structure, while end user only knows Jenkins Web UI. Those approaches make configuration-automation a reserved
practice for advanced Jenkins users.
Configuration as Code should not be available only to advanced Jenkins users. Typically, when selecting implementation for an extension
point, a non-expert end-user don't know the actual class name to be used internally and stored in xml configuration; he just select a
label in a dropdown list. This is what we want to offer “as-code”.
=== Target Audience
We have identified two personas as target Audience :
*Ben* is system administrator in the company, managing services across all teams : LDAP, Mail, but also developers ressources like
repositories and CI servers. Bens favorite IDE is vi, hes preferred language is bash (or maybe ruby|python) and only knows Java for the
amount of memory it requires and the delay to start a JVM. So hes not a big fan of writing groovy scripts. He mostly knows Jenkins by the
UI and used to backup for whole JENKINS_HOME folder.
*Seb* is working in a startup as DevOps engineer. Hes full time working with product team as a developer and managing development process
and resources (which makes 2 full times for one guy. This is a startup I said). Seb has deployed kubernetes as general purpose
infrastructure on the Cloud and deployed a git repo and few other services for his team. A Jenkins master is running there as well. He use
to upgrade jenkins by running latest official docker image and re-using previous jenkins-home volume.
== Reasoning
Configuration as Code as a simple text file with both documentation and schema would make it possible for any Jenkins user to replicate
the configuration he use to setup by hand on web UI.
This is a major differentiator vs Groovy init scripts used by many Advanced Jenkins users, who are confident with internal APIs and Groovy
syntax. Using a basic text file format with validation make this feature available to arbitrary DevOps team without need to be familiar
with Jenkins or Groovy.
=== File format
To avoid Configuration as Code to be tied to some development community, we selected YAML as format to define Jenkins configuration.
YAML allows to :
* Have a plain text, human readable format
* Include comments to provide runnable sample configuration files
* Be language ecosystem agnostic
* Support JSON-schema validation
=== Configuration mechanism
Configuration file define a tree model. For every node we need to find the matching Jenkins component. Relying on @Symbol annotation is an
efficient way to identify components with a human friendly short name. For plugin which didnt (yet) adopted this annotation, we can rely
on some convention. A common pattern is to name an implementation class as prefix + API class name, like “LDAPSecurityRealm”. As we know
the API we are looking for implementation, we can establish a natural short name for this implementation as “ldap” and offer a Symbol-like
short name to end user for his configuration file.
+DataBoundSetters+ & +DataBoundConstructors+ offer a natural way to construct Jenkins components from a set of key=value pairs. Most
jenkins component (*) do rely on them and as such offer a 1:1 match between internal data structure and web UI configuration forms.
(*) We noticed many +Descriptor+s do rely on manual parsing of +JSONObject+. We will need to fix them
In some circumstances the Java codebase doesnt match the web UI forms and relies on some custom code for configuration. Jenkins root
object is such a component. For those, we need to provide some dedicated configuration adapter code. Some plugins might need We have
identified credentials-plugin as such a component.
=== Documentation / Schema generation
As configuration-as-code mechanism relies on DataBound mechanism we can construct a full data model from a live jenkins instance, and
produce documentation. We also can include help tips from various inputs as additional guidance to end-user reading the doc.
The same way we generate documentation we can generate a JSON-schema to validate a configuration file without need to run a jenkins master
for acceptance.
=== (Im)mutability
Depending the audience, some want to use configuration-as-code to generate a working Jenkins master with some initial configuration, but
let the actual administrator make changes. Such use case is mostly looking for “recipe for a new jenkins master”.
Others want configuration-as-code to fully control the master, and be able to apply updates. Comparable to Chef/Puppet/Ansible management.
Both use cases can be supported (as well as a mix of both).
The former just using the configuration-as-code mechanism for initial setup.
The later would apply the configuration when updates are detected on file. It could benefit some way to lock down configuration for
components configured by the configuration-as-code mechanism to be read-only on web UI.
== Backwards Compatibility
Configuration-as-Code is intended to run as an additional Jenkins component (most probably: a plugin) and not require dedicated extension
integrated in Jenkins-core nor specific API implemented by plugins. We only require them to follow some convention in the way they expose
configuration attributes (i.e +DataBoundSetter|Constructor+)
== Security
N/A
== Infrastructure Requirements
N/A
== Testing
We will provide a set of configuration samples for various popular plugins, both as documentation for newcomers and for acceptance of the
implementation.
== Reference Implementation
https://github.com/jenkinsci/configuration-as-code-plugin
== References
This topic was initially discussed on https://issues.jenkins-ci.org/browse/JENKINS-31094[JENKINS-31094].

View File

@ -2,7 +2,7 @@
![logo](logo.png)
read [JEP proposal](JEP.adoc) for details
read [JEP proposal](https://github.com/jenkinsci/jep/tree/master/jep/201) for details
## Supported plugins