From 2bd70fc957735af03d43b7a7989454b4e15cff3c Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Mon, 21 Nov 2016 19:31:50 -0800 Subject: [PATCH 01/22] Move the chapter sub-sections up above the chapter overview page's ToC This makes things look a bit nicer IMHO and allows for more suitable synopsis/overview pages to be authored on each chapter.adoc page --- content/_layouts/chapter.html.haml | 24 +++++++++++++++--------- content/css/jenkins.css | 2 ++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/content/_layouts/chapter.html.haml b/content/_layouts/chapter.html.haml index 95b69ea0a12d..d379d6ba8bdd 100644 --- a/content/_layouts/chapter.html.haml +++ b/content/_layouts/chapter.html.haml @@ -34,20 +34,26 @@ layout: default %a.next.page-link{:href => File.join('..', next_chapter.key)} #{next_chapter.title} ⇒ + + .section %h1 = page.title - = content - if chapter.sections && chapter.sections.size > 0 - %h2 - Sub-sections - - %ul - - chapter.sections.each do |section| - %li - %a{:href => section.key} - = section.title + #subsections + .toc + #toc-title + Chapter Sub-Sections + %ul + - chapter.sections.each do |section| + %li + %a{:href => section.key} + = section.title + + + = content + .section_nav.pagination-links - if previous_chapter diff --git a/content/css/jenkins.css b/content/css/jenkins.css index 531e043e704a..af8b072b23f2 100644 --- a/content/css/jenkins.css +++ b/content/css/jenkins.css @@ -1345,8 +1345,10 @@ blockquote { background-color: #f9f9f9; border-left: 1px solid #c9c9c9; float: right; + width: 10rem; margin-left: 15px; padding: 10px; + clear: right; } .toc li li { From a77a969b7cd97b20dfbea4bfcc1d68b691a9dcea Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 09:33:18 -0800 Subject: [PATCH 02/22] Add a glossary section as a future home for terms Right now the [glossary] tag doesn't generate anchors, so these might need to be sections :( --- content/doc/book/book.yml | 1 + content/doc/book/glossary/chapter.yml | 2 ++ content/doc/book/glossary/index.adoc | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 content/doc/book/glossary/chapter.yml create mode 100644 content/doc/book/glossary/index.adoc diff --git a/content/doc/book/book.yml b/content/doc/book/book.yml index 652f6fbcd147..1dda74109e03 100644 --- a/content/doc/book/book.yml +++ b/content/doc/book/book.yml @@ -9,3 +9,4 @@ chapters: - operating - scaling - appendix + - glossary diff --git a/content/doc/book/glossary/chapter.yml b/content/doc/book/glossary/chapter.yml new file mode 100644 index 000000000000..ffedc6ea38d3 --- /dev/null +++ b/content/doc/book/glossary/chapter.yml @@ -0,0 +1,2 @@ +--- +sections: diff --git a/content/doc/book/glossary/index.adoc b/content/doc/book/glossary/index.adoc new file mode 100644 index 000000000000..859878011cb1 --- /dev/null +++ b/content/doc/book/glossary/index.adoc @@ -0,0 +1,19 @@ +--- +layout: chapter +--- +:description: +:author: +:email: jenkinsci-users@googlegroups.com +:sectanchors: +:toc: left +:notitle: + +[glossary] += Glossary + + +[glossary] + +Freestyle Job:: + A Freestyle Job + From e34e22bcc8db15f8b5e5865f50a0a92ba8564a56 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 09:33:49 -0800 Subject: [PATCH 03/22] Update the Pipeline chapter index page to more succinctly state what Pipeline is Now with more Jenkinsfile! --- content/doc/book/pipeline/index.adoc | 67 +++++++++++++++++----------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index ce1c3c4b3670..6e9b20b2a445 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -6,43 +6,60 @@ layout: chapter :author: :email: jenkinsci-users@googlegroups.com :sectanchors: -:toc: left +:toc: = Pipeline -This chapter will cover all aspects of the Jenkins Pipeline, from running pipeline jobs -to writing your own pipeline code. +This chapter will cover all aspects of Jenkins Pipeline, from running pipeline jobs +to writing your own pipeline code, and even extending Pipeline. This chapter is intended to be used by Jenkins users of all skill levels, but beginners may need to refer to some sections of "<>" to understand some topics covered in this chapter. -The sections are ordered from simpler to progressively more complex subjects. -The earlier sections are intended for those new to pipeline or unfamiliar with its -latest features. The later sections with discuss expert-level considerations -and corner-cases. - If you are not yet familiar with basic Jenkins terminology and features, start with <>. -If you are already familiar with Jenkins basics and would like to delve deeper -into generally how to use various features, see -<>. -If you are a Jenkins administrator and want to know more about managing Jenkins nodes and instances, see -<>. +== What is Pipeline? + +Jenkins Pipeline is a suite of plugins which support building continuous +delivery pipelines "natively" in Jenkins. While Jenkins has always allowed +rudimentary forms of chaining Freestyle Jobs together to perform sequential +tasks or actions, +footnote:[Additional plugins have been used to implement complex behaviors +utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, +and Promoted Builds plugins], +Jenkins Pipeline provides an integrated and extensible set of tools for modeling +simple-to-complex delivery pipelines "as code" via the Pipeline DSL. +footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Domain-Specific Language]] + +Typically, this "Pipeline as Code" would be implemented in a `Jenkinsfile` and +checked into source control, for example: + +.Jenkinsfile +[source, groovy] +---- +node { // <1> + stage('Build') { // <2> + sh 'make' // <3> + } -If you are a system administrator and want learn how to back-up, restore, maintain as Jenkins servers and nodes, see -<>. + stage('Test') { + sh 'make check' + junit 'reports/**/*.xml' // <4> + } + stage('Deploy') { + sh 'make publish' + } +} +---- +<1> `node` indicates that Jenkins should allocate an executor and workspace for +this part of the pipeline. +<2> `stage` describes a stage of this pipeline. +<3> `sh` executes the given shell command +<4> `junit` is a pipeline "step" provided by the +link:https://plugins.jenkins.io/junit[JUnit plugin] +for aggregating test reports. -[WARNING] -==== -*To Contributors*: -This chapter functions as a continuation of "<>" -and "<>", but the format will be slightly different - see the description above. -The first sections should lead users through the basics of pipeline, and later sections can switch to -feature reference for experienced users. All sections should still -be written and ordered to only assume knowledge from "Getting Started", "Using Jenkins", or -from previous sections in this chapter. -==== From d120a23d0cf0cb2475bab70599a9b6f999104adc Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 10:31:19 -0800 Subject: [PATCH 04/22] Add some clarification on how casing for Pipeline vs. pipeline should work --- STYLEGUIDE.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/STYLEGUIDE.adoc b/STYLEGUIDE.adoc index 5096150da9ce..22bb7bb247b6 100644 --- a/STYLEGUIDE.adoc +++ b/STYLEGUIDE.adoc @@ -13,6 +13,10 @@ CAUTION: This document is still a work in progress. Mixing of these terms is incorrect +NOTE: When referring to a Jenkins Pipeline via short-hand ("Pipeline"), it +should always be title-cased. When referring to a conceptual pipeline +("continuous delivery pipeline"), it it should always be lower-cased. + == Syntax/Formatting From 35935375db062153905215018600b5635e5835f8 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 10:37:28 -0800 Subject: [PATCH 05/22] Move the definition of Pipeline terms to the chapter index page This commit also rewords and corrects a lot of technical errors in the previous definitions of the terms. --- content/doc/book/pipeline/index.adoc | 65 ++++++++++++++++++++++--- content/doc/book/pipeline/overview.adoc | 34 ------------- 2 files changed, 58 insertions(+), 41 deletions(-) diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 6e9b20b2a445..80dd16a84e49 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -8,6 +8,22 @@ layout: chapter :sectanchors: :toc: +//// +NOTE: The sections are ordered from simpler to progressively more complex +subjects. The earlier sections are intended for those new to pipeline or +unfamiliar with its latest features. The later sections with discuss +expert-level considerations and corner-cases. + +This chapter functions as a continuation of "Getting Started with Jenkins" and +"Using Jenkins" , but the format will be slightly different - see the +description above. The first sections should lead users through the basics of +pipeline, and later sections can switch to feature reference for experienced +users. All sections should still be written and ordered to only assume +knowledge from "Getting Started", "Using Jenkins", or from previous sections in +this chapter. +//// + + = Pipeline This chapter will cover all aspects of Jenkins Pipeline, from running pipeline jobs @@ -20,7 +36,7 @@ to understand some topics covered in this chapter. If you are not yet familiar with basic Jenkins terminology and features, start with <>. - +[[overview]] == What is Pipeline? Jenkins Pipeline is a suite of plugins which support building continuous @@ -34,8 +50,8 @@ Jenkins Pipeline provides an integrated and extensible set of tools for modeling simple-to-complex delivery pipelines "as code" via the Pipeline DSL. footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Domain-Specific Language]] -Typically, this "Pipeline as Code" would be implemented in a `Jenkinsfile` and -checked into source control, for example: +Typically, this "Pipeline as Code" would be written to a `Jenkinsfile` and +checked into a project's source control repository, for example: .Jenkinsfile [source, groovy] @@ -55,11 +71,46 @@ node { // <1> } } ---- -<1> `node` indicates that Jenkins should allocate an executor and workspace for -this part of the pipeline. -<2> `stage` describes a stage of this pipeline. +<1> <> indicates that Jenkins should allocate an executor and workspace for +this part of the Pipeline. +<2> <> describes a stage of this Pipeline. <3> `sh` executes the given shell command -<4> `junit` is a pipeline "step" provided by the +<4> `junit` is a Pipeline <> provided by the link:https://plugins.jenkins.io/junit[JUnit plugin] for aggregating test reports. +[[terms]] +== Pipeline Terms + +[[step]] +Step:: + A single task, fundamentally steps tell Jenkins _what_ to do. For example, in + order to instruct Jenkins to execute the shell command `make`, the `sh` + step would be used: `sh 'make'`. + When a plugin extends to Pipeline DSL, that typically means the plugin has + implemented a new _step_. + +[[node]] +Node:: + Generally speaking, all _work_ which is done by a Pipeline, will be done in + the context of a single, or multiple, `node` step declarations, which does two things: + . Schedules the steps contained within the block to run by adding an item + to the Jenkins queue. As soon as an executor is free on a node, the + steps will run. + . Creates a workspace, a directory specific to that particular + Pipeline, where files can be checked out from source control and work can + be done. + +CAUTION: Depending on your Jenkins configuration, some workspaces may not get +automatically cleaned up after a period of inactivity. See tickets and +discussion linked from +https://issues.jenkins-ci.org/browse/JENKINS-2111[JENKINS-2111] +for more information. + +[[stage]] +Stage:: + A "stage" is a step for defining a conceptually distinct subset of the + entire Pipeline, for example: "Build", "Test", and "Deploy". While stages + no bearing on the execution of the Pipeline, they are used by many plugins + which visualize or present Jenkins Pipeline status/progress. + footnoteref:[blueocean,link:/projects/blueocean[Blue Ocean], link:https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin[Pipeline Stage View plugin]] diff --git a/content/doc/book/pipeline/overview.adoc b/content/doc/book/pipeline/overview.adoc index 7e5c7b9ba2a8..9d23a61bcc57 100644 --- a/content/doc/book/pipeline/overview.adoc +++ b/content/doc/book/pipeline/overview.adoc @@ -52,40 +52,6 @@ complex tasks according to parameters that you establish. Once created, pipelines can build code and orchestrate the work required to drive applications from commit to delivery. -== Pipeline Vocabulary - -Pipeline terms such as "step," "node," and "stage" are a subset of the vocabulary used for Jenkins in general. - -Step:: - A "step" (often called a "build step") is a single task that is part of sequence. Steps tell Jenkins what to do. - -Node:: - In pipeline coding contexts, a "node" is a step that does two things, typically by enlisting help from available executors on agents: - * Schedules the steps contained within it to run by adding them to the Jenkins build queue (so that as soon as an executor slot is free on a node, the appropriate steps run). - * Creates a workspace, meaning a file directory specific to a particular job, where resource-intensive processing can occur without negatively impacting your pipeline performance. Workspaces created by node are automatically removed after all the steps contained inside the node declaration finish executing. - It is a best practice to do all material work, such as building or running shell scripts, within nodes, because node blocks in a stage tell Jenkins that the steps within them are resource-intensive enough to be scheduled, request help from the agent pool, and lock a workspace only as long as they need it. - -In Jenkins generally, "node" also means any computer that is part of your Jenkins installation, whether that computer is used as a master or as an agent. - -Stage:: - A "stage" is a logically distinct part of the execution of any task, with parameters for locking, ordering, and labeling its part of a process relative to other parts of the same process. Pipeline syntax is often comprised of stages. Each stage step can have one or more build steps within it. - It is a best practice to work within stages because they help with organization by lending logical divisions to a pipelines, and because the - Jenkins Pipeline visualization feature displays stages as unique segments of the pipeline. - -Familiarity with Jenkins terms such as "master," "agent," and "executor" also helps with understanding how pipelines work. These terms are not specific to pipelines: - -* master - A "master" is the computer where the Jenkins server is installed and - running; it handles tasks for your build system. Pipeline scripts are parsed - on masters, where Groovy code runs and node blocks allocate executors and - workspaces for use by any nested steps (such as `sh`) that might request one or both. -* agent - An "agent" (formerly "slave") is a computer set up to offload - available projects from the master. Your configuration determines the number - and scope of operations that an agent can perform. Operations are performed by - executors. -* executor - An "executor" is a computational resource for running builds or - Pipeline steps. It can run on master or agent machines, either by itself or in - parallel with other executors. - == Preparing Jenkins to Run Pipelines To run pipelines, you need to have a Jenkins instance that is set up with the From 4da7a3c97aede7962231305543249f68233f9310 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 13:41:03 -0800 Subject: [PATCH 06/22] Flesh out a more suitable "Why Pipeline" section for the Pipeline chapter index page --- .../{overview.adoc => getting-started.adoc} | 0 content/doc/book/pipeline/index.adoc | 57 ++++++++++++++++--- 2 files changed, 48 insertions(+), 9 deletions(-) rename content/doc/book/pipeline/{overview.adoc => getting-started.adoc} (100%) diff --git a/content/doc/book/pipeline/overview.adoc b/content/doc/book/pipeline/getting-started.adoc similarity index 100% rename from content/doc/book/pipeline/overview.adoc rename to content/doc/book/pipeline/getting-started.adoc diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 80dd16a84e49..133ecb4e5aff 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -39,15 +39,10 @@ If you are not yet familiar with basic Jenkins terminology and features, start w [[overview]] == What is Pipeline? -Jenkins Pipeline is a suite of plugins which support building continuous -delivery pipelines "natively" in Jenkins. While Jenkins has always allowed -rudimentary forms of chaining Freestyle Jobs together to perform sequential -tasks or actions, -footnote:[Additional plugins have been used to implement complex behaviors -utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, -and Promoted Builds plugins], -Jenkins Pipeline provides an integrated and extensible set of tools for modeling -simple-to-complex delivery pipelines "as code" via the Pipeline DSL. +Jenkins Pipeline is a suite of plugins which supports implementing and +integrating continuous delivery pipelines into Jenkins Pipeline provides an +extensible set of tools for modeling simple-to-complex delivery pipelines "as +code" via the Pipeline DSL. footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Domain-Specific Language]] Typically, this "Pipeline as Code" would be written to a `Jenkinsfile` and @@ -79,6 +74,50 @@ this part of the Pipeline. link:https://plugins.jenkins.io/junit[JUnit plugin] for aggregating test reports. +[[why]] +== Why Pipeline? + +Jenkins is, fundamentally, an automation engine which supports a number of +automation patterns. Pipeline adds a powerful set of automation tools onto +Jenkins, supporting use-cases that span from simple continuous integration to +comprehensive continuous delivery pipelines. By modeling a series of related +tasks, users can take advantage of the many features of Pipeline: + +* *Code*: Pipelines are implemented "as code," and typically checked into + source control, giving teams the abilit to edit, review, and iterate upon + their delivery pipeline. +* *Durable*: Pipelines can survive both planned, and unplanned, restarts of the + Jenkins master. +* *Pausable*: Pipelines can optionally stop and wait for human input or approval + before continuing the Pipeline run. +* *Versatile*: Pipelines support complex real-world continuous delivery + requirements, including the ability to fork/join, loop, and perform work in + parallel. +* *Extensible*: The Pipeline plugin supports custom extensions to its DSL + footnoteref:[dsl] + and multiple options for integration with other plugins. + + +While Jenkins has always allowed rudimentary forms of chaining Freestyle Jobs +together to perform sequential tasks, +footnote:[Additional plugins have been used to implement complex behaviors +utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, +and Promoted Builds plugins] +Pipeline makes this concept a first-class citizen in Jenkins. + +Building on the core Jenkins value of extensibility, Pipeline is also +extensible both by users with <> +and by plugin developers. +footnoteref:[ghof,link:https://plugins.jenkins.io/github-organization-folder[GitHub +Organization Folder plugin]] + + +The flowchart below is an example of one continuous delivery scenario easily +modeled in Jenkins Pipeline: + +image::/images/pipeline/realworld-pipeline-flow.png[title="Pipeline Flow", 800] + + [[terms]] == Pipeline Terms From 5ea2afc4a90bcda737445e2d4bdc499242668f83 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 13:41:41 -0800 Subject: [PATCH 07/22] "Overview" => "Getting Started" which more accurately captures that section's purpose --- content/doc/book/pipeline/chapter.yml | 2 +- .../doc/book/pipeline/getting-started.adoc | 35 ++----------------- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/content/doc/book/pipeline/chapter.yml b/content/doc/book/pipeline/chapter.yml index a9c17b078264..fbd41501056c 100644 --- a/content/doc/book/pipeline/chapter.yml +++ b/content/doc/book/pipeline/chapter.yml @@ -1,4 +1,4 @@ --- sections: - - overview + - getting-started - jenkinsfile diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index 9d23a61bcc57..930dc679a552 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -6,40 +6,9 @@ layout: section :author: :email: jenkinsci-users@googlegroups.com :sectanchors: -:toc: left +:toc: -= Overview - -== Audience and Purpose - -This document is intended for novice users of the Jenkins pipeline feature. The -document explains what a pipeline is, why that matters, and how to create the -different kinds of pipelines. - -== Why Pipeline? - -While standard Jenkins "freestyle" jobs support simple continuous integration by -allowing you to define sequential tasks in an application lifecycle, they do not -create a record of execution that persists through any planned or unplanned -restarts, enable one script to address all the steps in a complex workflow, or -confer the other advantages of pipelines. - -In contrast to freestyle jobs, pipelines enable you to define the whole -application lifecycle. Pipeline functionality helps Jenkins to support -continuous delivery (CD). The Pipeline plugin was built with requirements for a -flexible, extensible, and script-based CD workflow capability in mind. - -Accordingly, pipeline functionality is: - -* Durable: Pipelines can survive both planned and unplanned restarts of your Jenkins master. -* Pausable: Pipelines can optionally stop and wait for human input or approval before completing the jobs for which they were built. -* Versatile: Pipelines support complex real-world CD requirements, including the ability to fork or join, loop, and work in parallel with each other. -* Extensible: The Pipeline plugin supports custom extensions to its DSL (domain scripting language) and multiple options for integration with other plugins. - - -The flowchart below is an example of one continuous delivery scenario enabled by the Pipeline plugin: - -image::/images/pipeline/realworld-pipeline-flow.png[title="Pipeline Flow", 800] += Getting Started == Pipeline Defined From e5b82b108f36b805206407250dde2d96f60a60dd Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 22 Nov 2016 13:42:57 -0800 Subject: [PATCH 08/22] Add a place-holder subsection for covering Pipeline Shared Libraries --- content/doc/book/pipeline/chapter.yml | 1 + content/doc/book/pipeline/shared-libraries.adoc | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 content/doc/book/pipeline/shared-libraries.adoc diff --git a/content/doc/book/pipeline/chapter.yml b/content/doc/book/pipeline/chapter.yml index fbd41501056c..693b8020c0fe 100644 --- a/content/doc/book/pipeline/chapter.yml +++ b/content/doc/book/pipeline/chapter.yml @@ -2,3 +2,4 @@ sections: - getting-started - jenkinsfile + - shared-libraries diff --git a/content/doc/book/pipeline/shared-libraries.adoc b/content/doc/book/pipeline/shared-libraries.adoc new file mode 100644 index 000000000000..62571101fd17 --- /dev/null +++ b/content/doc/book/pipeline/shared-libraries.adoc @@ -0,0 +1,14 @@ +--- +layout: section +--- +:notitle: +:description: +:author: +:email: jenkinsci-users@googlegroups.com +:sectanchors: +:toc: + += Shared Libraries + + +NOTE: This section is still under construction From 1ff5d6b0e556f73223c6c3c39245e1b16ff08df4 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Tue, 29 Nov 2016 16:20:07 -0800 Subject: [PATCH 09/22] Gutting and reworking the entire Getting Started sub-section --- .../doc/book/pipeline/getting-started.adoc | 289 ++++++------------ content/doc/book/pipeline/index.adoc | 4 +- 2 files changed, 102 insertions(+), 191 deletions(-) diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index 930dc679a552..ec78b6a12b22 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -26,10 +26,11 @@ from commit to delivery. To run pipelines, you need to have a Jenkins instance that is set up with the appropriate plugins. This requires: -* Jenkins 1.642.3 or later (Jenkins 2 is recommended) -* The Pipeline plugin +* Jenkins 2.x or later (older versions back to 1.642.3 will work but are not + recommended) +* Pipeline plugin -=== Installing the Pipeline Plugin +=== Installing Pipeline The Pipeline plugin is installed in the same way as other Jenkins plugins. Installing the Pipeline plugin also installs the suite of related plugins on @@ -37,101 +38,13 @@ which it depends: . Open Jenkins in your web browser. . On the Manage Jenkins page for your installation, navigate to *Manage Plugins*. -. Find https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin[Pipeline] from among the plugins listed on the Available tab (You can do this by scrolling through the plugin list or by using "Pipeline" as a term to filter results). +. Find https://plugins.jenkins.io/workflow-aggregator[Pipeline] from the plugins listed on the Available tab (You can do this by scrolling through the plugin list or by using "Pipeline" as a term to filter results). . Select the checkbox for Pipeline plugin. . Select either *Install without restart* or *Download now and install after restart*. . Restart Jenkins. -=== Pipeline Plugin Context -The Pipeline plugin works with a suite of related plugins that enhance the -pipeline functionality of your Jenkins setup. The related plugins typically -introduce additional pipeline syntax or visualizations. - -For example, the table below, while not comprehensive, describes a few -pipeline-related plugins in terms of their importance to pipeline functionality -(required, recommended, or optional). - -To get the basic pipeline functionality, you only need to install the main -Pipeline plugin, but recommended plugins add additional capabilities that you -will probably want. For example, it is a best practice to develop pipelines as code by storing a `Jenkinsfile` with pipeline script in your SCM, -so that you can apply the same version control and testing to pipelines as you do to your other software, and that is why the -Multibranch Pipeline plugin is recommended. - -Optional plugins are mainly useful if you are creating pipelines that are -related to the technologies that they support. - - -[options="header"] -|======================= -|Plugin Name |Description |Status -|Pipeline (workflow-aggregator) | Installs the core pipeline engine and its dependent plugins: -Pipeline: API, -Pipeline: Basic Steps, -Pipeline: Durable Task Step, -Pipeline: Execution Support, -Pipeline: Global Shared Library for CPS pipeline, -Pipeline: Groovy CPS Execution, -Pipeline: Job, -Pipeline: SCM Step, -Pipeline: Step API -| required - -| Pipeline: Stage View -| Provides a graphical swimlane view of pipeline stage execution, as well as a build history of the stages -| recommended - -| Multibranch Pipeline -| Adds "Multibranch Pipeline" item type which enables Jenkins to automatically -build branches that contain a `Jenkinsfile` -| recommended - -| GitHub Branch Source -| Adds GitHub Organization Folder item type and adds "GitHub" as a branch source on Multibranch pipelines -| recommended for teams hosting repositories in GitHub - -| Bitbucket Branch Source -| Adds Bitbucket Team item type and adds "Bitbucket" as a branch source on Multibranch pipelines -| recommended for teams hosting repositories in Bitbucket; best with Bitbucket Server 4.0 or later. - -| Docker Pipeline -| Enables pipeline to build and use Docker containers inside pipeline scripts. -| optional - -|======================= - - -=== More Information - -As with any Jenkins plugin, you can install the Pipeline plugin using the Plugin -Manager in a running Jenkins instance. - -To explore Pipeline without installing -Jenkins separately or accessing your production system, you can run a -link:https://github.com/jenkinsci/workflow-aggregator-plugin/blob/master/demo/README.md[Docker -demo] of Pipeline functionality. - -Pipeline-related plugins are regularly "whitelisted" as compatible with or -designed for Pipeline usage. For more information, see the -link:https://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md[Plugin -Compatibility With Pipeline] web page. - -When you get flows from source control through `Jenkinsfile` or a link:https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md[Pipeline Global Library], -you may also have to whitelist method calls in the link:https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin[Script Security Plugin]. - -[NOTE] -==== -Several plugins available in the Jenkins ecosystem but not actually -related to the Pipeline feature set described in this guide also use the terms -"pipeline," "DSL," and "Job DSL" in their names. For example: - -* Build Pipeline plugin - provides a way to execute Jenkins jobs sequentially -* Build Flow Plugin - introduces a job type that lets you define an orchestration process as a script. - -This guide describes the link:https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin[Pipeline Plugin] that supports the current Pipeline feature set. -==== - -== Approaches to Defining Pipeline Script +== Defining Pipeline Script You can create pipelines in either of the following ways: @@ -142,7 +55,6 @@ You can create pipelines in either of the following ways: ==== When you use a Jenkinsfile, it is a best practice to put #!groovy at the top of the file so that IDEs and GitHub diffs detect the Groovy language properly. - ==== == Creating a Simple Pipeline @@ -178,15 +90,15 @@ considers inherently safe. ==== To use pathnames that include spaces, bracket those pathnames between escaped double quotes using \". The extra quotation marks ensure that any spaces in pathnames are parsed properly. - ==== The following example shows a successful build of a pipeline created with a one-line script that uses the `echo` step to output the phrase, "Hello from Pipeline": -[source,groovy] +[pipeline] ---- +// Script // node { echo 'Hello from Pipeline' } @@ -213,12 +125,20 @@ can be loaded into Jenkins using the *Pipeline script from SCM* option. It is a best practice to use parallel steps whenever you can, as long as you remember not to attempt so much parallel processing that it swamps the number of available executors. For example, you can acquire a node within the parallel branches of your pipeline: -[source,groovy] +[pipeline] ---- -parallel 'integration-tests':{ - node('mvn-3.3'){} -}, 'functional-tests':{ - node('selenium'){} +// Script // +node { + parallel 'integration-tests' : { + node('mvn-3.3') { + /* run Maven-based integration tests */ + } + }, + 'functional-tests' : { + node('selenium') { + /* run selenium */ + } + } } ---- @@ -342,7 +262,7 @@ a starting point, perhaps deleting any optional parameters that you do not need. To access information about steps marked with the help icon (question mark), click on that icon. -== Basic Groovy Syntax for Pipeline Configuration +== Basic Syntax for Pipeline Script You typically add functionality to a new pipeline by performing the following tasks: @@ -354,23 +274,21 @@ pipeline and click *Configure*. If you run Jenkins on Linux or another Unix-like operating system with a Git repository that you want to test, for example, you can do that with syntax like -the following, substituting your own name for "joe-user": +the following, substituting your own name for `jglick`: -[source, groovy] +[pipeline] ---- - node { - git url: 'https://github.com/joe_user/simple-maven-project-with-tests.git' - def mvnHome = tool 'M3' - sh "${mvnHome}/bin/mvn -B verify" - } +// Script // +node { + git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' + def mvnHome = tool 'M3' + sh "${mvnHome}/bin/mvn -B verify" +} ---- -In Windows environments, you would use `bat` in place of `sh` and you might -use backslashes as the file separator where needed (backslashes need to be -escaped inside strings). - -For example, rather than: +In Windows environments, you would use `bat` in place of `sh`, for example, +rather than: [source, groovy] ---- @@ -381,20 +299,44 @@ you would use: [source, groovy] ---- -bat "${mvnHome}\\bin\\mvn -B verify" +bat "${mvnHome}/bin/mvn -B verify" ---- -However, it's really only DOS that requires backslashes as path separators. Windows -can work with backslashes, but it does not require them. Therefore, the same paths -using forward slashes should work fine on Windows using the `bat` function. - Your Groovy pipeline script can include functions, conditional tests, loops, try/catch/finally blocks, and so on. Sample syntax for one node in a Java environment that is using the open source Maven build automation tool (note the definition for `mvnHome`) is shown below: -image::/images/pipeline/pipeline-sample.png[title="Pipeline Sample", 800] + +[pipeline] +---- +// Script // +node('remote') { + git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' + + def mvnHome = tool 'M3' // <1> + def v = version() + + if (v) { + echo "Building version ${v}" + } + + sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" + + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + junit '**/target/surefire-reports/TEST-*.xml' +} + +/** Parse the pom.xml for the version number */ +def version() { + def matcher = readFile('pom.xml') =~ '(.+)' + if (matcher) { + return matcher[0][1] + } + return null +} +---- Pipeline Sample (graphic) key: @@ -406,8 +348,6 @@ Pipeline Sample (graphic) key: * `readFile` step loads a text file from the workspace and returns its content (Note: Do not use `java.io.File` methods, these refer to files on the master where Jenkins is running, not files in the current workspace). -* The `writeFile` step saves content to a text file in the workspace -* The `fileExists` step checks whether a file exists without loading it. The tool step makes sure a tool with the given name is installed on the current node. The script needs to know where it was installed, so the tool can be run @@ -426,7 +366,7 @@ def mvnHome = tool 'M3' This ensures that 'M3' is installed somewhere accessible to Jenkins and assigns the return value of the step (an installation path) to the `mvnHome` variable. -== Advanced Groovy Syntax for Pipeline Configuration +== Advanced Syntax for Pipeline Script Groovy lets you omit parentheses around function arguments. The named-parameter syntax is also a shorthand for creating a map, which in Groovy uses the syntax @@ -439,62 +379,61 @@ git([url: 'https://github.com/joe_user/simple-maven-project-with-tests.git', bra ---- For convenience, when calling steps taking only one parameter (or only one -mandatory parameter), you can omit the parameter name. For example: - +mandatory parameter), you can omit the parameter name. For example, the +following two lines are functionally equivalent: [source, groovy] ---- -sh 'echo hello' +sh 'echo hello' /* short form */ +sh([script: 'echo hello']) /* long form */ ---- -is really shorthand for: +=== Working with the Environment -[source, groovy] ----- -sh([script: 'echo hello']) ----- +Jenkins Pipeline exposes environment variables via the global variable `env`, +which is available from anywhere within a `Jenkinsfile`. The full list of +environment variables accessible from within Jenkins Pipeline is documented at +link:http://localhost:8080/pipeline-syntax/globals#env[localhost:8080/pipeline-syntax/globals#env], +assuming a Jenkins master is running on `localhost:8080`, and includes: -=== Managing the Environment +BUILD_ID:: The current build ID, identical to BUILD_NUMBER for builds created in Jenkins versions 1.597+ +JOB_NAME:: Name of the project of this build, such as "foo" or "foo/bar". +JENKINS_URL:: Full URL of Jenkins, such as http://example.com:port/jenkins/ (NOTE: only available if Jenkins URL set in "System Configuration") -One way to use tools by default is to add them to your executable path using the -special variable `env` that is defined for all pipelines: -[source, groovy] + +Referencing or using these environment variables can be accomplished like +accessing any key in a Groovy +link:http://groovy-lang.org/syntax.html#_maps[Map], +for example: + +[pipeline] ---- +// Script // node { - git url: 'https://github.com/joe_user/simple-maven-project-with-tests.git' - def mvnHome = tool 'M3' - env.PATH = "${mvnHome}/bin:${env.PATH}" - sh 'mvn -B verify' + echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}" } ---- -* Properties of this variable are environment variables on the current node. -* You can override certain environment variables, and the overrides are seen by - subsequent `sh` steps (or anything else that pays attention to environment variables). -* You can run `mvn` without a fully-qualified path. -Setting a variable such as `PATH` in this way is only safe if you are using a -single agent for this build. Alternatively, you can use the `withEnv` step to -set a variable within a scope: +==== Setting environment variables +Setting an environment variable within a Jenkins Pipeline can be done with the +`withEnv` step, which allows overriding specified environment variables for a +given block of Pipeline Script, for example: -[source, groovy] +[pipeline] ---- +// Script // node { - git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' + /* .. snip .. */ withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) { sh 'mvn -B verify' } } ---- -Jenkins defines some environment variables by default: - -*Example:* `env.BUILD_TAG` can be used to get a tag like 'jenkins-projname-1' from -Groovy code, or `$BUILD_TAG` can be used from a `sh` script. The Snippet Generator -help for the `withEnv` step has more detail on this topic. === Build Parameters @@ -502,36 +441,9 @@ If you configured your pipeline to accept parameters using the *Build with Parameters* option, those parameters are accessible as Groovy variables of the same name. -=== Types of Executors - -Every Pipeline build runs on a Jenkins master using a *flyweight executor*, -which is an uncounted (because it's a temporary rather than configured) slot. Flyweight executors -require very little computing power. A flyweight executor (sometimes also called -a flyweight task) represents Groovy script, which is idle as it waits for a step to complete. - -To highlight the contrast between executor types, some Jenkins documentation calls any regular executor a *heavyweight executor*. - -When you run a `node` step, an executor is allocated on a node, which is usually an agent, as soon as -an appropriate node is available. - -It is a best practice to avoid placing `input` within a node. The input element pauses pipeline execution to wait for either automatic or manual approval. -By design and by nature, approval can take some time, so placing `input` within a node wastes resources by tying up both the flyweight executor -used for input and the regular executor used by the node block, which will not be free for other tasks until input is complete. - -Although any flyweight executor running a pipeline is hidden when the pipeline script is idle (between tasks), the *Build Executor Status* widget on the Jenkins page displays status for both types of executors. If the -one available executor on an agent has been pressed into service by a pipeline build that is paused and -you start a second build of the same pipeline, both builds are shown running on the master, but the -second build displays in the Build Queue until the initial build completes and executors are free to help with further processing. - -When you use inputs, it is a best practice to wrap them in timeouts. Wrapping inputs in timeouts allows them to be cleaned up if -approvals do not occur within a given window. For example: - -[source, groovy] ----- -timeout(time:5, unit:'DAYS') { - input message:'Approve deployment?', submitter: 'it-ops' -} ----- +///// +TODO: Expand this section with more examples +///// === Recording Test Results and Artifacts @@ -541,12 +453,11 @@ capture the `.jar` that you built. The following sample code for a node shows ho (As previously seen in examples from this guide, Maven is being used as a build tool): -[source, groovy] +[pipeline] ---- +// Script // node { - git 'https://github.com/joe_user/simple-maven-project-with-tests.git' - def mvnHome = tool 'M3' - sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" + /* .. snip .. */ archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true junit '**/target/surefire-reports/TEST-*.xml' } @@ -556,5 +467,5 @@ node { The “snippet generator” can be used to see the exact format.) * If tests fail, the Pipeline is marked unstable (as denoted by a yellow ball in - the Jenkins UI), and you can browse "Test Result Trend" to see the relevant history. -* You should see Last Successful Artifacts on the Pipeline index page. + the Jenkins Web UI), and you can browse "Test Result Trend" to see the relevant history. +* You should see Last Successful Artifacts on the Pipeline's main page. diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 133ecb4e5aff..5bfa6d365076 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -48,9 +48,9 @@ footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Dom Typically, this "Pipeline as Code" would be written to a `Jenkinsfile` and checked into a project's source control repository, for example: -.Jenkinsfile -[source, groovy] +[pipeline] ---- +// Script // node { // <1> stage('Build') { // <2> sh 'make' // <3> From a80610bb36001627b0919e4816d1e76b65c30fab Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 30 Nov 2016 08:31:49 -0800 Subject: [PATCH 10/22] Add the Advanced section for the Pipeline chapter to house some content for now --- content/doc/book/pipeline/advanced.adoc | 11 +++++++++++ content/doc/book/pipeline/chapter.yml | 1 + 2 files changed, 12 insertions(+) create mode 100644 content/doc/book/pipeline/advanced.adoc diff --git a/content/doc/book/pipeline/advanced.adoc b/content/doc/book/pipeline/advanced.adoc new file mode 100644 index 000000000000..185c9cebd709 --- /dev/null +++ b/content/doc/book/pipeline/advanced.adoc @@ -0,0 +1,11 @@ +--- +layout: section +--- +:notitle: +:description: +:author: +:email: jenkinsci-users@googlegroups.com +:sectanchors: +:toc: + += Advanced Topics diff --git a/content/doc/book/pipeline/chapter.yml b/content/doc/book/pipeline/chapter.yml index 693b8020c0fe..30356c3d57e3 100644 --- a/content/doc/book/pipeline/chapter.yml +++ b/content/doc/book/pipeline/chapter.yml @@ -3,3 +3,4 @@ sections: - getting-started - jenkinsfile - shared-libraries + - advanced From 2ee31a9e9cb7b7dfa9e2c36fbe259ce399b142f3 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 30 Nov 2016 14:52:23 -0800 Subject: [PATCH 11/22] Move some multibranch content out into its own section --- content/doc/book/pipeline/chapter.yml | 1 + content/doc/book/pipeline/multibranch.adoc | 63 ++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 content/doc/book/pipeline/multibranch.adoc diff --git a/content/doc/book/pipeline/chapter.yml b/content/doc/book/pipeline/chapter.yml index 30356c3d57e3..ac72b3e7a0ba 100644 --- a/content/doc/book/pipeline/chapter.yml +++ b/content/doc/book/pipeline/chapter.yml @@ -2,5 +2,6 @@ sections: - getting-started - jenkinsfile + - multibranch - shared-libraries - advanced diff --git a/content/doc/book/pipeline/multibranch.adoc b/content/doc/book/pipeline/multibranch.adoc new file mode 100644 index 000000000000..4ddc572158b7 --- /dev/null +++ b/content/doc/book/pipeline/multibranch.adoc @@ -0,0 +1,63 @@ +--- +layout: section +--- +:notitle: +:description: +:author: +:email: jenkinsci-docs@googlegroups.com +:sectanchors: +:toc: + += Multibranch Pipelines + +The *Multibranch Pipeline* project type enables you to configure different jobs +for different branches of the same project. In a multibranch pipeline +configuration, Jenkins automatically discovers, manages, and executes jobs +for multiple source repositories and branches. This eliminates the need for +manual job creation and management, as would otherwise be necessary +when, for example, a developer adds a new feature to an existing +product. + +A multibranch pipeline project always includes a 'Jenkinsfile' in its +repository root. Jenkins automatically creates a sub-project for each branch +that it finds in a repository with a `Jenkinsfile`. + +Multibranch pipelines use the same version control as the rest of your software +development process. This "pipeline as code" approach has the following +advantages: + +* You can modify pipeline code without special editing permissions. +* Finding out who changed what and why no longer depends on whether developers remember to comment their code changes in configuration files. +* Version control makes the history of changes to code readily apparent. + +To create a Multibranch Pipeline: + +. Click New Item on your Jenkins home page, enter a name for your job, select Multibranch Pipeline, and click OK. +. Configure your SCM source (options include Git, GitHub, Mercurial, Subversion, and Bitbucket), supplying information about the owner, scan credentials, and repository in appropriate fields. + For example, if you select Git as the branch source, you are prompted for the usual connection information, but then rather than enter a fixed refspec (Git's name for a source/destination pair), you would enter a branch name pattern (Use default settings to look for any branch). +. Configure the other multibranch pipeline options: + * API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise + * Checkout credentials - alternate credentials to use when checking out the code (cloning) + * Include branches - a regular expression to specify branches to include + * Exclude branches - a regular expression to specify branches to exclude; note that this will takes precedence over the contents of include expressions +. Save your configuration. + +Jenkins automatically scans the designated repository and creates appropriate branches. + +For example (again in Git), if you started with a master branch, and then wanted +to experiment with some changes, and so did `git checkout -b newfeature` and +pushed some commits, Jenkins would automatically detect the new branch in your +repository and create a new sub-project for it. That sub-project would have its +own build history unrelated to the trunk (main line). + +If you choose, you can ask for the sub-project to be automatically removed after +its branch is merged with the main line and deleted. To change your Pipeline +script—for example, to add a new Jenkins publisher step corresponding to new +reports that your `Makefile`/`pom.xml`/etc. is creating—you edit the appropriate +`Jenkinsfile`. Your Pipeline script is always synchronized with +the rest of the source code you are working on. + +*Multibranch Pipeline* projects expose the name of the branch being built with +the `BRANCH_NAME` environment variable. In multibranch pipelines, the `checkout +scm` step checks out the specific commit that the `Jenkinsfile` originated, so +as to maintain branch integrity. From 4301473c8f8e56d5a52d4b7ba4a7504dbf456757 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 30 Nov 2016 14:52:58 -0800 Subject: [PATCH 12/22] Finish up the first-finalish-draft of the Pipeline > Getting Started section --- STYLEGUIDE.adoc | 8 + content/doc/book/pipeline/advanced.adoc | 150 +++++- .../doc/book/pipeline/getting-started.adoc | 503 +++++------------- content/doc/book/pipeline/index.adoc | 2 +- content/doc/book/pipeline/jenkinsfile.adoc | 220 +++++++- .../doc/book/resources/pipeline/build-now.png | Bin 0 -> 23901 bytes .../pipeline/hello-world-console-output.png | Bin 0 -> 16365 bytes .../resources/pipeline/hello-world-script.png | Bin 0 -> 17205 bytes .../resources/pipeline/new-item-creation.png | Bin 0 -> 77508 bytes .../resources/pipeline/new-item-selection.png | Bin 0 -> 19950 bytes .../pipeline/pipeline-syntax-sidebar.png | Bin 0 -> 24878 bytes .../resources/pipeline/snippet-generator.png | Bin 0 -> 12073 bytes 12 files changed, 507 insertions(+), 376 deletions(-) create mode 100644 content/doc/book/resources/pipeline/build-now.png create mode 100644 content/doc/book/resources/pipeline/hello-world-console-output.png create mode 100644 content/doc/book/resources/pipeline/hello-world-script.png create mode 100644 content/doc/book/resources/pipeline/new-item-creation.png create mode 100644 content/doc/book/resources/pipeline/new-item-selection.png create mode 100644 content/doc/book/resources/pipeline/pipeline-syntax-sidebar.png create mode 100644 content/doc/book/resources/pipeline/snippet-generator.png diff --git a/STYLEGUIDE.adoc b/STYLEGUIDE.adoc index 22bb7bb247b6..2844eb18ac1b 100644 --- a/STYLEGUIDE.adoc +++ b/STYLEGUIDE.adoc @@ -114,6 +114,14 @@ By default, all of these use the class name as label, but that can be customized javadoc:hudson.scm.SCM#all()[a list of all known SCM implementations] ---- +== Handbook Style Guide + +* With sections that are related/build onto each other. THere should be a + reasonable "intro" or preamble at the beginning of one chapter section and a + reasonable "outtro" at the end, to provide continuity between the documents + + + == Assorted comments * Prefer "for example" over "e.g." which can be more clear to non-native english diff --git a/content/doc/book/pipeline/advanced.adoc b/content/doc/book/pipeline/advanced.adoc index 185c9cebd709..a7d30fbf99a1 100644 --- a/content/doc/book/pipeline/advanced.adoc +++ b/content/doc/book/pipeline/advanced.adoc @@ -4,8 +4,156 @@ layout: section :notitle: :description: :author: -:email: jenkinsci-users@googlegroups.com +:email: jenkinsci-docs@googlegroups.com :sectanchors: :toc: = Advanced Topics + +//// +XXX: This section needs to be gutted and reworked + +01:01 < bitwiseman> rtyler: executors - reading that section it seems like in mixes a number of differ ideas. 1) An implementation detail (Flyweight executors), 2) An naming convention + that I question the need for ("Heavyweight" executors), 3) Best practice guidance about where to use or not use the "input" step (not inside a node block), 4) a + discussion of why you'll see +01:01 < bitwiseman> builds running on master even if you don't have any executors available on master (because of Flyweight executors). I think I'd keep a section on the "input" in the + getting started, with a warning block about not using it inside a node block, and a link out to "advanced" or "best practices. #4 might go somewhere as a note block + in getting started or +01:01 < bitwiseman> might not. The rest should certainly go elsewhere. +01:06 < bitwiseman> rtyler: yeah, and that "Pipeline Plugin Context" and the "More information" that follows it, go elsewhere. As should multibranch and loading from SCM. +//// + +=== Types of Executors + +Every Pipeline build runs on a Jenkins master using a *flyweight executor*, +which is an uncounted (because it's a temporary rather than configured) slot. +Flyweight executors require very little computing power. A flyweight executor +(sometimes also called a flyweight task) represents Groovy script, which is +idle as it waits for a step to complete. + +To highlight the contrast between executor types, some Jenkins documentation +calls any regular executor a *heavyweight executor*. + +When you run a `node` step, an executor is allocated on a node, which is +usually an agent, as soon as an appropriate node is available. + +It is a best practice to avoid placing `input` within a node. The input element +pauses pipeline execution to wait for either automatic or manual approval. +By design and by nature, approval can take some time, so placing `input` within +a node wastes resources by tying up both the flyweight executor used for input +and the regular executor used by the node block, which will not be free for +other tasks until input is complete. + +Although any flyweight executor running a pipeline is hidden when the pipeline +script is idle (between tasks), the *Build Executor Status* widget on the +Jenkins page displays status for both types of executors. If the one available +executor on an agent has been pressed into service by a pipeline build that is +paused and you start a second build of the same pipeline, both builds are shown +running on the master, but the second build displays in the Build Queue until +the initial build completes and executors are free to help with further +processing. + +When you use inputs, it is a best practice to wrap them in timeouts. Wrapping +inputs in timeouts allows them to be cleaned up if approvals do not occur +within a given window. For example: + +[source, groovy] +---- +timeout(time:5, unit:'DAYS') { + input message:'Approve deployment?', submitter: 'it-ops' +} +---- + +//// +XXX: This section needs to be gutted and reworked +//// + +=== Pipeline Plugin Context + +The Pipeline plugin works with a suite of related plugins that enhance the +pipeline functionality of your Jenkins setup. The related plugins typically +introduce additional pipeline syntax or visualizations. + +For example, the table below, while not comprehensive, describes a few +pipeline-related plugins in terms of their importance to pipeline functionality +(required, recommended, or optional). + +To get the basic pipeline functionality, you only need to install the main +Pipeline plugin, but recommended plugins add additional capabilities that you +will probably want. For example, it is a best practice to develop pipelines as code by storing a `Jenkinsfile` with pipeline script in your SCM, +so that you can apply the same version control and testing to pipelines as you do to your other software, and that is why the +Multibranch Pipeline plugin is recommended. + +Optional plugins are mainly useful if you are creating pipelines that are +related to the technologies that they support. + + +[options="header"] +|======================= +|Plugin Name |Description |Status +|Pipeline (workflow-aggregator) | Installs the core pipeline engine and its dependent plugins: +Pipeline: API, +Pipeline: Basic Steps, +Pipeline: Durable Task Step, +Pipeline: Execution Support, +Pipeline: Global Shared Library for CPS pipeline, +Pipeline: Groovy CPS Execution, +Pipeline: Job, +Pipeline: SCM Step, +Pipeline: Step API +| required + +| Pipeline: Stage View +| Provides a graphical swimlane view of pipeline stage execution, as well as a build history of the stages +| recommended + +| Multibranch Pipeline +| Adds "Multibranch Pipeline" item type which enables Jenkins to automatically +build branches that contain a `Jenkinsfile` +| recommended + +| GitHub Branch Source +| Adds GitHub Organization Folder item type and adds "GitHub" as a branch source on Multibranch pipelines +| recommended for teams hosting repositories in GitHub + +| Bitbucket Branch Source +| Adds Bitbucket Team item type and adds "Bitbucket" as a branch source on Multibranch pipelines +| recommended for teams hosting repositories in Bitbucket; best with Bitbucket Server 4.0 or later. + +| Docker Pipeline +| Enables pipeline to build and use Docker containers inside pipeline scripts. +| optional + +|======================= + + +=== More Information + +As with any Jenkins plugin, you can install the Pipeline plugin using the Plugin +Manager in a running Jenkins instance. + +To explore Pipeline without installing +Jenkins separately or accessing your production system, you can run a +link:https://github.com/jenkinsci/workflow-aggregator-plugin/blob/master/demo/README.md[Docker +demo] of Pipeline functionality. + +Pipeline-related plugins are regularly "whitelisted" as compatible with or +designed for Pipeline usage. For more information, see the +link:https://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md[Plugin +Compatibility With Pipeline] web page. + +When you get flows from source control through `Jenkinsfile` or a link:https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md[Pipeline Global Library], +you may also have to whitelist method calls in the link:https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin[Script Security Plugin]. + +[NOTE] +==== +Several plugins available in the Jenkins ecosystem but not actually +related to the Pipeline feature set described in this guide also use the terms +"pipeline," "DSL," and "Job DSL" in their names. For example: + +* Build Pipeline plugin - provides a way to execute Jenkins jobs sequentially +* Build Flow Plugin - introduces a job type that lets you define an orchestration process as a script. + +This guide describes the link:https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin[Pipeline Plugin] that supports the current Pipeline feature set. +==== + diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index ec78b6a12b22..ec9618253cae 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -4,199 +4,107 @@ layout: section :notitle: :description: :author: -:email: jenkinsci-users@googlegroups.com +:email: jenkinsci-docs@googlegroups.com :sectanchors: :toc: +:imagesdir: /doc/book/resources/pipeline +:hide-uri-scheme: = Getting Started -== Pipeline Defined +Jenkins Pipeline is a suite of plugins which supports implementing and +integrating continuous delivery pipelines into Jenkins. Pipeline provides an +extensible set of tools for modeling simple-to-complex delivery pipelines "as +code" via the Pipeline DSL. +footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Domain-Specific Language]] -Pipelines are Jenkins jobs enabled by the Pipeline (formerly called "workflow") -plugin and built with simple text scripts that use a Pipeline DSL -(domain-specific language) based on the Groovy programming language. +This section will introduce some of the key concepts to Jenkins Pipeline and +help introduce the basics of defining and working with Pipelines inside of a +running Jenkins instance. -Pipelines leverage the power of multiple steps to execute both simple and -complex tasks according to parameters that you establish. Once created, -pipelines can build code and orchestrate the work required to drive applications -from commit to delivery. +== Prerequisites -== Preparing Jenkins to Run Pipelines +To use Jenkins Pipeline, you will need: -To run pipelines, you need to have a Jenkins instance that is set up with the -appropriate plugins. This requires: - -* Jenkins 2.x or later (older versions back to 1.642.3 will work but are not +* Jenkins 2.x or later (older versions back to 1.642.3 may work but are not recommended) * Pipeline plugin +footnoteref:[pipeline, link:https://plugins.jenkins.io/workflow-aggregator[Pipeline plugin]] -=== Installing Pipeline +To learn how to install and manage plugins, consult <<../managing/plugins#, Managing Plugins>>. -The Pipeline plugin is installed in the same way as other Jenkins plugins. -Installing the Pipeline plugin also installs the suite of related plugins on -which it depends: +== Defining a Pipeline -. Open Jenkins in your web browser. -. On the Manage Jenkins page for your installation, navigate to *Manage Plugins*. -. Find https://plugins.jenkins.io/workflow-aggregator[Pipeline] from the plugins listed on the Available tab (You can do this by scrolling through the plugin list or by using "Pipeline" as a term to filter results). -. Select the checkbox for Pipeline plugin. -. Select either *Install without restart* or *Download now and install after restart*. -. Restart Jenkins. +Pipeline Script is written in +link:http://groovy-lang.org/[Groovy]. +The relevant bits of +link:http://groovy-lang.org/semantics.html[Groovy syntax] +will be introduced as necessary in this document, so while an understanding of +Groovy is helpful, it is not required to use Pipeline Script. +A basic Pipeline can be created in either of the following ways: -== Defining Pipeline Script +* By entering a script directly in the Jenkins web UI. +* By creating a `Jenkinsfile` which can be checked into a project's source + control repository. -You can create pipelines in either of the following ways: +The syntax for defining a Pipeline with either approach is the same, but while +Jenkins supports entering Pipeline Script directly into the web UI, it's +generally considered best practice to define the Pipeline in a `Jenkinsfile` +which Jenkins can then load directly from source control. +footnoteref:[scm, https://en.wikipedia.org/wiki/Source_control_management] -* Through script entered in the configuration page of the web interface for your Jenkins instance. -* Through a `Jenkinsfile` that you create with a text editor and then check into your project's source control repository, where it can be accessed when you select the *Pipeline Script from SCM* option while configuring the Pipeline in Jenkins. -[NOTE] -==== -When you use a Jenkinsfile, it is a best practice to put #!groovy at the top of the file so that IDEs and -GitHub diffs detect the Groovy language properly. -==== +=== Defining a Pipeline in the Web UI -== Creating a Simple Pipeline +To create a basic Pipeline in the Jenkins web UI, follow these steps: -Initial pipeline usage typically involves the following tasks: +* Click *New Item* on Jenkins home page. -. Downloading and installing the Pipeline plugin (Unless it is already part of your Jenkins installation) -. Creating a Pipeline of a specific type -. Configuring your Pipeline -. Controlling flow (workflow) through your Pipeline -. Scaling your Pipeline +image::new-item-selection.png["Click *New Item* on the Jenkins home page", role=center] -To create a simple pipeline from the Jenkins interface, perform the following steps: +* Enter a name for your Pipeline, select *Pipeline* and click *OK*. -. Click *New Item* on your Jenkins home page, enter a name for your (pipeline) job, select *Pipeline*, and click *OK*. -. In the Script text area of the configuration screen, enter your pipeline script. If you are new to pipeline creation, you might want to start by opening Snippet Generator and selecting the "Hello Word" snippet. -. Check the Use Groovy Sandbox option below the Script text area. -. Click *Save*. -. Click *Build Now* to create the pipeline. -. Click ▾ and select *Console Output* to see the output. +[CAUTION] +==== +Jenkins uses the name of the Pipeline to create directories on disk. Pipeline +names which include spaces may uncover bugs in scripts which do not expect +paths to contain spaces. +==== +image::new-item-creation.png["Enter a name, select *Pipeline*, and click *OK*", role=center] -Pipelines are written as Groovy scripts that tell Jenkins what to do when they -are run. Relevant bits of syntax are introduced as needed, so while an -understanding of Groovy is helpful, it is not required to use Pipeline. -If you are a Jenkins administrator (in other words, authorized to approve your -own scripts), sandboxing is optional but efficient, because it lets scripts run -without approval as long as they limit themselves to operations that Jenkins -considers inherently safe. -[NOTE] -==== -To use pathnames that include spaces, bracket those pathnames between escaped double quotes using \". -The extra quotation marks ensure that any spaces in pathnames are parsed properly. -==== +* In the *Script* text-area, enter a Pipeline script and click *Save*. -The following example shows a successful build of a pipeline created with a -one-line script that uses the `echo` step to output the phrase, "Hello from -Pipeline": +image::hello-world-script.png["In the *Script* text-area, enter a Pipeline script and click Save", role=center] -[pipeline] ----- -// Script // -node { - echo 'Hello from Pipeline' -} ----- +* Click *Build Now* to run the Pipeline. ----- -Started by user anonymous -[Pipeline] echo -Hello from Pipeline -[Pipeline] End of Pipeline -Finished: SUCCESS ----- +image::build-now.png["Click *Build Now* to run the Pipeline", role=center] -[NOTE] -==== -You can also create complex and multibranch pipelines in the script entry -area of the Jenkins configuration page, but because they contain multiple stages -and the configuration page UI provides limited scripting space, pipeline -creation is more commonly done using an editor of your choice from which scripts -can be loaded into Jenkins using the *Pipeline script from SCM* option. -==== +* Click *#1* under "Build History" and then click *Console Output* to see the + full output from the Pipeline. + +image::hello-world-console-output.png["Click *Console Output* for the Pipeline", role=center] -It is a best practice to use parallel steps whenever you can, as long as you remember not to attempt so much parallel processing -that it swamps the number of available executors. For example, you can acquire a node within the parallel branches of your pipeline: +The example above shows a successful run of a basic Pipeline created in the Jenkins +web UI, using two valuable steps. [pipeline] ---- // Script // -node { - parallel 'integration-tests' : { - node('mvn-3.3') { - /* run Maven-based integration tests */ - } - }, - 'functional-tests' : { - node('selenium') { - /* run selenium */ - } - } +node { // <1> + echo 'Hello World' // <2> } ---- +<1> `node` allocates an executor and workspace on the Jenkins cluster. +<2> `echo` writes simple string in the Console Output. + -== Creating Multibranch Pipelines - -The *Multibranch Pipeline* project type enables you to configure different jobs -for different branches of the same project. In a multibranch pipeline -configuration, Jenkins automatically discovers, manages, and executes jobs -for multiple source repositories and branches. This eliminates the need for -manual job creation and management, as would otherwise be necessary -when, for example, a developer adds a new feature to an existing -product. - -A multibranch pipeline project always includes a 'Jenkinsfile' in its -repository root. Jenkins automatically creates a sub-project for each branch -that it finds in a repository with a `Jenkinsfile`. - -Multibranch pipelines use the same version control as the rest of your software -development process. This "pipeline as code" approach has the following -advantages: - -* You can modify pipeline code without special editing permissions. -* Finding out who changed what and why no longer depends on whether developers remember to comment their code changes in configuration files. -* Version control makes the history of changes to code readily apparent. - -To create a Multibranch Pipeline: - -. Click New Item on your Jenkins home page, enter a name for your job, select Multibranch Pipeline, and click OK. -. Configure your SCM source (options include Git, GitHub, Mercurial, Subversion, and Bitbucket), supplying information about the owner, scan credentials, and repository in appropriate fields. - For example, if you select Git as the branch source, you are prompted for the usual connection information, but then rather than enter a fixed refspec (Git's name for a source/destination pair), you would enter a branch name pattern (Use default settings to look for any branch). -. Configure the other multibranch pipeline options: - * API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise - * Checkout credentials - alternate credentials to use when checking out the code (cloning) - * Include branches - a regular expression to specify branches to include - * Exclude branches - a regular expression to specify branches to exclude; note that this will takes precedence over the contents of include expressions -. Save your configuration. - -Jenkins automatically scans the designated repository and creates appropriate branches. - -For example (again in Git), if you started with a master branch, and then wanted -to experiment with some changes, and so did `git checkout -b newfeature` and -pushed some commits, Jenkins would automatically detect the new branch in your -repository and create a new sub-project for it. That sub-project would have its -own build history unrelated to the trunk (main line). - -If you choose, you can ask for the sub-project to be automatically removed after -its branch is merged with the main line and deleted. To change your Pipeline -script—for example, to add a new Jenkins publisher step corresponding to new -reports that your `Makefile`/`pom.xml`/etc. is creating—you edit the appropriate -`Jenkinsfile`. Your Pipeline script is always synchronized with -the rest of the source code you are working on. - -*Multibranch Pipeline* projects expose the name of the branch being built with -the `BRANCH_NAME` environment variable. In multibranch pipelines, the `checkout -scm` step checks out the specific commit that the `Jenkinsfile` originated, so -as to maintain branch integrity. - -== Loading Pipeline Scripts from SCM +=== Defining a Pipeline in SCM Complex pipelines would be cumbersome to write and maintain if you could only do that in the text area provided by the Jenkins job configuration page. @@ -219,253 +127,102 @@ code you want to retrieve the pipeline from. When you update the designated repository, a new build is triggered, as long as your job is configured with an SCM polling trigger. -== Writing Pipeline Scripts in the Jenkins UI - -Because Pipelines are comprised of text scripts, they can be written (edited) in -the same script creation area of the Jenkins user interface where you create -them: - -image::/images/pipeline/pipeline-editor.png[title="Pipeline Editor", 800] - -NOTE: You determine which kind of pipeline you want to set up before writing it. - -=== Using Snippet Generator - -You can use the Snippet Generator tool to create syntax examples for individual -steps with which you might not be familiar, or to add relevant syntax to a step -with a long and complex configuration. - -Snippet Generator is dynamically populated with a list of the steps available -for pipeline configuration. Depending on the plugins installed to your Jenkins -environment, you may see more or fewer items in the list exposed by Snippet -Generator. - -To add one or more steps from Snippet Generator to your pipeline code: - -. Open Snippet Generator -. Scroll to the step you want -. Click that step -. Configure the selected step, if presented with configuration options -. Click *Generate Groovy* to see a Groovy snippet that runs the step as configured -. Optionally select and configure additional steps - -image::/images/pipeline/snippet-generator.png[title="Snippet Generator", 800] - -When you click *Generate Groovy* after selecting a step, you see the function -name used for that step, the names of any parameters it takes (if they are not -default parameters), and the syntax used by Snippet Generator to create that -step. - -You can copy and paste the generated code right into your Pipeline, or use it as -a starting point, perhaps deleting any optional parameters that you do not need. - -To access information about steps marked with the help icon (question mark), -click on that icon. - -== Basic Syntax for Pipeline Script - -You typically add functionality to a new pipeline by performing the following tasks: - -* Adding nodes -* Adding more complex logic (usually expressed as stages and steps) - -To configure a pipeline you have created through the Jenkins UI, select the -pipeline and click *Configure*. - -If you run Jenkins on Linux or another Unix-like operating system with a Git -repository that you want to test, for example, you can do that with syntax like -the following, substituting your own name for `jglick`: - - -[pipeline] ----- -// Script // -node { - git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' - def mvnHome = tool 'M3' - sh "${mvnHome}/bin/mvn -B verify" -} ----- - -In Windows environments, you would use `bat` in place of `sh`, for example, -rather than: - -[source, groovy] ----- -sh "${mvnHome}/bin/mvn -B verify" ----- - -you would use: - -[source, groovy] ----- -bat "${mvnHome}/bin/mvn -B verify" ----- - -Your Groovy pipeline script can include functions, conditional tests, loops, -try/catch/finally blocks, and so on. - -Sample syntax for one node in a Java environment that is using the open source -Maven build automation tool (note the definition for `mvnHome`) is shown below: - - -[pipeline] ----- -// Script // -node('remote') { - git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' - - def mvnHome = tool 'M3' // <1> - def v = version() - - if (v) { - echo "Building version ${v}" - } - - sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" - - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - junit '**/target/surefire-reports/TEST-*.xml' -} +[TIP] +==== +The first line of a `Jenkinsfile` should be `#!groovy` +footnoteref:[shebang, https://en.wikipedia.org/wiki/Shebang_(Unix)] +which text editors, IDEs, GitHub, etc will use to syntax highlight the +`Jenkinsfile` properly as Groovy code. +==== -/** Parse the pom.xml for the version number */ -def version() { - def matcher = readFile('pom.xml') =~ '(.+)' - if (matcher) { - return matcher[0][1] - } - return null -} ----- -Pipeline Sample (graphic) key: +== Built-in Documentation -* `def` is a keyword to define a function (you can also give a Java type in - place of `def` to make it look more like a Java method) -* `=~` is Groovy syntax to match text against a regular expression -* [0] looks up the first match -* [1] looks up the first (…) group within that match -* `readFile` step loads a text file from the workspace and returns its content - (Note: Do not use `java.io.File` methods, these refer to files on the master - where Jenkins is running, not files in the current workspace). +Pipeline ships with a number of built-in documentation features to make it +easier to create Pipelines of varying complexities. This built-in documentation +is automatically generated and updated based on the plugins installed in the +Jenkins instance. -The tool step makes sure a tool with the given name is installed on the current -node. The script needs to know where it was installed, so the tool can be run -later. For this, you need a variable. +The built-in documentation can be found globally at: +link:http://localhost:8080[localhost:8080/pipeline-syntax/], +assuming you have a Jenkins instance running on localhost port 8080. The same +documentation is also linked as *Pipeline Syntax* in the side-bar for any +configured Pipeline project. -The `def` keyword in Groovy is the quickest way to define a new variable (with no specific type). +image::pipeline-syntax-sidebar.png[Pipeline Syntax in the side-bar, role=center] -In the sample syntax discussed above, a variable is defined by the following expression: +=== Snippet Generator +The built-in "Snippet Generator" utility is helpful for creating bits of +code for individual steps, discovering new steps provided by plugins, or +experimenting with different parameters for a particular step. -[source, groovy] ----- -def mvnHome = tool 'M3' ----- +The Snippet Generator is dynamically populated with a list of the steps +available to the Jenkins instance. The number of steps available is dependent +on the plugins installed which explicitly expose steps for use in Pipeline. -This ensures that 'M3' is installed somewhere accessible to Jenkins and assigns -the return value of the step (an installation path) to the `mvnHome` variable. +To generate a step snippet with the Snippet Generator: -== Advanced Syntax for Pipeline Script +. Navigate to the Snippet Generator +. Select the desired step in the *Sample Step* dropdown menu +. Use the dynamically populated area below the *Sample Step* dropdown to configure the selected step. +. Click *Generate Pipeline Script* to create a snippet of Pipeline which can be +copied and pasted into a Pipeline. -Groovy lets you omit parentheses around function arguments. The named-parameter -syntax is also a shorthand for creating a map, which in Groovy uses the syntax -`[key1: value1, key2: value2]`, so you could write: +image::snippet-generator.png[Snippet Generator, role=center] +To access additional information and/or documentation about the step selected, +click on the help icon (blue question mark). -[source, groovy] ----- -git([url: 'https://github.com/joe_user/simple-maven-project-with-tests.git', branch: 'master']) ----- +=== Global Variable Reference -For convenience, when calling steps taking only one parameter (or only one -mandatory parameter), you can omit the parameter name. For example, the -following two lines are functionally equivalent: +In addition to the Snippet Generator, which only surfaces steps, Pipeline also +provides a built-in "*Global Variable Reference*." Like the Snippet Generator, +it is also dynamically populated by plugins. Unlike the Snippet Generator +however, the Global Variable Reference only contains documentation for +*variables*, provided by Pipeline or plugins, which are available for +Pipelines. -[source, groovy] ----- -sh 'echo hello' /* short form */ -sh([script: 'echo hello']) /* long form */ ----- +The variables provided by default in Pipeline are: -=== Working with the Environment +env:: -Jenkins Pipeline exposes environment variables via the global variable `env`, -which is available from anywhere within a `Jenkinsfile`. The full list of -environment variables accessible from within Jenkins Pipeline is documented at -link:http://localhost:8080/pipeline-syntax/globals#env[localhost:8080/pipeline-syntax/globals#env], -assuming a Jenkins master is running on `localhost:8080`, and includes: +Environment variables accessible from Pipeline Script, for example: +`env.PATH` or `env.BUILD_ID`. Consult the built-in +link:http://localhost:8080/pipeline-syntax/globals#env[Global Variable Reference] +for a complete, and up to date, list of environment variables +available in Pipeline. -BUILD_ID:: The current build ID, identical to BUILD_NUMBER for builds created in Jenkins versions 1.597+ -JOB_NAME:: Name of the project of this build, such as "foo" or "foo/bar". -JENKINS_URL:: Full URL of Jenkins, such as http://example.com:port/jenkins/ (NOTE: only available if Jenkins URL set in "System Configuration") +params:: - - - -Referencing or using these environment variables can be accomplished like -accessing any key in a Groovy +Exposes all parameters defined for the Pipeline as a read-only link:http://groovy-lang.org/syntax.html#_maps[Map], -for example: +for example: `params.MY_PARAM_NAME`. -[pipeline] ----- -// Script // -node { - echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}" -} ----- +currentBuild:: +May be used to discover information about the currently executing Pipeline, +with properties such as `currentBuild.result`, `currentBuild.displayName`, +etc. Consult the built-in +link:http://localhost:8080/pipeline-syntax/globals#currentBuild[Global Variable Reference] +for a complete, and up to date, list of properties available on `currentBuild`. -==== Setting environment variables -Setting an environment variable within a Jenkins Pipeline can be done with the -`withEnv` step, which allows overriding specified environment variables for a -given block of Pipeline Script, for example: +== Further Reading -[pipeline] ----- -// Script // -node { - /* .. snip .. */ - withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) { - sh 'mvn -B verify' - } -} ----- - - -=== Build Parameters - -If you configured your pipeline to accept parameters using the *Build with -Parameters* option, those parameters are accessible as Groovy variables of the -same name. - -///// -TODO: Expand this section with more examples -///// - -=== Recording Test Results and Artifacts +This section merely scratches the surface of what can be done with Jenkins +Pipeline, but should provide enough of a foundation for you to start +experimenting with a test Jenkins instance. -If there are any test failures in a given build, you want Jenkins to record -them and then proceed, rather than stopping. If you want it saved, you must -capture the `.jar` that you built. The following sample code for a node shows how -(As previously seen in examples from this guide, Maven is being used as -a build tool): +In the next section, <>, more Pipeline steps +will be discussed along with patterns for implementing successful, real-world, +Jenkins Pipelines. -[pipeline] ----- -// Script // -node { - /* .. snip .. */ - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - junit '**/target/surefire-reports/TEST-*.xml' -} ----- -(Older versions of Pipeline require a slightly more verbose syntax. -The “snippet generator” can be used to see the exact format.) +=== Additional Resources -* If tests fail, the Pipeline is marked unstable (as denoted by a yellow ball in - the Jenkins Web UI), and you can browse "Test Result Trend" to see the relevant history. -* You should see Last Successful Artifacts on the Pipeline's main page. +* link:https://jenkins.io/doc/pipeline/steps[Pipeline Steps Reference], + encompassing all steps provided by plugins distributed in the Jenkins Update + Center. +* link:https://jenkins.io/doc/pipeline/examples[Pipeline Examples], a + community-curated collection of copyable Pipeline examples. diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 5bfa6d365076..8ce11ce05c0a 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -40,7 +40,7 @@ If you are not yet familiar with basic Jenkins terminology and features, start w == What is Pipeline? Jenkins Pipeline is a suite of plugins which supports implementing and -integrating continuous delivery pipelines into Jenkins Pipeline provides an +integrating continuous delivery pipelines into Jenkins. Pipeline provides an extensible set of tools for modeling simple-to-complex delivery pipelines "as code" via the Pipeline DSL. footnoteref:[dsl,link:https://en.wikipedia.org/wiki/Domain-specific_language[Domain-Specific Language]] diff --git a/content/doc/book/pipeline/jenkinsfile.adoc b/content/doc/book/pipeline/jenkinsfile.adoc index fd29a01b012b..e51ab5a81401 100644 --- a/content/doc/book/pipeline/jenkinsfile.adoc +++ b/content/doc/book/pipeline/jenkinsfile.adoc @@ -4,12 +4,22 @@ layout: section :notitle: :description: :author: -:email: jenkinsci-users@googlegroups.com +:email: jenkinsci-docs@googlegroups.com :sectanchors: :toc: left = The Jenkinsfile + +//// +XXX: Still much reworking of this section to be done +22:00 < rtyler> then I think the other pieces (recording test results, archiving artifacts, parallel, etc) should move over into the Jenkinsfile section of the chapter +22:00 < rtyler> whatcha think bitwiseman (and hrmpw if he's floating about) +22:02 < bitwiseman> References: yeah, that make sense. +//// + + + == Audience and Purpose This document is intended for Jenkins users who want to leverage the power of @@ -65,6 +75,214 @@ checkout step that calls a particular repository, such as: git url: "https://github.com/my-organization/simple-maven-project-with-tests.git" ---- +== Basic Syntax for Pipeline Script + +You typically add functionality to a new pipeline by performing the following tasks: + +* Adding nodes +* Adding more complex logic (usually expressed as stages and steps) + +To configure a pipeline you have created through the Jenkins UI, select the +pipeline and click *Configure*. + +If you run Jenkins on Linux or another Unix-like operating system with a Git +repository that you want to test, for example, you can do that with syntax like +the following, substituting your own name for `jglick`: + + +[pipeline] +---- +// Script // +node { + git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' + def mvnHome = tool 'M3' + sh "${mvnHome}/bin/mvn -B verify" +} +---- + +In Windows environments, you would use `bat` in place of `sh`, for example, +rather than: + +[source, groovy] +---- +sh "${mvnHome}/bin/mvn -B verify" +---- + +you would use: + +[source, groovy] +---- +bat "${mvnHome}/bin/mvn -B verify" +---- + +Your Groovy pipeline script can include functions, conditional tests, loops, +try/catch/finally blocks, and so on. + +Sample syntax for one node in a Java environment that is using the open source +Maven build automation tool (note the definition for `mvnHome`) is shown below: + + +[pipeline] +---- +// Script // +node('remote') { + git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' + + def mvnHome = tool 'M3' // <1> + def v = version() + + if (v) { + echo "Building version ${v}" + } + + sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" + + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + junit '**/target/surefire-reports/TEST-*.xml' +} + +/** Parse the pom.xml for the version number */ +def version() { + def matcher = readFile('pom.xml') =~ '(.+)' + if (matcher) { + return matcher[0][1] + } + return null +} +---- + +Pipeline Sample (graphic) key: + +* `def` is a keyword to define a function (you can also give a Java type in + place of `def` to make it look more like a Java method) +* `=~` is Groovy syntax to match text against a regular expression +* [0] looks up the first match +* [1] looks up the first (…) group within that match +* `readFile` step loads a text file from the workspace and returns its content + (Note: Do not use `java.io.File` methods, these refer to files on the master + where Jenkins is running, not files in the current workspace). + +The tool step makes sure a tool with the given name is installed on the current +node. The script needs to know where it was installed, so the tool can be run +later. For this, you need a variable. + +The `def` keyword in Groovy is the quickest way to define a new variable (with no specific type). + +In the sample syntax discussed above, a variable is defined by the following expression: + + +[source, groovy] +---- +def mvnHome = tool 'M3' +---- + +This ensures that 'M3' is installed somewhere accessible to Jenkins and assigns +the return value of the step (an installation path) to the `mvnHome` variable. + +== Advanced Syntax for Pipeline Script + +Groovy lets you omit parentheses around function arguments. The named-parameter +syntax is also a shorthand for creating a map, which in Groovy uses the syntax +`[key1: value1, key2: value2]`, so you could write: + + +[source, groovy] +---- +git([url: 'https://github.com/joe_user/simple-maven-project-with-tests.git', branch: 'master']) +---- + +For convenience, when calling steps taking only one parameter (or only one +mandatory parameter), you can omit the parameter name. For example, the +following two lines are functionally equivalent: + +[source, groovy] +---- +sh 'echo hello' /* short form */ +sh([script: 'echo hello']) /* long form */ +---- + +=== Working with the Environment + +Jenkins Pipeline exposes environment variables via the global variable `env`, +which is available from anywhere within a `Jenkinsfile`. The full list of +environment variables accessible from within Jenkins Pipeline is documented at +link:http://localhost:8080/pipeline-syntax/globals#env[localhost:8080/pipeline-syntax/globals#env], +assuming a Jenkins master is running on `localhost:8080`, and includes: + +BUILD_ID:: The current build ID, identical to BUILD_NUMBER for builds created in Jenkins versions 1.597+ +JOB_NAME:: Name of the project of this build, such as "foo" or "foo/bar". +JENKINS_URL:: Full URL of Jenkins, such as http://example.com:port/jenkins/ (NOTE: only available if Jenkins URL set in "System Configuration") + + + + +Referencing or using these environment variables can be accomplished like +accessing any key in a Groovy +link:http://groovy-lang.org/syntax.html#_maps[Map], +for example: + +[pipeline] +---- +// Script // +node { + echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}" +} +---- + + +==== Setting environment variables + +Setting an environment variable within a Jenkins Pipeline can be done with the +`withEnv` step, which allows overriding specified environment variables for a +given block of Pipeline Script, for example: + +[pipeline] +---- +// Script // +node { + /* .. snip .. */ + withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) { + sh 'mvn -B verify' + } +} +---- + + +=== Build Parameters + +If you configured your pipeline to accept parameters using the *Build with +Parameters* option, those parameters are accessible as Groovy variables of the +same name. + +///// +TODO: Expand this section with more examples +///// + +=== Recording Test Results and Artifacts + +If there are any test failures in a given build, you want Jenkins to record +them and then proceed, rather than stopping. If you want it saved, you must +capture the `.jar` that you built. The following sample code for a node shows how +(As previously seen in examples from this guide, Maven is being used as +a build tool): + +[pipeline] +---- +// Script // +node { + /* .. snip .. */ + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + junit '**/target/surefire-reports/TEST-*.xml' +} +---- + +(Older versions of Pipeline require a slightly more verbose syntax. +The “snippet generator” can be used to see the exact format.) + +* If tests fail, the Pipeline is marked unstable (as denoted by a yellow ball in + the Jenkins Web UI), and you can browse "Test Result Trend" to see the relevant history. +* You should see Last Successful Artifacts on the Pipeline's main page. + == Making Pull Requests diff --git a/content/doc/book/resources/pipeline/build-now.png b/content/doc/book/resources/pipeline/build-now.png new file mode 100644 index 0000000000000000000000000000000000000000..c488c264d6095e34d856daf8485ea3fa211f92b7 GIT binary patch literal 23901 zcma&OWmH^Imn~XI0!eTuxCGbW?ykX|;10oEgA?4XaCdhJ8r8_(P2N}%r zJQ&Y3P`fk0RqVzT5zAx3zM`}UFQlL-NmMdOQcDWnkUojfOtWH$O)1t-UQNc3>p|=7 z!^C_iDrlmN^F75NIJNEV6^B3qR!oG2=K`Bi&-I+|VAXMgFUuY5c%BLY5u?DvLi-E; z=jrnAZ$iB(&S04@Xo*TBBwt{KLO(!bZv_xn(@D&*_D`BRdUq6ncif%uP(me26;K%* zoL$tY6G6mS=$-3ezAQvU%ZfdX%Hrl5V>S7p%4OryBHaB}d5I~ER&@Bjyh+Na9q{=% zP0&>kHYqaUb46m;LXW2Mi+2ZnK=l_CSfNdK$BsRRp$5AynepLH^HL6VHPxJSe?eXy z@7B`Hl?EHgetL~V5UI%p`1cz&yOW~65QwelixP#S6^d|HdnMBmZD!bYKZnv6NRO63?rEl>~2LWJ%%(#6oPK$xBAoEVqj`n|# z^SI6D$7{L~{#qA0Dk^vcgkQgYIjtV;?#^bk?+iqybJ&4(i!sE!Ump*E57HX-F$7h3 zy->(zpsbU5LGE1sFISB`_Ts5wbmM=!DRtcQ`5V{DHvxtSkNZDQn+*p zf+xjkNf9@_ZtZE$UL@gRu2Q_Az2kUFOw8uV z31o;eOL5lbNx=QexXE_S_^amJ26OgWlidc)F1O?Us4hQg4F4ONl2Wc(se_|qe4H9T z(Ue4min(_?PMOrEIjFl|zKd`y^=8Rcxl3z^DUv5+gVN61^;mtyrN9uUFlHp(ef{d{ z%KdtuEv7G8;58*NvHwkO!n$1T1ZMZ?yzN4*LaX0CgBZTe^&%=dTH*z5>g$dILN6;J zVTD#hxHpR$L$ZFWig_`My2_!>9u5dZv7F^Yb2%vYwm>^8R$)Gz9)-Kgaz2NBEPJ~_ zVY}|hR9EQEP>Gl~^{{|>b>CBas%_W7223x2`1tr(u}HK&g`qxhGBD%#qLI9=3KG&xy#lS>U};-GhT>eW9qp z?eg;SkB^UlK{C+O+uWQ2?}mXx0zUVrQVHwl$anAF!66ftmz6=DPO9{MU!1k;$iRZ$ zhB(1H&B;yo1u|lHnYNZo6+TPDl*NhBz2?b(#_8cLHkR+g4&1{HGcs<gs<5OXC{t zb|@+O=sjaUN1DDqKjuk957_gvvE8n=I08T4U0y=@%@ip_6A8QmuYdq^)7H`XWzgil zH5g5#ASah8;QQJahAu`Ly8}B1EXvHxOuDlFpFe+E91lw8nmUU(qafQ6j0`%>)s6?_ z@56i{XB_GL1xgm~?p#qD>=Hj7ul5LdT*%4EWz*T^PMMO~t>(*9Qc|*fUzeC`gmWHV zAs2&D1Q7-rQc^=zU9ZP`dzk3xb;d(+%gb73W(Q&DlxeaQr+ZB^X%Eat+XtFAJqQ)ai!75^ZDTtaKvrSPGD=X z^}Xzu>n%h=kQ$aE0S_hMasWovXF3UNV-lUFL;6L9(hIQI%*@P?yE7i2=Lh;hp^Ei( z_c~b$D|rI7a*eH{BTXeGXb>hQrgEX|kUAO)jue$jwCqu|>KZ zo*{Ei8M8)3g3XPpT`@I%Re2@bHhqyoiAt;00)wxw@5@a&)>t z#%9H%dt@r+iza`7yG%KTSk$_gL-i zuIuiUoSciVHV)f;A0RpH?Ys~dQPDuPvIa_8M#d(h;jytyCWC+_>qc*i~g%(B7qmJ$$G83fL~dKju$v@5>d;&5OMuEeBxF+c|ZDE{zS} zH}8o4fYXEcas?$>G}5Vbqu|#T-?OlK#Ju2+nB;V2GmB>uvx6vqviEl`agzH!SO>dK zy>LDZr_`?Ma|60v-hbyuaCxxbI-PUM>Pp|4(G5fsU2KLdY;#ts(CF&utgfx$mA{?< zBU8p2t>H)9|DI;#Td0ur3Ro0ibS?{(y1p;rbXXBaV;4$9gZ^Kn;_x_ZM@L5fMT;!Y zb1wYBD&4mIgM;Mw_@AtQ`;L`qNZ1G~f9f4#-fv+uw&P>7v=a>~E*)HdmODM!<9GPc z7g+O?tjCU8NI3jp!p-dEu6`pbBQ}OS*uXR*5nIdD*cckaBwKSt=oRpdn}7yqk1#luJbojx!D95a1e`2h->oG=}J@8Z&yXYrQWWy-tf5` z@|&C806%ngb~Yz@H5%7X>*{BI?)TyI=F9ADZG^b|4ZQGKtoHb=B0v-k!F()zr>yTz z`FmvMOS28Ft~320Tjd0aNU*55`0?#iem=Pbc0D!V!T6L$&fIGNm|9TTK3S-0a@!eC z=a{(sv|U!!DJ>^AHa_md+H?mP|J&n)Z|BS1%6pdSf6)$d*0g~{#NTeW(TRv9Neae? z3_0km7tlgaJX!McuFaCc-Cy3{w%2j6UXBSG8dA1dczcd+zN2k~?oOQkm}J!_0_L>e zo)CC@25i^&vLCxhJ`+g7R_)SASiSt_^$?$+prChhf0+nbFfcHz*V~uuYc1DWoyn#6 zYuk8yU!Q?cT4y%F?olrhO~_(8D)`yW@K%cD=5pr1%F;5+lN+bEx-xT_m4!@AR&F$n*!_>`R>mciLw#)``advLlku8^{_=JGq zl@JL5yj?bfbILw+u|Oud?fJCOB$eGJO|9$&n0~9v*=IDguSNsEb_Sz4a8{7O3Y2JSasTcSb{mCOs-mc*-9Q6?E3osbmZl@VsH~-uv9}l99`};*Dkidpegd{lBn|;Kk7L7Y<{Kt} z`#f0%h&IIBH@XS@3Y$M}&- z^^Ut&juj;QE(u?@6!TzJY7^4f!*mk?0-j7B4~>m}{m!ym7oxW*FX+Kfl}T*ezS=4( zyPVgTCskd`gZ7yfJSnRB>em@wGPfj*`AZPCda0LKN0OS>ex6pmNw|C02q`8Sz?8T}l zZzs5V+D`TC_kuR#ufe`8aI(p7&i)2Y#x(_(126=JxjXqC)1&HI4LxNn#~`iRZn<$QL=<+qc{zhVK9sN$T_ceSI*| z^_yNxO!7lQxT)EFfsf4`=Pplg{`fv{fs|0JPc&JcYZ)FIKK4=&*hAg zk(Vdr{P8`SkZ*f?yHdZ40UpRHfH^dM>+)WW)R)0DuF;Bg-k-kuNQ8_z_zm=fp-6F` z9MSuDARpC?EsAjcVuovIf{)-?1v1Zwd`geDwy%4!_$HA#G+G@Q{arIDGAwMV-eLxT z#0|gzIXF0i4Z_32{{<<)wE_6DR$vPR`{&1lEC4t`dOk5a9Zvop8;d-6EK{#~y<4#Z zl5D%fUN~RDlsS+=4l=FgZR*;9cnhq8X;^nX3g+R0(Ef2nU;m&24Wu}1q7YKA9aG;R^CL!h-#F`U442fLbc^u0X!wUT6M^)) z<3Fj;I^=OutN*WILT^UHdVJ3Uu`L(zxu+JVLZoX(&pStbG<;P$lRoan3( zo^)knZA;o-CM~+l6M^@Gm$Y5B`LY96mrDikcknXoV|wqE zf{%0ACsouc^tMlr<{Qfz_FG}yj51Nz2w|rWesb4W+E&`yo)h%8XSw^U6u$$rEU4i+ zFPKMYo}N3NE?$P0C2Kd?W_sVPhNS#W5am^5IHOFA!+F)V__F!q(bB#D@>*t1cR5t- z7TOFgkPHJxiEHrkBV$)9t^0drg3qC(uY0_It`+bHy;=3p3hE@1*FRp&)5)cl(Uu2) z_Kd-dO~G()=v1`gYH*;}S0-_5{p^MWnuWa!mL~k3bBB@8*G6T=Y|Y#&-OmZP8MV{x z01{llJE5nL-*jVz6(jcM59NpIwO>7Gp;9_3XYA@xitK7uCAW`*xK?kI654**^hYKY zRmE2yam1K_gfo>9f5!>-2lYjoF_kZw7nnQQp@hOsQBwZJpIA^&ijht(>~lYXwOtQB zhJGAtD8v_hHwbTg?tA0SFT9V@=8_3L$jdZJHtiqu6L=Y1~I{kPYui$JLhzBk{uCO7BWp|vvSXZ+jHg`-lu zE}fb~+6va%EO^-Ox2$OtV#Hu#NSGjT3_mJ-z5>7>-Ta>y-ux*0GasrVeRmoz?b_K- z5+3rZPjZpc>8ulDhu-Fu6CSo~ZqNbn4knz$y-HUm4xCJ@g?)q0gV-DdB5$ zSYQ5S7%}?x*i_gtwT9d6MMuJ)xA5J5IJlffG3ZzNtB=6N$~N=l!mCE-u4`5kKcTe- z6W15ZqhIHf=2(T#f1_pC@w?QJvyo1T?q5^JkGu3X1dxe*D<@cxeOeCK8Kj;XCPBp4 zCz$t_D{FK2o$CYI)DTECT59tnkyCQ20)1*4Ik@?Uq1mJEaB_h)mtKFfGv56x(_({h zWN*u85jwy08JkX{l}M7%yw7fZG+Yzv#?Gm)D+?*%*hAgx>{Wxi4TaBr?{*kL-9qI! zI}9lFcg($~>c&x7+}qt{vM z-bQ;aeLThqLb|hNqLyeB1i><`xxj$?(JLb>H?n zkuPswS5A-xd4w!IyRjLVVKU77sl97=WvW7p0e%tYj(*yAHTTiZ)s<4{bf%-q^`!wX zdA{#!liQMFjsL2%cTmJ>FzI+?NRCXgWA@9~KoS@LdX79_BpZ@qxEXwb%jvd`J` zdzY)~MEKA4y@>WW<{OC}lb6uv7g+9FC3ZJfe}#sWD!lJAtib^pTRLxQ>yI6tapqeL z`=YhoX0nroFL7Hv26SY}6Rk>n**We_oh9D4c0kKMZuN1EEVyWM*2s-Gm%|;YI&BT) z8y%|``eL77==joY<;{A^=CA#k)1ZX{sl0S@P4KMp*u7lr)j=Su>W{7nthP8x1Kpt} zUnTa!)43rV3%^2>?(L4Y>9g8-j2!job$xH6XRXfH+ND6#Z<=qVvoJxXt)0(*_Xa2L-$Y&NOSWSj<57K&#!Cv* z0+!ZQJ^3v}r|)V!4-YN8`9L7!wVm}p;HJ&B4y>4WcfM803M|qN=lu5E9meDB73VVn z=RO0kdBRxa-cRS!pj7=T`wLg{w>!PPbyt;;x99r~j8y%N`}M3pqp6r(eVzszo_m(% ziK9gew#`^qTM+(yI!l$15-BSMXWy>2=ikF{F^>W#uaI(%X!Vkn=#0DaYrY9!bT~hK zvR;f0_%pwI%6^fsxvaXiLxqQ(riAu?*52J9Mfu}Hit?Wbc7zUa;NGMtZ-${gJ;Jje z;rn(z1RFk(p#13)BSw(~0^h$k2|kJbC+7X{i~kOQ|M|^-U;MAoc&RXb5WCueAd@p7 zM*K=j|Mr@*F=5A}RQO-tn<>|kuR18n!_ryoxo^vC$!>i z*NEzbw5qDQ)UpL^F@{}@eWKHF{N28XCeef%lstN_-~Ls@R>_3!#+i5McM3PrwDCzd zTfVikr7nC<`Nk8q_C$AyXmP*g36uMBUIzwVtVyjo(Z8rN&lzd!FwCzr6BX5XZjK?o z@(;JHx24xRkeK-z>Kn*^a2|erf8D0yjNi+I&|DZL;#q@?6=+BEQqL zue(<)JRYrRqnzNyXea%eV!h?lYU2@peEscyO709Zuc9@4cyzS9WM*U=T@OKmfZ#F( z(zJ2$*0(ZJ)E6`Jy=z>>n!M5{i@RYw*VoVR%g3hB*e#)bY265Y4x2yan}ke^)VF`H ziM~1nWH=g z2aZQY|N7D5daL69TFu)QbB9QgUW%uklJu2}nqvWB^OWT^FWJmR9R!N`&YOr8?{uX> z@3-oBlb~*TUwvjKgIt856`yJK-bC=vDegBB)BG#H@K#GxYLC!5=HX_;V z1mri{SC!Jvs+30xB`J2;UG#Hoj{CD;<*G7yG{NzO5ZZDmDlQV4YAGwN?X>^2P~HM} zcpa*KlY=&x+{KuuA|Qrpc1uKrH@w#IaGw=q#S$zxk4R2vsJy==qlqc1m@l%{S6O3k zu=N>Q(&9%}r4R=iOz51^Ku~ZiieM=u`olufF4nZ1deu-ow4c+T=4wUk9v5fN@Li+e zca~By%@5+yC!eXr*IqXa1O)Woq|Mv(WcfHnXkA^SKQ(k2^4jIn&;>vx`)PE$BQ3Y^ z!oB~(5bBO4kMXulzxmd)EY4o%l^8)`sFC6#ERRHhCKOOZMQfmGY8jgoRYPzO1D*?KD877ZSSsncrnr;#aa3)u0l!i1BBwXsUal#9j7dVoAq+wQS_b%d1U?6%*4?Q ze>xJs#xb~PUW{hS44Ej)*{D(6nw|}YHAMomY;e?_zHz(zuckH{b|*h`O!JCYw9yAs zm@i3XY2V~_`bl-aOVBSlt%1nXT+nw`<0Qd~g@$()eiu0x_N7@PJmL!{$!~bH-Vd_mXt9B_ zcOgdi_Ttj|nJu(3*l1|d(4YdNd?EizE$jdqYH7VpBl3y@Q!L2|694_(3Nh|9dbtfk z_SfX}$`W3kvPp4-H7+SIuaT?e&qt%U7{3O^3FvA;kEo;3GcGNIeE+Yw)2>-l&drdY za%$>I?Pe!;DdaAO88#`)qHBlYE$C>JMXGpEDqzbGt5)B>D%TmvxkQD%TaIa9l)=V9 zlNFwsv)ax_yggdpm}n=dXij)PtkP&BXN&r?^`*<=bv`(V9k)h076(1HSu*fLKsPfq zD0*k{1#_2EfIP|d6t&Yyy80tX^6kMMY|oNhVJcW+gGWTvpi;wN*^`t_p9k^9NaVM= zXX&N>apz9SPm==M%;rH}A4|rb%04hEd98tiYpG6fB;XiFVSDv#H{_Q!AN|pnvGi?~ zzQkt8eeDP-sO2E^UOaF^t%-;C zU5l@^}c2*PN8jH%4*gLMXzjL9jeMVrbN!BsPcDXZl zlVx^TAr#nbi)Cx}cyem2yb=-E?Qci%g%&4r8d0BAcwtBh2bouJ;;~^SE*T8FXw|#{ zO7w<;Tq@T^f|&5=L0Oh-L5InKm-27>nArf3O8Y#%IlFDj6z8CZc9}g}T-#BH1KqYs z6q_4SUBsIMtYFTW7@j8=`y5+YIk~h zc^TlIzG*VjOYPLl5BGFgUI{GplJKDM}gx?AaHlS%G?Jq_rvi;9YJ za&hGZixU%;@XJxm0G+2%x|Yl6S|L6jC!`-xptL(V^iQkb?r*5ZR~v8%-u|~fkvGSwP4-n5xHE)cMCi&rvSkw zHaiJu3}%Y@4eecBHxlhzlzA$u+J0@h1@E~-{pc3u+~oYxK3UnYf3Sn;(9)iry~!Uw zkNss_8VQe`lGswdySm`#KKKvw8mCe#Ej976Z%Lsi#^k6md>?w*1iF~`CIlETb{}jMs%S@0&*gqrf3?AUk{t_ene~OD>1ay`@&FypS7;E< z^o(VivhZ~r3CbIY@bBYrgVlnUmlqBac9`EDEb91<-wsYNRPatf4Hy%>IRQK2V^PnQ zR)LbHx_Xfc&4n(5Zl(t+Xf}(EK!6$Le}Mrw!`YW9ep>b}!f&a! zOFh5%lE+y6JOu|I9*WJAbJM?7+EK_LDMYQ=BY3G<`*d{m5Wa^DNR(2Y)S2LVGNf6c zw7|joJbar?5u`pw5A|(-0c;H?IE?AH^ff-?kM{0s5D4eJTH21A5Y0e8?6_n5a9FlQ z>k>tR;t*7KHDv{rgaWKs6laZ<)Or$tRoO>>rsQhz;Yt%}W5zA`iVr3`|Y^gwalI9S+Q z?fr&x%^t}ZxO-Ro{Tbxm{P<__t+l+a_Y>dRgpQ6je9fyK3|B-T zmmrWJCc$S`uDasdW(=@h%4kB?>h91e7a&w2%4G6!amC0dyo6m+0D4MHIHYY)yBJ9e zDTg#H4sw|DC>0kafS+^K-s#tdVEj1gf zx#A+WxDinUky+R%Y(>4hqonDI7bl-3n@C7VLDvJRBhY$M9!8pKSZPYaytq#ZlH?v8 z{G8po42G5JxSI0cIl+c*b%}M;yuFtgy(W7}QFxQ*0C(EqdEZ&pqw4>=CSKfHi|_2= zfFKd%ETO=PMc+hful7`xsB;}|T#}A1kEEn7LD^S{gFQ_th_s*93qfw@eG#QTMh&GD z%mSgHqS^z!=q9)joYJzdwUsFq)_nb`)Qw<6$10VA*VKFQu6aXL+ZqieW#x1$;iK@r zqp-{n`pgVHIjBz#Eu}dItY)fOP#R3QwKPzIFXI7HgI!0*pFo=^d(+@w^F7=k?QiYOhN;!M zf1twaXfvA3I{E{_CV&{9-z&vrskF3|TDkC#ajhq&#h6aY!}0GGeAU_&8Qi)6zQbG& zy(NbS)9gdclcxd&y{4Kw@y}lb2|%GR^X14ggeNi9*NSU5eG`l;pW$n;@X=Of7 zz3uDe+e%GeAJxyr3Kc68gF%oFARiwepoKpA=Z_+qijK-(xL%QUqR-E-)iI&tU<(Ti zKmkF=$mr_gvhTh=HfHlX;2ki=dm5$B{71L$Fy3BvvWvq!cVUYdM5j=o{I?Jh?^T=d zIS&siFM(etI8^UJ?pgME939x3wC|Pj6xk%jOY?T%5az={em6I7!T&AtfgE+i3>+ z)4>J^?|X~CD3$!{2>Sc`7vG|W zCM^^Z!?T-kzc%%wl1s%A!v`DCVSN(&h9QOuOM(`5cfMApNW~fT>C>n9A>*#+s}Z1i z5M+SU3I*S%YhLrv&MK!(ht)=c3HuxCZN>%Y7vuoV4vKgwiufa^*6eIza(US897q%U z!90b`APLoKXjY`bKc$Hzd5?X2ef`a1jgifA{n1n&98h{+qTDWZ?=+;#4MLwi)!St6 zixa=T2kQ0E5Gao~`u`gN`TrL7|Dh(mmr-C}J739ALifp@u0|N&q+i#{oBtuAY>!EWCT}kEC9+RP1=p%SRDnDGZ9ejX&sT(*1}pXSb^@{W!$$AC>gvh6+IO=z z05+H{k|ali%_%LFu3F$w&IPnThBb?p4eNaPpHySJIFBY9N7HCP(=(JFIQy}5b*JvNR8*<0!1g&z|gDJM>0{G-Fu8I_AKs1nDtGWEEv zZ#rXbL7;3T0#>JrM_>D*VW(J2WT!R&#oQN6r2TuWY^#0>`0ndkm?z2zmSg0}S|10x zISyYupAKDy4)WHum#Y<9Jro+L4D<7B!?I&*;LfrnnZVK!Qrzz4Sc2zV9>cVCo>ZXj z6xW+NlT=SeWl;9)ds#2L!@hAProBGdKLqGS>py5;LYMevL7=DSKutI`eb%3K6A#Uk zJ$sr)aWK^D~U@eYn-pmF{k0S|YIaEVa2(OZl7 zEUgN)vN=~IHi9Nc`9eMJ8hSwy7YD}6hAfo~WazcF}18)p2+O0%D z*RW1TGu2+TCf|EdcUp_rAiLb`_}Ht~bViE-WS4xbQ|cA1)y-DPU9=|z!Yyc^HH;^f zIweE)Q)<>7CAx;+9{+$-zG{JIdE!04&9^(Dm%U$6P~#KMO4_AYv=MK!srd&T$2@Wm ztY4pYC_Z*t<+IdSS?g#tzXyeG^6UPLlRq{G1yT6)@1|2@JmGKNcyL#Wb9Q)YMOXBkOaT1@DMr8SaLwTz3~a9heRZ`h}% z)d)n~Lha7)ZZ7?<@E}&S0@0b*j}Y2{N(9H~&j{8C z>Lvs%)QTHRbext}aYLNQBu+E7N}OY*ZRYx9*=_96OTrmIqt3a`0}s^ z#M@X$Nv7)4aW-s80Xu9n+9y2i@-U~mvO`7Ag7fM$tkF1~P(KB-!Pmo&Z#w+u#`OWL z`Yk^m?&;PpPbwPtith2+CcBL6AR@_aUiz@nVes-R58_JlQQ&vW3Gv{s&t+axuD)k$ zr6NZ-7K+(r^Fi6t;c@B*I8s(6EfxZ)P6XR#lB;R@(scvj&n+X2iA&`SN9Y8?Hj=aq zY&C*-Uz==CZ>PePK-skW@{$=DYBsQn?xkNideBKxqRU=b)5kcYc%GWn%5FWD_AfCiKOEorB@r>^Vj*SFHUcpBb}1Y5(JKys-P6`J^=T?Z~9lt#@0Kn?^5 z{`kdhvL`;Xk_h;`6vO9p_r)6sAin=8U4RBFRGLnt)KLIZk5s#t}#eZ^qOpYd%_tARRz-3h`E}#BsbHi<^6p1fR?MASP z=+gK&zVJx7NFGSP5W)+?l=O5wv2TDFxPc$q-W8}yqyZTb0K)Q>N<>LXq?7=qSHGcl zjDjbtkoKYiAPWho4w_Gr2If&;T^&O{WsdA`9?WOu@QM|5Vy&r&FVRO<2k_+30G0lr zKJ)95WH;rd01Eaq1#!&F{|9Y;nJ-lTU6Xf0pSEn2OaI5MC0Epr&GLgQJkrf%v%w)Q z4D_WStC6=p3)na9cr=~k6k95T3E=?N-vp?NHG)yyzy}(M!e3pU72`18Xz?ES(@_1* z-MtC9ypENAv$aTjpJ}}tQKU)KC~?~6lCR=WSN%+#=Imm>WqvZbHQ{vZ07(dF z1rP@D`>xx^p#C{YRPE%yDr$psWJ~ANVoZ9(R&DiwG|sp^t*pOSv+tmRtQPF}?l-$N zBYQFP(zUYyh-M0((Cf9a{Klgqwo~uh*#+gr0>`YLqpf8fFZl~e{w$n=LRp<-9zDYa!|nDg){4s7r4|!DCXc218M>ZeYnlj zCs}^p!qk)oF;9J%sHlxg5>2c|B5qCqBt|4st6(>5pyCM@u6-=WF4A}i~ozINec8nb1g$%mw zs~L5Y7`CWny+212TSM%R@+bOYwp*yK7`H#nm+5?jdjPu1#uLS%0T;{ffDu zs>l`itj&4xVGx%MCPE4e3XU(F!XnVk$Qz^6&{5c`7H;aD_yqgIgnHxRWUPbC5I-li zk0q6Dn|B#V;n65c2=ihP8ox{?bqt9s^QCw#ySmMPXAKo?*4je=1rWDCEkguo`I4>I zj^kSz>^9N}`8*c;HFcE>REpPDb*W^$of~R~rc&WUXiy(`79En-~m5MtTf+!sVf zXZSMPs=O2=dmF4=cqkcku3}q4!7BWd8*RI$CdBB%v3miE3fmGdY z+|%|J7X5ZQArQS>K|5IUJ`Y@2ffkmMV-akc&hpCJ=JTAEbGp5^bbqiho%nyS(Tg|3 zU!+0~D1`^MdFPoSjl5E)e_XWQk$fxe4GDI`Fgch!eubF}vgqe#GAYCrhO?BmvsQ;g zv@Q~Rfxpy<6i~n_vhLy*LAPZn9_M!0c1tR#uSFscukZeX9U6{pOA1hTL}V5+sEk39o-QS7KD2Ft zIaHtP`GkK;*VRdfHzgM5!3Dif%ow7fURNuPI?oYbgTKUiY~pxU9CxVx9=R-qzVtda z22pRgI-R^u7BKSO|-8pUOQ$Mfg&zeC4Ah)OM+p0G-!fT49hHJ?)O8&$uW=qubXj6 z?GV{0nLpOMtE7Y+kT9Sif(iZ^Te=tvagO!iIMYeGnaO4BeBLfd4t6?Q?l+ZrTrt1} z6x3n?D9%V{i|vm&$D_KMtuZl*XnqM+{d0Io>Nrrv;oH0U@da|nGYwr??jlXZeuW`>WkdWm51_u97Yu{*^Gde*553F? zZ3e>c2;KA!kC(9P{?H6p!U|j?4BE4MLxV=TlMp@myk8_UJ|TVB=9DK#%bAxT*3!!& zg~kqJhVB(3ML;*ec~9)8Hos@FbiySO@w@l7UyqT8YsluQk7??*_P9YxTh;cQb6m6? zMSO-;ZU#88@vjyS`7XdbHAYP;EBf8Cq_7E)U&PP<${5+wCDX~6qX`N)X!)$GTd|(v z*+~pp{i0COHK&6&Ul%V--4w(kA{Q;li{Wj^IqnE8b4?m^cjYCcMNoZFq>RQbiIQ<& zWSn;Li%z5tfy_Q`C{bF8)c*E{SoGE#F0i$&t!&P+K}!w=*3tuZn`BAhSI)yY!?(R6}VOlA1J2H+M;D=Rq)WpD3}IZG3q0TuP=h#xJhLs;?Z z49T<@AF;8Mee=FfJ=1Tau1wU@&MEzVoD;g(6z}wam-=s)|y}`yoow7W@WI=*z>pBL zeEa*e$1;e;j0v9-<72Chc7*Vh<@3Y)q0(slsS52PRvgi_)>O&bF*qVt&0GK$%tje; z2*i$qQBe&pcdVW!XJQ7bPVNwxGwdFd&&P9GlzSRja9qqF(d3W8L4?n3?&4%@E4tT*}Ch^a$b5 ztXwn;s<@a|(-ku@HJzV5GP(S~82nbSZoSOTCwBW-42cQs_zX%Y;r8A+FJWN`Q0FDe z2LOe7Ti5KaZwG8&S1_C_n{x;f*Hr!Ynv~3pW$#;6t|&*Wh?%{SuMvA!!-C6v@;enSYjp|rH|Gntt7ilS15G!3BFt0G- ziAJF)14%h9<|^yeYDSYuT1V*IeJ5~2oYs^R!Dr6aJG24ojd(B?i)j?S%8{7_;usB- z|Bbss%9X?MD6WimN2v@pD8`)C1|3b>4a}TA6af8B4x3*8JY~JW)lQtoq^z_LZO9ue z4gK_)01-4ly2sOKLF#G?_HZ{_wYIt2&EH-*vo!i3IW~&PC_wukDA%v)ALohfuyaN6 z>mT^}Pot!GH!!ZdpsuGLG5G!dcAqkTox1GU3NLesXTMp5gVSV&G{X_M0Z;&!$ zkypxB`BpPcaV&5BFMxO^oi$rc#L6<|iT>eeCK-#a z+2s97{g(09@$cOiki8~45a@%Tx-BOq5eutg8L^*A2=XV@rL$v1fjhkqX{qmRKZ$s7 znJoX-oRDZ-e)iE#r^bc;p1-T^v-SaVqxA(`3&4fUYUGVd2krj$^McV}$in&iQ zvm1DDZB?>k-R&r@)kvaEl!rmr!{ZOiSt9NBu_but>R`f-!H<XI_`_gC?ZM6Wf`C4z$%Th>su}V&vKg;AkR~Y503T)7dR7rD$y#cK8o# z+iarG+P6d7&3{(3mDCC$x9V;DP=cjXPAhc>Dk=$f7S#5;@Duir8$K)N@d}nv1TdLM zb_-Dj7ZX@Gj95p|JeE?R7|Z`60yqHRq^&G{FZm;x6?s>fGw=hOvSCX;SEBVmpT@`> z%B9_{U7~L54|#bs{Hn!4@deLUa-Ai?kjt6?WwSiJHEc)&6W4Csi zx>A?miWQ@{#W4Fb6%e3v3Q@$H4wsRmn+zVU!1MHW+HR!Emit2d;e*DfTRM>Eh48r% zyk2}e1Z-zZqz*s>v{Bk8D<-^}*r=J+Dkbcp1@Adi^{HkxVcL@cv`tc*k&kW~i z^S6p%xAOHq-v@d#;SoQ88T0)FBItU^4L0e|TQocx@0#%hKHaLE4%Z2%6NIr0Htc|0l z{-)PLiWx?Zit15P->a@~Ks67Py5`T?c(%rl@!(~N^vi|4+kxoo?GsyE&Eq|y-H zEB~mz{=4-tNVr60`E_IpxdFfuHUa=w38;e8$4u*%0M@8N%}O_uO(2WM9nDSe=4K}D z?krP5l6_xcUsy1Q>0 zlDOj&+q?}fev42Z)2jjV6}^6xIoYXFSE*WwD^=l<`C+@7LKWZgT0~!>PD7_obJA~^ zn^;Db-!T#6-$AElDYdQkON9x`=sCm)<0CG>&Tr?OTz5If^?C$Ou?{+p_OJ3PC`5nc z^XwQTa&M;;EKVz!R^52l{gIMccQ6a^hgdX{!q;z^lk{ntby1sUyNv9esa4+tZ&2={Tc2Re8 z3>U>8y-vyt0^x7{`@aCfs=Kn8OqAaj2X4aCzl8yC1|9Y{ z+IS_M7f(}|jzvW>g|e-ynouBAs$+_6eG>t9a1oWfC<<&83&P1+qza>+@qZvJw5?Vfgo8`r57B_rW=xEQw)V?#?iA7F49(PPz)RZtMs)cgf)p#t)L*n}@6PIv+0KjQU`qKx(uN#C8^5=ew}76pP3@ceSidIfD)Z*i`R_(!L^{2mz_qx*MYk>rgtih+d)wjdnfISX zJ4tftcF4$dK(buS=njK@B^>0LylS6_@A3Ie`c7lExAK(6SO4tSk#h06_lzw_om``v z5@>i&Appewj_{{svq-5>UEu!N{nYi{|H3y@y)Hn zVQ)zX%`Povk|*L&WQ?~CUwcgu>RwQ-=$Iz~B(Ey1)l=>o9xDuzEz%9haeiPd9($iC zV@}?gEXK5I=~Gd#)nbM>k71IDXjRm5i>8B&L*esodQkrVZU^k2%NaAs^R8Omg_qx3uudAeNRGUIw zBPseVLE3#Kf<^n$Q#nDEt|wDfUhG|~rEX>eIEOA{U`?c`%x1XX#)DV0g>(L?)!be z-!FFz*?w)93@hZml$4DXh^yzIV(7p>s(9XUG-VQo;$*_-HPuxgk`qr9u zDfQk=z)DbGs%FHP4b^?@FfI}rZk~{(z@i(3TZnDa+9;d~-O7civwH94__=J{=|6(KAp5S|| zpzDRMH9CSHyxAI@YYq2U*gn)Y^POyQ1^`B-6e{K(4!ra+A;b}&gAL65LqZ9*aqX&D8}^iDA5 zCK zImQ&B51lUT+ZxWM(@59vT-|9gZxz-wu+%Z(PfQp?pS9?U*^Z8xMAgYvXW-wOh6mx4 zOCMzLm--GN^?RCKKo}?I`k|1@5wUde;yas9l^#8>AySZ-)d$(5VzD)@J0k)$*mKgC zj-`(q&2}fJj~iLcRe9Bg@b|wRJJgz<-oQX(M`Lp{uW+c4&z*{*2Nv6h_{x=2gzH$- zfy{B-gB{m33mA337WUbj=K>T4XSD7|+ zfM<4nVM~vtA6k3NXH+j5++mD<)UFKe{_#WZ=$Ep{#eRx^vl@$5rliDqAW9ED&m^FV zCZx}QjC4)KR0A?SoQF%gWr4ERLWVB3m+!nAQZ-Hw?<-NW& zw$>6B$;m7B>ATm;`D<~les8(5m+<#uZ+BO-yQzqaqd-og_L%?;vsk<*$3(~{(z1jT znI*%T@}@)U6_foP{)X`SIzZAUg2vvv&83%DJ7I=VhsjWTz8ul{!2bzPganD7@`UjMhf<#K@=H|FQk~fkZG3Q!u;xeIay`GmA zd(NtxDd|-=6o=8DmI$i@*l?r>+{-w(hz;ty`u%~Nu2m);Etyw+Q$FX4u5q9q5G{8p ze-NB%cpfWc5p>Q~I=%SV(riqc^kX^Fv; zOmajJ(YwiY+?#Kc`jeAzIlp%}iU;m)QPAptEBZ-E#CDJ&O;c^mJ~5Q-R0$4Pa03q7 zih*GtLsa-c1n0FI)Sx(7y!mPn#c!Svwjvz@5R{!L2uS}BrZGUldS(~?S zd1**A#Y1Kdp-pBLg@xSp`DaBX905iLcl16G;K2w4V<4DKD`8$~dG;w4~fsUP;XCGuBjwa--ho(i&6*-^7bajRsR`tZS(4ggklB@X_DD zLvf#JM(Csr&{9!V?fD*JiQ}7Ia{->iIKfnSRL`GMu>F0byiJB%0q_ti{>HT@!*F!uLEe;MN7s+3BRve_| ztQ`ywbyFhQq(lcV>*wa?MAOR3>wUb<_=O_#pX2jfcmwiq2UP{Z7}DQ7ZbGj%wxYCB zKku;0r${&kU`;fn5>qzC6ldcT%W~xD#zsaDXfcVjGl=dFdCsUu$C#+9-QKp4&hx3N zmOF*xNVWb7=9P!!H6_*bJ;nGwtj{|-!)J>xrsn2QxH|}T4@?rm842U1%;m*@&ld5L ziAgzuB+Q^V31x1Sq;69`vxmYQrpGYec_|16PvEklWA^I;!Mi`YAG-q!FrJfgdVLe=o4ey%x(T8P^&b zo%P*UjJB4M@Bz6;46}BK48-g}?#0A+1y1VQe>4zf_RJyQcCIZs3km@^ zaCwY~5FFw(v2?3`$i5JaN5j`p2V_LLWiGEoA313K0rM@LGdG$ z-sIUKxYmcX)F($f94B3ZOBSc5@hydRBwAZ*$>{_YWHn0vc?LaiYtiZ%^;yZU+RcM7 z7i;yMJ3?!wrz~oYf4SSeRsg&oHW9bG$+Bn0lnG!xRV(Y>_|6ebuhq}o8a@Ek# zy#r{#@cF->UzxSv@g4vYH%^y`eynAC^6j)HCrvCR%X`JP#9s$4=BRJy8WX0!8h1+X!wzT-urlA4}4IQ|E1_%ne7<1pC3YQ5CWY<1!BuZ7{~ z>$#%X#3km^wmHe*W9KB4?r~3u%kWF%;1{;FrS-@^$;F1%fU+kN0q?5DW-)|+Pnewb z)`Wgx3~EeEEzMJDHeb0c!mEp9Y}6ff%#RK87OAW~LH*Ii4PF@?W!oKV{U;V~zl}`w zt82SI^sF^(6U?eGU=XYyEx0ilOn}>qqsi#CEQM!JL&K;E2;(e3+3zWQM^O6+vK_v) z9w|vl?JT+TtoA`&s8WT(BcDe{S%UCOBSYxg)$fOJE2m=18||GDx>9Hdj|hH;os@bw zdBuB@D56glAC|9yQB{bg8Aqw2KNv!+>oR!X4KcI^SC3z97(G@0_ z%j=`@Y`QyUi-A6>(2E|9Sh*J_Cg%qs#Xs*3XKgf!TE8fZq9WA8fA2w$LQB;up4#JU z#kr)7?+Wr=v}q{?Xn-R`X_NWd3Si`vrm?biV0ni8h@=A?-f{OG0PAQFE<&q0$ot zF6@69Bqzche&x4(K;f?9>yw;&34y`tE?Ow~nu4&9#Kub6VYtqf+lFsf&N3OS=fpCK zXMhNaa@^V6tekSjAuZ zR-nyq1ZOpXU*L{U^{2ZFcyg^7a@vYUh#Yxl0WMia=dziNl@H9aLj9&S^?e(wE`^0! zdlnlj|B&Rh59R6=6Q-XWLkta_UaYHPk5tKMd4&1&{SFQVy$Tg*@W;fGcoZS`Q9st` zFzY+Q3a0dQjAkY#52&dR5!)(jj-R&o_HMRHkvIrmgZr{^@+we}pWpd#4W(fjC}Ji% zOVy!PA*ktlJ;!{%jg*3BUuki>tXpPS=*GnDnolepEq}0b*GLv1+@D{(`4fo<#RoiW zb#1J3`g9ecjrV)=-SNeCs~J7t3n?QsEGc7s77A zuL=Kc|92Gyu^Z_qBb=VB_tx^~+BDK(5RGwljJ$3YYjpSk$kx#K9JpuZ>MtBKiGG+@ z9USm@HuXJ;ohx8{Q1HTD!e=~#PfAL?*7)6vnfu*kAN-jv%8;1(x` zv8`A-l&$*;TRSt9{8QKB8OHKPCg{qyex_WP*IDxGoa=CJ?{h6JZ1hTxLCsadbfb<- z-xq@bRBf|@`3Ug%&#T8dK({z_q=Iw|^{q7-L;>ia*QFqUt5OXgvId>qt_96=jM3eW zwJ&Irva*8E&{Hfo)mx`BliJ!7R<-*8+B8^|>+!M)Ba>t=(gM!Zvo9w^6v7E^qgA3& zC7aJr;_RD33q`O4Cg=m=cxCi;D_T%IyXL*uc2QYO)R7cPRqLmjh9(kgTp+Bv>HV{aCa>lq=ffI$7&b zuHUD|w=EYJ_`s_X!1lRAG!Ypzikkp?zIruNtdD@fU^o_6O!2e0W|5ntO?_BCsGK~M zn+OcEPv-`YO40ueiC{Z@imP2_iQR5q{lBW_e~X;ks^+%l*%i-g!I3IHg-y(t=qpC% z9`!1pa$&j{(!cX_^!{b2J%*|VI3anT#DHv z`u1>{@)ItslUE{_oo5?yi@&_ajFCvDgsaQwUsJwJTH$TRe#) zdPje3VlnR4=WLlFzu8QhQWto1OdB4~P7LED#s@s50a3FB+wA{N1n%@a8ww+c_B*(L zYCTGcBSTb|PI~`6Yy3HtFh67I^Y@2edanKS`k)dO0UjHe{c|qw=kK!)`$BU2kmlG7 zKW9^=L`kB<7`AKS+)L%)DX*nk#bG~4@LVUg7Jt{bd*yLr)NhoQysRHbmN{+jZr75A z^d5d+oTdw5OJ2!u+rOs2slIZz^lBxHDQr=_)V8?HjMN01VAa>;1jukNftnL%-u%69 z)j;X`ee}hVwqf69)&LWr_vrECQp>*H(WRHK;w|;D{L`;wcRCru2dYnQVk-H&s_qT^ z`f72Zd}d6jJjMz3Zwd5)SLYV4e%+I4$>`Xh#c0?*rX7?zrYH4ay(SbW1_0#9J&r35 z3=zkd^>#nVF1cjXz{z)vH7o@lkJz~mwA=DF^~b%agl@T5EHZnss$Q!yT(85u5j+Yq zXTcinIS%PI_75}$jMchzbDyX3SMZS|zZ7^q>h~L4S`k&_&NB(~Lu?ylxR#+-k#pIa zv>CO&>KO$C8`yEqZM%D_5TT(=+_wfzUaa^&k^^RUy{(mzyQeHR_+CZUpLym!wA~AW zML!903m^nAa3DhPyL*kptn9-FW~Q82>6tqAugSE+8~rDX*S?(rPyAUg!&>aTlZ=?s zF9*B-WJFV^u*%5TN1PvKWlTQny*YaAWn*!DyQ6YAvBk*xm=FJ+3$LTd%IY4I@D`K( zM>4)*B6R_^-%0Qy@VaQ~BXEjd$Vk&Ys8a+I37*uk+~bBt3f z;hvVrJyg}vu28xrUA^Xzb^u#Q4lx+UB$$=*-pW3#&_3N&()10x#JZ_}SaQ(hsOm!~ zhlICY-vv3gj!fTE3YC_*ql(~||I=3DK3ugVKIZi5p+8=Qzk}^Ay1K+Gc=4f3SLBlS zux_=h-M~yw5+B-h+~0mRhwI?uUPjUB#RE|DJD0EuTl63gI-@FZxP&>(l=?m(8*C~) zV(Ph&9#BzP)txHI!M90MGf_*{FT*UiCwF?k3? z#%Nd#`AU{heE{vcC@)~h*Kf5t-7{MGKn;4KJieLyBlTCIx0oudZKm$%y~=~+f^`MC zpm%}aI3uwZ`%%?%{1|E;RsFXf2(Cvm`4{kV<*>HSn?uD|m)=zD7&betVU0Q?Th!0xl}XAp{%VZt;8WAuops}Ucl)_3?zvPtPK zm;xYP6%QQ`%IBWhTzpwl^4kp4A(>=UBBd7?TNWrnGj|0JK;aOa9oFJg;Xk4249r)r z%l_dU*`zJK*V;XR71tV}QPt-J$8+KVg#V)d>UEPv8WktHYsb<9!v3zbNF3;{)^hd+ z>Ku-ZQ!h+}qPMc#JURbQy!1VHC>JXOBU4L{Re8Da(N+R%YG!|h z=>_~+g<)Ek=BeZ(Xj+{UHjHE3N{l3^jrq6>`g_dS#8?|?hW(Q~F7|fyQc~goXi*t- zL8z=hXB#f4DKGhSafyJK6O6A1^l1NoF4 z4(tn3YNNQ(wvvTk(mbJ@+WyuqRg4SXa?;_0VXTy4k~D+>q9JppRtJyu?PGAe+m@v# ztH9M?4MWQfSV#yj~DhDT>SgQ7R%a?*gRjdobPsbFOcCb{U87Mu=MpRx?h zS|`Y&x7CVN|4e>;c6dPTUed9UTJ-Bj>ff`X*MPIiu366!&yhc4K2wPa z6=U||);%%f_TnJW8CHj&kq;{{e28;>JJwF`c!zgcRm++-IY+C7^QuS0_MTyop z@Y=sg7hIm`3GEPyV#Rgy@WKN3qar6U`@TS25f)$QkfzyP#XnHBF&M>m`T|#xe35BT wlnBXIp!~Ng*`oeedil>LPI`$8roCpZG{2Fd;PAS{0n!0rRc)0DrPm?<17zNQng9R* literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/hello-world-console-output.png b/content/doc/book/resources/pipeline/hello-world-console-output.png new file mode 100644 index 0000000000000000000000000000000000000000..56acb57d21bd54b2c24e3bd70cc3aaf98667cee1 GIT binary patch literal 16365 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 literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/hello-world-script.png b/content/doc/book/resources/pipeline/hello-world-script.png new file mode 100644 index 0000000000000000000000000000000000000000..57acd21bc1f5d18139c48cb4a1e6825f6e00a442 GIT binary patch literal 17205 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 literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/new-item-creation.png b/content/doc/book/resources/pipeline/new-item-creation.png new file mode 100644 index 0000000000000000000000000000000000000000..50864b708062d40ae4888f78d457e71204656027 GIT binary patch literal 77508 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ξEIg^2Dg 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 literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/new-item-selection.png b/content/doc/book/resources/pipeline/new-item-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2947ba339b072c95a7315087fd79d4550cfde8 GIT binary patch literal 19950 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 VsjP=Ly+< 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 literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/pipeline-syntax-sidebar.png b/content/doc/book/resources/pipeline/pipeline-syntax-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..13ee894d2c3f7a6b80fac20f9a74aa874bc9a27d GIT binary patch literal 24878 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ȴ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 Date: Thu, 1 Dec 2016 08:09:48 -0800 Subject: [PATCH 13/22] Add redirect from doc/book/pipeline/overview for URL compatibility --- content/doc/book/pipeline/overview.adoc | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 content/doc/book/pipeline/overview.adoc diff --git a/content/doc/book/pipeline/overview.adoc b/content/doc/book/pipeline/overview.adoc new file mode 100644 index 000000000000..f0b73c51fbd0 --- /dev/null +++ b/content/doc/book/pipeline/overview.adoc @@ -0,0 +1,4 @@ +--- +layout: refresh +refresh_to_post_id: '/doc/book/pipeline/getting-started' +--- From f7a1e2caedb5abf48163877fd6b9af6246e3bda7 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 13:00:39 -0800 Subject: [PATCH 14/22] Finish the first-draft of "The Jenkinsfile" section This commit moves some unrelated portions of the original document into the Multibranch section which is still a work in progress. --- STYLEGUIDE.adoc | 7 +- .../doc/book/pipeline/getting-started.adoc | 20 +- content/doc/book/pipeline/jenkinsfile.adoc | 540 +++++++++++------- content/doc/book/pipeline/multibranch.adoc | 70 +++ 4 files changed, 408 insertions(+), 229 deletions(-) diff --git a/STYLEGUIDE.adoc b/STYLEGUIDE.adoc index 2844eb18ac1b..c0574e2c45fb 100644 --- a/STYLEGUIDE.adoc +++ b/STYLEGUIDE.adoc @@ -116,9 +116,10 @@ javadoc:hudson.scm.SCM#all()[a list of all known SCM implementations] == Handbook Style Guide -* With sections that are related/build onto each other. THere should be a - reasonable "intro" or preamble at the beginning of one chapter section and a - reasonable "outtro" at the end, to provide continuity between the documents +* For consecutive sections that are related to or build on each other, there + should be a reasonable "intro" or preamble at the beginning of one section + and a reasonable "outtro" at the end, to provide continuity between the + documents diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index ec9618253cae..cf92c70aed28 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -51,7 +51,7 @@ A basic Pipeline can be created in either of the following ways: The syntax for defining a Pipeline with either approach is the same, but while Jenkins supports entering Pipeline Script directly into the web UI, it's generally considered best practice to define the Pipeline in a `Jenkinsfile` -which Jenkins can then load directly from source control. +which Jenkins will then load directly from source control. footnoteref:[scm, https://en.wikipedia.org/wiki/Source_control_management] @@ -104,20 +104,21 @@ node { // <1> <2> `echo` writes simple string in the Console Output. +// Despite :sectanchors:, explicitly defining an anchor because it will be +// referenced from other documents +[[defining-a-pipeline-in-scm]] === Defining a Pipeline in SCM Complex pipelines would be cumbersome to write and maintain if you could only do that in the text area provided by the Jenkins job configuration page. -Accordingly, you also have the option of writing pipeline scripts (Jenkinsfiles) -with the editor that you use in your IDE (integrated development environment) or -SCM system, and then loading those scripts into Jenkins using the *Pipeline -Script from SCM* option enabled by the workflow-scm-step plugin, which is one of -the plugins that the Pipeline plugin depends on and automatically installs. +Accordingly, you also have the option of writing Pipeline scripts +(Jenkinsfiles) with a text editor and then loading those scripts into Jenkins +using the *Pipeline Script from SCM* option. Loading pipeline scripts using the `checkout scm` step leverages the -idea of "pipeline as code," and lets you maintain pipelines using version -control and standalone Groovy editors. +idea of "Pipeline as code" and allows easy maintenance of Pipelines with source +control and text-editors. To do this, select *Pipeline script from SCM* when defining the pipeline. @@ -138,7 +139,7 @@ which text editors, IDEs, GitHub, etc will use to syntax highlight the == Built-in Documentation -Pipeline ships with a number of built-in documentation features to make it +Pipeline ships with built-in documentation features to make it easier to create Pipelines of varying complexities. This built-in documentation is automatically generated and updated based on the plugins installed in the Jenkins instance. @@ -151,6 +152,7 @@ configured Pipeline project. image::pipeline-syntax-sidebar.png[Pipeline Syntax in the side-bar, role=center] +[[snippet-generator]] === Snippet Generator The built-in "Snippet Generator" utility is helpful for creating bits of diff --git a/content/doc/book/pipeline/jenkinsfile.adoc b/content/doc/book/pipeline/jenkinsfile.adoc index e51ab5a81401..005030e35ce7 100644 --- a/content/doc/book/pipeline/jenkinsfile.adoc +++ b/content/doc/book/pipeline/jenkinsfile.adoc @@ -6,201 +6,248 @@ layout: section :author: :email: jenkinsci-docs@googlegroups.com :sectanchors: -:toc: left +:toc: +:hide-uri-scheme: = The Jenkinsfile +This section builds on the information covered in <>, +and introduces more useful steps, common patterns and demonstrates some +non-trivial `Jenkinsfile` examples. -//// -XXX: Still much reworking of this section to be done -22:00 < rtyler> then I think the other pieces (recording test results, archiving artifacts, parallel, etc) should move over into the Jenkinsfile section of the chapter -22:00 < rtyler> whatcha think bitwiseman (and hrmpw if he's floating about) -22:02 < bitwiseman> References: yeah, that make sense. -//// +Creating a `Jenkinsfile`, which is checked into source control +footnoteref:[scm, https://en.wikipedia.org/wiki/Source_control_management], +provides a number of immediate benefits: +* Code review/iteration on the Pipeline +* Audit trail for the Pipeline +* Single source of truth + footnote:[https://en.wikipedia.org/wiki/Single_Source_of_Truth] + for the Pipeline, which can be viewed and edited by multiple members of the project. -== Audience and Purpose +While the syntax for defining a Pipeline, either in the web UI or with a +`Jenkinsfile`, is the same, it's generally considered best practice to define +the Pipeline in a `Jenkinsfile` and check that in to source control. -This document is intended for Jenkins users who want to leverage the power of -pipeline functionality. Extending the reach of what was learned from a "Hello -World" example in link:/doc/pipeline/[Getting Started with Pipeline], this -document explains how to use a `Jenkinsfile` to perform a simple checkout and -build for the contents of a repository. == Creating a Jenkinsfile -A `Jenkinsfile` is a container for your pipeline (or other) script, which details -what specific steps are needed to perform a job for which you want to use -Jenkins. You create a `Jenkinsfile` with your preferred Groovy editor, or through -the configuration page on the web interface of your Jenkins instance. +As discussed in the <> +section, a `Jenkinsfile` is a text file that contains the definition of a +Jenkins Pipeline and is checked into source control. Consider the following +Pipeline which implements a basic, three-stage, continuous delivery pipeline. -Using a Groovy editor to code a `Jenkinsfile` gives you more flexibility for -building complex single or multibranch pipelines, but whether you use an editor -or the Jenkins interface does not matter if what you want to do is get familiar -with basic `Jenkinsfile` content. - - -. Open your Jenkins instance or Groovy editor. -. Navigate to the directory you want (it should be the root directory for your project). -. Use standard Jenkins syntax. -. Save your file. - -The following example shows a basic `Jenkinsfile` made to build and test code for -a Maven project. `node` is the step that schedules tasks in the following block -to run on the machine (usually an agent) that matches the label specified in the -step argument (in this case, a node called "linux"). Code between the braces ( -`{` and `}` ) is the body of the `node` step. The `checkout scm` command -indicates that this `Jenkinsfile` was created with an eye toward multibranch -support: - - -[source,groovy] +[pipeline] ---- - node ('linux'){ - stage 'Build and Test' - env.PATH = "${tool 'Maven 3'}/bin:${env.PATH}" - checkout scm - sh 'mvn clean package' - } +// Script // +node { // <1> + stage('Build') { // <2> + /* .. snip .. */ + } + stage('Test') { + /* .. snip .. */ + } + stage('Deploy') { + /* .. snip .. */ + } +} ---- +<1> `node` allocates an executor and workspace on the Jenkins cluster. +<2> `stage` describes distinct parts of the Pipeline for better visualization of progress/status. + +Not all Pipelines will have these same three stages, but this is a good +continuous delivery starting point to define them for most projects. The +following can be followed to create and execute a simple Pipeline in a +local test installation of Jenkins. + +[NOTE] +==== +It is assumed that there is already a source control repository set up for +project and a Pipeline has been defined in Jenkins following +<>. +==== + +Using a text editor, ideally one which supports +link:http://groovy-lang.org[Groovy] +syntax highlighting, create a new `Jenkinsfile` in the root directory of the +project. + + +In the example above, `node` is a crucial first step as it allocates an +executor and workspace for the Pipeline. In essence, without `node`, a Pipeline +cannot do any work! From within `node`, the first order of business will be to +checkout the source code for this project. Since the `Jenkinsfile` is being +pulled directly from source control, Pipeline provides a quick and easy way to +access the right revision of the source code -In single-branch contexts, you could replace .checkout scm. with a source code -checkout step that calls a particular repository, such as: - - -[source,groovy] +[pipeline] ---- - -git url: "https://github.com/my-organization/simple-maven-project-with-tests.git" +// Script // +node { + checkout scm // <1> + /* .. snip .. */ +} ---- +<1> The `checkout` step will checkout code from source control; `scm` is a +special variable which instructs the `checkout` step to clone the specific +revision which triggered this Pipeline run. -== Basic Syntax for Pipeline Script +=== Build -You typically add functionality to a new pipeline by performing the following tasks: - -* Adding nodes -* Adding more complex logic (usually expressed as stages and steps) - -To configure a pipeline you have created through the Jenkins UI, select the -pipeline and click *Configure*. - -If you run Jenkins on Linux or another Unix-like operating system with a Git -repository that you want to test, for example, you can do that with syntax like -the following, substituting your own name for `jglick`: +For many projects the beginning of "work" in the Pipeline would be the "build" +stage. Typically this stage of the Pipeline will be where source code is +assembled, compiled, or packaged. The `Jenkinsfile` is *not* a replacement for an +existing build tool such as GNU/Make, Maven, Gradle, etc, but rather can be +viewed as a glue layer to bind the multiple phases of a project's development +lifecycle (build, test, deploy, etc) together. +Jenkins has a number of plugins for invoking practically any build tool in +general use, but this example will simply invoke `make` from a shell step +(`sh`). The `sh` step assumes the system is Unix/Linux-based, for +Windows-based systems the `bat` could be used instead. [pipeline] ---- // Script // node { - git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' - def mvnHome = tool 'M3' - sh "${mvnHome}/bin/mvn -B verify" + /* .. snip .. */ + stage('Build') { + sh 'make' // <1> + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // <2> + } + /* .. snip .. */ } ---- +<1> The `sh` step invokes the `make` command and will only continue if a +zero exit code is returned by the command. Any non-zero exit code will fail the +Pipeline. +<2> `archiveArtifacts` captures the files built matching the include pattern +(`**/target/*.jar`) and saves them to the Jenkins master for later retrieval. + + +[CAUTION] +==== +Archiving artifacts is not a substitute for using external artifact +repositories such as Artifactory or Nexus and should be considered only for +basic reporting and file archival. +==== + +=== Test + +Running automated tests is a crucial component of any successful continuous +delivery process. As such, Jenkins has a number of test recording, reporting, +and visualization facilities provided by a +link:https://plugins.jenkins.io/?labels=report[number of plugins]. +At a fundamental level, when there are test failures, it is useful to have +record them reporting and visualization. The example below uses the `junit` +step, provided by the +link:https://plugins.jenkins.io/junit[JUnit plugin]. + +In the example below, if tests fail, the Pipeline is marked "unstable", as +denoted by a yellow ball in the web UI. Based on the recorded test reports, +Jenkins can also provide historical trend analysis and visualization. -In Windows environments, you would use `bat` in place of `sh`, for example, -rather than: - -[source, groovy] ----- -sh "${mvnHome}/bin/mvn -B verify" ----- - -you would use: - -[source, groovy] +[pipeline] ---- -bat "${mvnHome}/bin/mvn -B verify" +// Script // +node { + /* .. snip .. */ + stage('Test') { + /* `make check` returns non-zero on test failures, + * using `true` to allow the Pipeline to continue nonetheless + */ + sh 'make check || true' // <1> + junit '**/target/*.xml' // <2> + } + /* .. snip .. */ +} ---- +<1> Using an inline shell conditional (`sh 'make || true'`) ensures that the +`sh` step always sees a zero exit code, giving the `junit` step the opportunity +to capture and process the test reports. Alternative approaches to this are +covered in more detail in the <> section below. +<2> `junit` captures and associates the JUnit XML files matching the inclusion +pattern (`**/target/*.xml`). -Your Groovy pipeline script can include functions, conditional tests, loops, -try/catch/finally blocks, and so on. +=== Deploy -Sample syntax for one node in a Java environment that is using the open source -Maven build automation tool (note the definition for `mvnHome`) is shown below: +Deployment can imply a variety of steps, depending on the project or +organization requirements, and may be anything from publishing built artifacts +to an Artifactory server, or pushing code to a production system. +At this stage of the example Pipeline, both the "Build" and "Test" stages have +successfully executed. In essense, the "Deploy" stage will only execute +assuming previous stages completed successfully, otherwise the Pipeline would +have exited early. [pipeline] ---- // Script // -node('remote') { - git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' - - def mvnHome = tool 'M3' // <1> - def v = version() - - if (v) { - echo "Building version ${v}" +node { + /* .. snip .. */ + stage('Deploy') { + if (currentBuild.result == 'SUCCESS') { // <1> + sh 'make publish' + } } - - sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" - - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - junit '**/target/surefire-reports/TEST-*.xml' -} - -/** Parse the pom.xml for the version number */ -def version() { - def matcher = readFile('pom.xml') =~ '(.+)' - if (matcher) { - return matcher[0][1] - } - return null + /* .. snip .. */ } ---- +<1> Accessing the `currentBuild.result` variable allows the Pipeline Script to +determine if there were any test failures. In which case, the value would be +`UNSTABLE`. -Pipeline Sample (graphic) key: +Assuming everything has executed successfully in the example Jenkins Pipeline, +each successful Pipeline run will have associated build artifacts archived, +test results reported upon and the full console output all in Jenkins. -* `def` is a keyword to define a function (you can also give a Java type in - place of `def` to make it look more like a Java method) -* `=~` is Groovy syntax to match text against a regular expression -* [0] looks up the first match -* [1] looks up the first (…) group within that match -* `readFile` step loads a text file from the workspace and returns its content - (Note: Do not use `java.io.File` methods, these refer to files on the master - where Jenkins is running, not files in the current workspace). +A Pipeline Script can include conditional tests (shown above), loops, +try/catch/finally blocks and even functions. The next section will cover this +more advanced Pipeline Script syntax in more detail. -The tool step makes sure a tool with the given name is installed on the current -node. The script needs to know where it was installed, so the tool can be run -later. For this, you need a variable. -The `def` keyword in Groovy is the quickest way to define a new variable (with no specific type). +== Advanced Syntax for Pipeline Scripts -In the sample syntax discussed above, a variable is defined by the following expression: +Pipeline Script is a domain-specific language +footnoteref:[dsl, https://en.wikipedia.org/wiki/Domain-specific_language] +based on Groovy, therefore much of +link:http://groovy-lang.org/semantics.html[Groovy syntax] +can be used without further consideration in Pipeline Script. +=== String Interpolation -[source, groovy] +Groovy's "String" interpolation support can be confusing to many new-comers to +the language. While Groovy supports declaring a string with either single quotes, or +double quotes, for example: + +[source,groovy] ---- -def mvnHome = tool 'M3' +def singlyQuoted = 'Hello' +def doublyQuoted = "World" ---- -This ensures that 'M3' is installed somewhere accessible to Jenkins and assigns -the return value of the step (an installation path) to the `mvnHome` variable. - -== Advanced Syntax for Pipeline Script +Only the latter string will support the dollar-sign (`$`) based string +interpolation, for example: -Groovy lets you omit parentheses around function arguments. The named-parameter -syntax is also a shorthand for creating a map, which in Groovy uses the syntax -`[key1: value1, key2: value2]`, so you could write: - - -[source, groovy] +[source,groovy] ---- -git([url: 'https://github.com/joe_user/simple-maven-project-with-tests.git', branch: 'master']) +def username = 'Jenkins' +echo 'Hello Mr. ${username}' +echo "I said, Hello Mr. ${username}" ---- -For convenience, when calling steps taking only one parameter (or only one -mandatory parameter), you can omit the parameter name. For example, the -following two lines are functionally equivalent: +Would result in: -[source, groovy] +[source] ---- -sh 'echo hello' /* short form */ -sh([script: 'echo hello']) /* long form */ +Hello Mr. ${username} +I said, Hello Mr. Jenkins ---- +Understanding how to use Groovy's string interpolation is vital for using some +of Pipeline Script's more advanced features. + === Working with the Environment Jenkins Pipeline exposes environment variables via the global variable `env`, @@ -214,8 +261,6 @@ JOB_NAME:: Name of the project of this build, such as "foo" or "foo/bar". JENKINS_URL:: Full URL of Jenkins, such as http://example.com:port/jenkins/ (NOTE: only available if Jenkins URL set in "System Configuration") - - Referencing or using these environment variables can be accomplished like accessing any key in a Groovy link:http://groovy-lang.org/syntax.html#_maps[Map], @@ -254,113 +299,174 @@ If you configured your pipeline to accept parameters using the *Build with Parameters* option, those parameters are accessible as Groovy variables of the same name. + +Assuming that a String parameter named "Greeting" has been configured for the +Pipeline project in the web UI, a `Jenkinsfile` can access that parameter via +`$Greeting`: + +[pipeline] +---- +// Script // +node { + echo "${Greeting} World!" +} +---- + ///// TODO: Expand this section with more examples ///// -=== Recording Test Results and Artifacts +=== Handling Failures + +Pipeline Script relies on Groovy's built-in `try`/`catch`/`finally` semantics +for handling failures during execution of the Pipeline. -If there are any test failures in a given build, you want Jenkins to record -them and then proceed, rather than stopping. If you want it saved, you must -capture the `.jar` that you built. The following sample code for a node shows how -(As previously seen in examples from this guide, Maven is being used as -a build tool): +In the <> example above, the `sh` step was modified to never return a +non-zero exit code (`sh 'make check || true'`). This approach, while valid, +means the following stages need to check `currentBuild.result` to know if +there has been a test failure or not. + +An alternative way of handling this, which preserves the early-exit behavior of +failures in Pipeline, while still giving `junit` the chance to capture test +reports, is to use a series of `try`/`finally` blocks: [pipeline] ---- // Script // node { /* .. snip .. */ - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - junit '**/target/surefire-reports/TEST-*.xml' + stage('Test') { + try { + sh 'make check' + } + finally { + junit '**/target/*.xml' + } + } + /* .. snip .. */ } ---- -(Older versions of Pipeline require a slightly more verbose syntax. -The “snippet generator” can be used to see the exact format.) - -* If tests fail, the Pipeline is marked unstable (as denoted by a yellow ball in - the Jenkins Web UI), and you can browse "Test Result Trend" to see the relevant history. -* You should see Last Successful Artifacts on the Pipeline's main page. - - -== Making Pull Requests +=== Using multiple nodes -A pull request notifies the person responsible for maintaining a Jenkins -repository that you have a change or change set that you want to see merged into -the main branch associated with that repository. Each individual change is -called a "commit." +In all previous uses of the `node` step, it has been used without any +arguments. This means Jenkins will allocate an executor wherever one is +available. The `node` step can take an optional "label" parameter, which is +helpful for more advanced use-cases such as executing builds/tests across +multiple platforms. -You make pull requests from a command line, or by selecting the appropriately -labeled button (typically "Pull" or "Create Pull Request") in the interface for -your source code management system. +In the example below, the "Build" stage will be performed on one node and +the built results will be reused on two different nodes, labelled "linux" and +"windows" respectively, during the "Test" stage. -A pull request to a repository included in or monitored by an Organization -Folder can be used to automatically execute a multibranch pipeline build. +[pipeline] +---- +// Script // +stage('Build') { + node { + checkout scm + sh 'make' + stash includes: '**/target/*.jar', name: 'app' // <1> + } +} +stage('Test') { + node('linux') { // <2> + checkout scm + try { + unstash 'app' // <3> + sh 'make check' + } + finally { + junit '**/target/*.xml' + } + } + node('windows') { + checkout scm + try { + unstash 'app' + bat 'make check' // <4> + } + finally { + junit '**/target/*.xml' + } + } +} +---- +<1> The `stash` step allows capturing files matching an inclusion pattern +(`**/target/*.jar`) for reuse within the _same_ Pipeline. Once the Pipeline has +completed its execution, stashed files are deleted from the Jenkins master. +<2> The optional parameter to `node` allows for any valid Jenkins label +expression. Consult the inline help for `node` in the <> for more details. +<3> `unstash` will retrieve the named "stash" from the Jenkins master into the +Pipeline's current workspace. +<4> The `bat` script allows for executing batch scripts on Windows-based +platforms. -== Using Organization Folders +=== Executing in parallel -Organization folders enable Jenkins to automatically detect and include any new -repositories within them as resources. +The example in the <> runs tests across two +different platforms in a linear series. In practice, if the `make check` +execution takes 30 minutes to complete, the "Test" stage would now take 60 +minutes to complete! -When you create a new repository (as might be the case for a new project), that -repository has a `Jenkinsfile`. If you also configure one or more organization -folders, Jenkins automatically detects any repository in an organization folder, -scans the contents of that repository at either default or configurable -intervals, and creates a Multibranch Pipeline project for what it finds in the -scan. An organization folder functions as a "parent," and any item within it is -treated as a "child" of that parent. +Fortunately, Pipeline has built-in functionality for executing portions of +Pipeline Script in parallel, implemented in the aptly named `parallel` step. -Organization folders alleviate the need to manually create projects for new -repositories. When you use organization folders, Jenkins views your repositories -as a hierarchy, and each repository (organization folder) may optionally have -child elements such as branches or pull requests. +Refactoring the example above to use the `parallel` step: +[pipeline] +---- +// Script // +stage('Build') { + /* .. snip .. */ +} -To create Organization folders: +stage('Test') { + parallel linux: { + node('linux') { + checkout scm + try { + unstash 'app' + sh 'make check' + } + finally { + junit '**/target/*.xml' + } + } + }, + windows: { + node('windows') { + /* .. snip .. */ + } + } +} +---- -. Open Jenkins in your web browser. -. Go to: New Item → GitHub Organization or New Item → Bitbucket Team. -. Follow the configuration steps, making sure to specify appropriate scan - credentials and a specific owner for the GitHub Organization or Bitbucket Team - name. -. Set build triggers by selecting the checkbox associated with the trigger type - you want. Folder scans and the pipeline builds associated with those scans can - be initiated by command scripts or performed at defined intervals. They can also - triggered by project promotion or changes to the images in a monitored Docker - hub. -. Decide whether to automatically remove or retain unused items. "Orphaned Item - Strategy" fields in the configuration interface let you specify how many days to - keep old items, and how many old items to keep. If you enter no values in these - fields, unused items are removed by default. +Instead of executing the tests on the "linux" and "windows" labelled nodes in +series, they will now execute in parallel assuming the requisite capacity +exists in the Jenkins cluster. -While configuring organization folders, you can set the following options: -* Repository name pattern - a regular expression to specify which repositories are included in scans -* API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise -* Checkout credentials - alternate credentials to use when checking out (cloning) code +=== Optional step arguments -Multibranch Pipeline projects and Organization Folders are examples of -"computed folder" functionality. In Multibranch Pipeline projects, computation -creates child items for eligible branches. In Organization folders, computation -populates child items as individual Multibranch Pipelines for scanned -repositories. +Groovy allows parentheses around function arguments to be omitted. -Select the "Folder Computation" section of your Jenkins interface to see the -duration (in seconds) and result (success or failure) of computation operations, -or to access a Folder Computation Log that provides more detail about this -activity. +Many Pipeline steps also use the named-parameter syntax as a shorthand for +creating a Map in Groovy, which uses the syntax `[key1: value1, key2: value2]`. +Making statements like the following functionally equivalent: -== Basic Checkout and Build +[source, groovy] +---- +git url: 'git://example.com/amazing-project.git', branch: 'master' +git([url: 'git://example.com/amazing-project.git', branch: 'master']) +---- -Checkout and build command examples are shown in the code example used by the -introduction above. Examples shown assume that Jenkins is running on Linux or -another Unix-like operating system. +For convenience, when calling steps taking only one parameter (or only one +mandatory parameter), the parameter name may be omitted, for example: -If your Jenkins server or agent is running on Windows, you are less likely to be -using the Bourne shell (`sh`) or -link:http://www.computerhope.com/unix/ubash.htm[Bourne-Again shell] (`bash`) as -a command language interpreter for starting software builds. In Windows -environments, use `bat` in place of `sh`, and backslashes (`\`) rather than -slashes as file separators in pathnames. +[source, groovy] +---- +sh 'echo hello' /* short form */ +sh([script: 'echo hello']) /* long form */ +---- diff --git a/content/doc/book/pipeline/multibranch.adoc b/content/doc/book/pipeline/multibranch.adoc index 4ddc572158b7..1e7ffdfa18a3 100644 --- a/content/doc/book/pipeline/multibranch.adoc +++ b/content/doc/book/pipeline/multibranch.adoc @@ -61,3 +61,73 @@ the rest of the source code you are working on. the `BRANCH_NAME` environment variable. In multibranch pipelines, the `checkout scm` step checks out the specific commit that the `Jenkinsfile` originated, so as to maintain branch integrity. + + + +== Making Pull Requests + +A pull request notifies the person responsible for maintaining a Jenkins +repository that you have a change or change set that you want to see merged into +the main branch associated with that repository. Each individual change is +called a "commit." + +You make pull requests from a command line, or by selecting the appropriately +labeled button (typically "Pull" or "Create Pull Request") in the interface for +your source code management system. + +A pull request to a repository included in or monitored by an Organization +Folder can be used to automatically execute a multibranch pipeline build. + + +== Using Organization Folders + +Organization folders enable Jenkins to automatically detect and include any new +repositories within them as resources. + +When you create a new repository (as might be the case for a new project), that +repository has a `Jenkinsfile`. If you also configure one or more organization +folders, Jenkins automatically detects any repository in an organization folder, +scans the contents of that repository at either default or configurable +intervals, and creates a Multibranch Pipeline project for what it finds in the +scan. An organization folder functions as a "parent," and any item within it is +treated as a "child" of that parent. + +Organization folders alleviate the need to manually create projects for new +repositories. When you use organization folders, Jenkins views your repositories +as a hierarchy, and each repository (organization folder) may optionally have +child elements such as branches or pull requests. + + +To create Organization folders: + +. Open Jenkins in your web browser. +. Go to: New Item → GitHub Organization or New Item → Bitbucket Team. +. Follow the configuration steps, making sure to specify appropriate scan + credentials and a specific owner for the GitHub Organization or Bitbucket Team + name. +. Set build triggers by selecting the checkbox associated with the trigger type + you want. Folder scans and the pipeline builds associated with those scans can + be initiated by command scripts or performed at defined intervals. They can also + triggered by project promotion or changes to the images in a monitored Docker + hub. +. Decide whether to automatically remove or retain unused items. "Orphaned Item + Strategy" fields in the configuration interface let you specify how many days to + keep old items, and how many old items to keep. If you enter no values in these + fields, unused items are removed by default. + +While configuring organization folders, you can set the following options: + +* Repository name pattern - a regular expression to specify which repositories are included in scans +* API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise +* Checkout credentials - alternate credentials to use when checking out (cloning) code + +Multibranch Pipeline projects and Organization Folders are examples of +"computed folder" functionality. In Multibranch Pipeline projects, computation +creates child items for eligible branches. In Organization folders, computation +populates child items as individual Multibranch Pipelines for scanned +repositories. + +Select the "Folder Computation" section of your Jenkins interface to see the +duration (in seconds) and result (success or failure) of computation operations, +or to access a Folder Computation Log that provides more detail about this +activity. From 327a0bfd9aeb5ece6614db0391570ca54523f4f5 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 14:14:51 -0800 Subject: [PATCH 15/22] Tidy up a concise Multibranch Pipeline section --- content/doc/book/pipeline/multibranch.adoc | 176 ++++++++---------- .../pipeline/multibranch-branch-indexing.png | Bin 0 -> 11790 bytes ...ultibranch-branch-source-configuration.png | Bin 0 -> 20842 bytes .../pipeline/multibranch-branch-source.png | Bin 0 -> 20957 bytes .../new-item-multibranch-creation.png | Bin 0 -> 77484 bytes 5 files changed, 75 insertions(+), 101 deletions(-) create mode 100644 content/doc/book/resources/pipeline/multibranch-branch-indexing.png create mode 100644 content/doc/book/resources/pipeline/multibranch-branch-source-configuration.png create mode 100644 content/doc/book/resources/pipeline/multibranch-branch-source.png create mode 100644 content/doc/book/resources/pipeline/new-item-multibranch-creation.png diff --git a/content/doc/book/pipeline/multibranch.adoc b/content/doc/book/pipeline/multibranch.adoc index 1e7ffdfa18a3..87094a865a39 100644 --- a/content/doc/book/pipeline/multibranch.adoc +++ b/content/doc/book/pipeline/multibranch.adoc @@ -6,128 +6,102 @@ layout: section :author: :email: jenkinsci-docs@googlegroups.com :sectanchors: +:imagesdir: /doc/book/resources/pipeline +:hide-uri-scheme: :toc: = Multibranch Pipelines -The *Multibranch Pipeline* project type enables you to configure different jobs -for different branches of the same project. In a multibranch pipeline -configuration, Jenkins automatically discovers, manages, and executes jobs -for multiple source repositories and branches. This eliminates the need for -manual job creation and management, as would otherwise be necessary -when, for example, a developer adds a new feature to an existing -product. +In the <> a `Jenkinsfile` which could be +checked into source control was implemented. This section covers the concept of +*Multibranch* Pipelines which build on the `Jenkinsfile` foundation to provide +more dynamic and automatic functionality in Jenkins. -A multibranch pipeline project always includes a 'Jenkinsfile' in its -repository root. Jenkins automatically creates a sub-project for each branch -that it finds in a repository with a `Jenkinsfile`. +== Creating a Multibranch Pipeline -Multibranch pipelines use the same version control as the rest of your software -development process. This "pipeline as code" approach has the following -advantages: +The *Multibranch Pipeline* project type enables you to implement different +Jenkinsfiles for different branches of the same project. +In a Multibranch Pipeline project, Jenkins automatically discovers, manages and +executes Pipelines for branches which contain a `Jenkinsfile` in source control -* You can modify pipeline code without special editing permissions. -* Finding out who changed what and why no longer depends on whether developers remember to comment their code changes in configuration files. -* Version control makes the history of changes to code readily apparent. +This eliminates the need for manual Pipeline creation and management, as would +be necessary when, for example, a developer adds a new feature branch. To create a Multibranch Pipeline: -. Click New Item on your Jenkins home page, enter a name for your job, select Multibranch Pipeline, and click OK. -. Configure your SCM source (options include Git, GitHub, Mercurial, Subversion, and Bitbucket), supplying information about the owner, scan credentials, and repository in appropriate fields. - For example, if you select Git as the branch source, you are prompted for the usual connection information, but then rather than enter a fixed refspec (Git's name for a source/destination pair), you would enter a branch name pattern (Use default settings to look for any branch). -. Configure the other multibranch pipeline options: - * API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise - * Checkout credentials - alternate credentials to use when checking out the code (cloning) - * Include branches - a regular expression to specify branches to include - * Exclude branches - a regular expression to specify branches to exclude; note that this will takes precedence over the contents of include expressions -. Save your configuration. +* Click *New Item* on Jenkins home page. -Jenkins automatically scans the designated repository and creates appropriate branches. +image::new-item-selection.png["Click *New Item* on the Jenkins home page", role=center] -For example (again in Git), if you started with a master branch, and then wanted -to experiment with some changes, and so did `git checkout -b newfeature` and -pushed some commits, Jenkins would automatically detect the new branch in your -repository and create a new sub-project for it. That sub-project would have its -own build history unrelated to the trunk (main line). +* Enter a name for your Pipeline, select *Multibranch Pipeline* and click *OK*. -If you choose, you can ask for the sub-project to be automatically removed after -its branch is merged with the main line and deleted. To change your Pipeline -script—for example, to add a new Jenkins publisher step corresponding to new -reports that your `Makefile`/`pom.xml`/etc. is creating—you edit the appropriate -`Jenkinsfile`. Your Pipeline script is always synchronized with -the rest of the source code you are working on. +[CAUTION] +==== +Jenkins uses the name of the Pipeline to create directories on disk. Pipeline +names which include spaces may uncover bugs in scripts which do not expect +paths to contain spaces. +==== -*Multibranch Pipeline* projects expose the name of the branch being built with -the `BRANCH_NAME` environment variable. In multibranch pipelines, the `checkout -scm` step checks out the specific commit that the `Jenkinsfile` originated, so -as to maintain branch integrity. +image::new-item-multibranch-creation.png["Enter a name, select *Multibranch Pipeline*, and click *OK*", role=center] +* Add a *Branch Source* (for example, Git) and enter the location of the + repository. +image::multibranch-branch-source.png["Add a Branch Source", role=center] +image::multibranch-branch-source-configuration.png["Add the URL to the project repository", role=center] -== Making Pull Requests -A pull request notifies the person responsible for maintaining a Jenkins -repository that you have a change or change set that you want to see merged into -the main branch associated with that repository. Each individual change is -called a "commit." +* *Save* the Multibranch Pipeline project. -You make pull requests from a command line, or by selecting the appropriately -labeled button (typically "Pull" or "Create Pull Request") in the interface for -your source code management system. +Upon *Save*, Jenkins automatically scans the designated repository and creates +appropriate items for each branch in the repository which contains a +`Jenkinsfile`. -A pull request to a repository included in or monitored by an Organization -Folder can be used to automatically execute a multibranch pipeline build. +By default, Jenkins will not automatically reindex the repository for branch +additions or deletions (unless using an <>), +so it is often useful to configure a Multibranch Pipeline to periodically +reindex in the configuration: +image::multibranch-branch-indexing.png["Setting up branch reindexing", role=center] + +=== Additional Environment Variables + +Multibranch Pipelines expose additional information about the branch being +built through the `env` global variable, such as: + +BRANCH_NAME:: Name of the branch for which this Pipeline is executing, for +example `master`. + +CHANGE_ID:: An identifier corresponding to some kind of change request, such as a pull request number + +Additional environment variables are listed in the +<>. + + +=== Supporting Pull Requests + +With the "GitHub" or "Bitbucket" Branch Sources, Multibranch Pipelines can be +used for validating pull/change requests. This functionality is provided, +respectively, by the +link:https://plugins.jenkins.io/github-branch-source[GitHub Branch Source] +and +link:https://plugins.jenkins.io/cloudbees-bitbucket-branch-source[Bitbucket Branch Source] +plugins. Please consult their documentation for further information on how to +use those plugins. + + +[[organization-folders]] == Using Organization Folders -Organization folders enable Jenkins to automatically detect and include any new -repositories within them as resources. - -When you create a new repository (as might be the case for a new project), that -repository has a `Jenkinsfile`. If you also configure one or more organization -folders, Jenkins automatically detects any repository in an organization folder, -scans the contents of that repository at either default or configurable -intervals, and creates a Multibranch Pipeline project for what it finds in the -scan. An organization folder functions as a "parent," and any item within it is -treated as a "child" of that parent. - -Organization folders alleviate the need to manually create projects for new -repositories. When you use organization folders, Jenkins views your repositories -as a hierarchy, and each repository (organization folder) may optionally have -child elements such as branches or pull requests. - - -To create Organization folders: - -. Open Jenkins in your web browser. -. Go to: New Item → GitHub Organization or New Item → Bitbucket Team. -. Follow the configuration steps, making sure to specify appropriate scan - credentials and a specific owner for the GitHub Organization or Bitbucket Team - name. -. Set build triggers by selecting the checkbox associated with the trigger type - you want. Folder scans and the pipeline builds associated with those scans can - be initiated by command scripts or performed at defined intervals. They can also - triggered by project promotion or changes to the images in a monitored Docker - hub. -. Decide whether to automatically remove or retain unused items. "Orphaned Item - Strategy" fields in the configuration interface let you specify how many days to - keep old items, and how many old items to keep. If you enter no values in these - fields, unused items are removed by default. - -While configuring organization folders, you can set the following options: - -* Repository name pattern - a regular expression to specify which repositories are included in scans -* API endpoint - an alternate API endpoint to use a self-hosted GitHub Enterprise -* Checkout credentials - alternate credentials to use when checking out (cloning) code - -Multibranch Pipeline projects and Organization Folders are examples of -"computed folder" functionality. In Multibranch Pipeline projects, computation -creates child items for eligible branches. In Organization folders, computation -populates child items as individual Multibranch Pipelines for scanned -repositories. - -Select the "Folder Computation" section of your Jenkins interface to see the -duration (in seconds) and result (success or failure) of computation operations, -or to access a Folder Computation Log that provides more detail about this -activity. +Organization Folders enable Jenkins to monitor an entire GitHub +Organization, or Bitbucket Team/Project and automatically create new +Multibranch Pipelines for repositories which contain branches and pull requests +containing a `Jenkinsfile`. + +Currently, this functionality exists only for GitHub and Bitbucket, with +functionality provided by the +link:https://plugins.jenkins.io/github-organization-folder[GitHub Organization Folder] +and +link:https://plugins.jenkins.io/cloudbees-bitbucket-branch-source[Bitbucket Branch Source] +plugins. diff --git a/content/doc/book/resources/pipeline/multibranch-branch-indexing.png b/content/doc/book/resources/pipeline/multibranch-branch-indexing.png new file mode 100644 index 0000000000000000000000000000000000000000..bb972047892a76537ba51ccf03b84c0452c4f642 GIT binary patch literal 11790 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 literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/multibranch-branch-source-configuration.png b/content/doc/book/resources/pipeline/multibranch-branch-source-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..e277d62f71ca9bdbce36cf3acb95d5035fc237c1 GIT binary patch literal 20842 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 TSkITQ(gO_jOyQNf&XNBDvTAAL literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/multibranch-branch-source.png b/content/doc/book/resources/pipeline/multibranch-branch-source.png new file mode 100644 index 0000000000000000000000000000000000000000..3d91cf9f4b2bb3ad9ffa75882d6559f031248b82 GIT binary patch literal 20957 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 RpG^P&002ovPDHLkV1kBt8Mpud literal 0 HcmV?d00001 diff --git a/content/doc/book/resources/pipeline/new-item-multibranch-creation.png b/content/doc/book/resources/pipeline/new-item-multibranch-creation.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea03f7e3555d1bc89a88d0b80f4af80c884dfbd GIT binary patch literal 77484 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

dWozZBfBZ3jsiU2CIOYj;cHpgXAz_ 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 OhG?qksOH>w?Ds!dXt)&s literal 0 HcmV?d00001 From 8421597ad6f5592bf16716367b3fef88431d20be Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 15:11:27 -0800 Subject: [PATCH 16/22] Add the initial import of Shared Libraries documentation This has only been marginally touched up from the original source (https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md) But will be pruned in future commits --- .../doc/book/pipeline/shared-libraries.adoc | 446 +++++++++++++++++- 1 file changed, 444 insertions(+), 2 deletions(-) diff --git a/content/doc/book/pipeline/shared-libraries.adoc b/content/doc/book/pipeline/shared-libraries.adoc index 62571101fd17..f8800e3ec1f4 100644 --- a/content/doc/book/pipeline/shared-libraries.adoc +++ b/content/doc/book/pipeline/shared-libraries.adoc @@ -4,11 +4,453 @@ layout: section :notitle: :description: :author: -:email: jenkinsci-users@googlegroups.com +:email: jenkinsci-docs@googlegroups.com :sectanchors: +:imagesdir: /doc/book/resources/pipeline +:hide-uri-scheme: :toc: = Shared Libraries +As Pipeline is adopted for more and more projects in an organization, common +patterns are likely to emerge. Oftentimes it is useful to share parts of +Pipeline scripts between various projects to reduce redundancies and keep code +"DRY" +footnoteref:[dry, http://en.wikipedia.org/wiki/Don\'t_repeat_yourself]. -NOTE: This section is still under construction + +Pipeline has support for creating "Shared Libraries" which can be defined in +external source control repositories and loaded into existing Pipelines. + +== Directory structure + +The directory structure of a Shared Library repository is as follows: + +[source] +---- +(root) ++- src # Groovy source files +| +- org +| +- foo +| +- Bar.groovy # for org.foo.Bar class ++- vars +| +- foo.groovy # for global 'foo' variable/function +| +- foo.txt # help for 'foo' variable/function ++- resources # resource files (external libraries only) +| +- org +| +- foo +| +- bar.json # static helper data for org.foo.Bar +---- + +The `src` directory should look like standard Java source directory structure. +This directory is added to the classpath when executing Pipelines. + +The `vars` directory hosts scripts that define global variables accessible from +Pipeline scripts. +The basename of each `*.groovy` file should be a Groovy (~ Java) identifier, conventionally `camelCased`. +The matching `*.txt`, if present, can contain documentation, processed through the system’s configured markup formatter +(so may really be HTML, Markdown, etc., though the `txt` extension is required). + +The Groovy source files in these directories get the same “CPS transformation” as your Pipeline scripts. + +A `resources` directory allows the `libraryResource` step to be used from an external library to load associated non-Groovy files. +Currently this feature is not supported for internal libraries. + +Other directories under the root are reserved for future enhancements. + +== Defining Shared Libraries + +An Shared Library is defined with a name, a source code retrieval method such +as by SCM, and optionally a default version. The name should be a short +identifier as it will be used in scripts. + +The version could be anything understood by that SCM; for example, branches, +tags, and commit hashes all work for Git. You may also declare whether scripts +need to explicitly request that library (detailed below), or if it is present +by default. Furthermore, if you specify a version in Jenkins configuration, +you can block scripts from selecting a _different_ version. + +The best way to specify the SCM is using an SCM plugin which has been +specifically updated to support a new API for checking out an arbitrary named +version (_Modern SCM_ option). As of this writing, the latest versions of the +Git and Subversion plugins support this mode; others should follow. + +If your SCM plugin has not been integrated, you may select _Legacy SCM_ and +pick anything offered. In this case, you need to include +`${library.yourLibName.version}` somewhere in the configuration of the SCM, so +that during checkout the plugin will expand this variable to select the desired +version. For example, for Subversion, you can set the _Repository URL_ to +`https://svnserver/project/${library.yourLibName.version}` and then use +versions such as `trunk` or `branches/dev` or `tags/1.0`. + +=== Global Shared Libraries + +There are several places where Shared Libraries can be defined, depending on +the use-case. _Manage Jenkins » Configure System » Global Pipeline Libraries_ +as many libraries as necessary can be configured. + +SInce these libraries will be globally usable, any Pipeline in the system can +utilize functionality implemented in these libraries. + +These libraries are considered "trusted:" they can run any methods in Java, +Groovy, Jenkins internal APIs, Jenkins plugins, or third-party libraries. This +allows you to define libraries which encapsulate individually unsafe APIs in a +higher-level wrapper safe for use from any job. Beware that **anyone able to +push commits to this SCM repository could obtain unlimited access to Jenkins**. +You need the _Overall/RunScripts_ permission to configure these libraries +(normally this will be granted to Jenkins administrators). + +=== Folder-level Shared Libraries + +Any Folder created can have Shared Libraries associated with it. This mechanism +allows scoping of specific libraries to all the Pipelines inside of the folder +or subfolder. + +Folder-based libraries are not considered "trusted:" they run in the Groovy +sandbox just like typical Pipeline scripts. + +=== Automatic Shared Libraries + +Other plugins may add ways of defining libraries on the fly. +For example, the +link:https://plugins.jenkins.io/github-organization-folder[GitHub Organization Folder] +plugin allows a scripty to use an untrusted library such as +`github.com/someorg/somerepo` without any additional configuration. In this +case, the specified GitHub repository would be loaded, from the `master` +branch, using an anonymous checkout. + +== Using libraries + +Pipeline scripts need do nothing special to access external libraries marked _Load implicitly_, +or the legacy internal library. +They may immediately use classes or global variables defined by any such libraries (details below). + +To access other external libraries, a script needs to use the `@Library` annotation. +It can take a library name: + +[source,groovy] +---- +@Library('somelib') +---- + +or a library with a version specifier (branch, tag, etc.): + +[source,groovy] +---- +@Library('somelib@1.0') +---- + +or several libraries: + +[source,groovy] +---- +@Library(['somelib', 'otherlib@abc1234']) +---- + +The annotation can be anywhere in the script where an annotation is permitted by Java/Groovy. +When referring to class libraries (with `src/` directories), conventionally the annotation goes on an `import` statement: + +[source,groovy] +---- +@Library('somelib') +import com.mycorp.pipeline.somelib.UsefulClass +---- + +It is legal, though unnecessary, to `import` a global variable (or function) defined in a `vars/` directory: + +[source,groovy] +---- +@Library('somelib') +import usefulFunction +---- + +If you have nowhere better to put it, the simplest legal syntax is an unused, untyped field named `_`: + +[source,groovy] +---- +@Library('somelib') _ +---- + +Note that libraries are resolved and loaded during compilation of the script, before it starts running. +This allows the Groovy compiler to understand the meaning of symbols you use in static type checking, +and permits them to be used in type declarations in your script: + +[source,groovy] +---- +@Library('somelib') +import com.mycorp.pipeline.somelib.Helper + +int useSomeLib(Helper helper) { + helper.prepare() + return helper.count() +} + +echo useSomeLib(new Helper('some text')) +---- + +This matters less for global variables/functions, which are resolved at runtime. + +=== Overriding versions + +A `@Library` annotation may override a default version given in the library’s definition, if the definition permits this. +In particular, an external library marked for implicit use can still be loaded in a different version using the annotation +(unless the definition specifically forbids this). + +== Writing libraries + +Whether external or internal, shared libraries offer several mechanisms for code reuse. + +=== Writing shared code + +At the base level, any valid Groovy code is OK. So you can define data +structures, utility functions, and etc., like this: + +[source,groovy] +---- +// src/org/foo/Point.groovy +package org.foo; + +// point in 3D space +class Point { + float x,y,z; +} +---- + +=== Accessing steps + +Library classes cannot directly call step functions like `sh` or `git`. +You might want to define a series of functions that in turn invoke other Pipeline step functions. +You can do this by not explicitly defining the enclosing class, +just like your main Pipeline script itself: + +[source,groovy] +---- +// src/org/foo/Zot.groovy +package org.foo; + +def checkOutFrom(repo) { + git url: "git@github.com:jenkinsci/${repo}" +} +---- + +You can then call such function from your main Pipeline script like this: + +[source,groovy] +---- +def z = new org.foo.Zot() +z.checkOutFrom(repo) +---- + +However this style has its own limitations; for example, you cannot declare a superclass. + +Alternately, you can explicitly pass the set of `steps` to a library class, in a constructor or just one method: + +[source,groovy] +---- +package org.foo +class Utilities { + def steps + Utilities(steps) {this.steps = steps} + def mvn(args) { + steps.sh "${steps.tool 'Maven'}/bin/mvn -o ${args}" + } +} +---- + +which might be accessed like this from a script: + +[source,groovy] +---- +@Library('utils') import org.foo.Utilities +def utils = new Utilities(steps) +node { + utils.mvn 'clean package' +} +---- + +If you need to access `env` or other global variables as well, +you could pass these in explicitly in the same way, +or simply pass the entire top-level script rather than just `steps`: + +[source,groovy] +---- +package org.foo +class Utilities { + static def mvn(script, args) { + script.sh "${script.tool 'Maven'}/bin/mvn -s ${script.env.HOME}/jenkins.xml -o ${args}" + } +} +---- + +The above example shows the script being passed in to one `static` method, so it could be accessed like this: + +[source,groovy] +---- +@Library('utils') import static org.foo.Utilities.* +node { + mvn this, 'clean package' +} +---- + +### Defining global functions +You can define your own functions that looks and feels like built-in step functions like `sh` or `git`. +For example, to define `helloWorld` step of your own, create a file named `vars/helloWorld.groovy` and +define the `call` method: + +[source,groovy] +---- +// vars/helloWorld.groovy +def call(name) { + // you can call any valid step functions from your code, just like you can from Pipeline scripts + echo "Hello world, ${name}" +} +---- + +Then your Pipeline can call this function like this: + +[source,groovy] +---- +helloWorld "Joe" +helloWorld("Joe") +---- + +If called with a block, the `call` method will receive a `Closure` object. You can define that explicitly +as the type to clarify your intent, like the following: + +[source,groovy] +---- +// vars/windows.groovy +def call(Closure body) { + node('windows') { + body() + } +} +---- + +Your Pipeline can call this function like this: + +[source,groovy] +---- +windows { + bat "cmd /?" +} +---- + +See [the closure chapter of Groovy language reference](http://www.groovy-lang.org/closures.html) for more details +about the block syntax in Groovy. + +=== Defining global variables + + +Internally, scripts in the `vars` directory are instantiated as a singleton on-demand, when used first. +So it is possible to define more methods, properties on a single file that interact with each other: + +[source,groovy] +---- +// vars/acme.groovy +def setFoo(v) { + this.foo = v; +} +def getFoo() { + return this.foo; +} +def say(name) { + echo "Hello world, ${name}" +} +---- + +Then your Pipeline can call these functions like this: + +[source,groovy] +---- +acme.foo = "5"; +echo acme.foo; // print 5 +acme.say "Joe" // print "Hello world, Joe" +---- + +Note that a variable defined in an external library will currently only show up in _Global Variables Reference_ (under _Pipeline Syntax_) +after you have first run a successful build using that library, allowing its sources to be checked out by Jenkins. + +### Define more structured DSL +If you have a lot of Pipeline jobs that are mostly similar, the global function/variable mechanism gives you +a handy tool to build a higher-level DSL that captures the similarity. For example, all Jenkins plugins are +built and tested in the same way, so we might write a global function named `jenkinsPlugin` like this: + +[source,groovy] +---- +// vars/jenkinsPlugin.groovy +def call(body) { + // evaluate the body block, and collect configuration into the object + def config = [:] + body.resolveStrategy = Closure.DELEGATE_FIRST + body.delegate = config + body() + + // now build, based on the configuration provided + node { + git url: "https://github.com/jenkinsci/${config.name}-plugin.git" + sh "mvn install" + mail to: "...", subject: "${config.name} plugin build", body: "..." + } +} +---- + +With this as an internal or implicit external library, +the Pipeline script will look a whole lot simpler, +to the point that people who know nothing about Groovy can write it: + +[source,groovy] +---- +jenkinsPlugin { + name = 'git' +} +---- + +=== Using third-party libraries + +You may use third-party Java libraries (typically found in Maven Central) within *trusted* library code via `@Grab`. +Refer to the [Grape documentation](http://docs.groovy-lang.org/latest/html/documentation/grape.html#_quick_start) for details. +For example: + +[source,groovy] +---- +@Grab('org.apache.commons:commons-math3:3.4.1') +import org.apache.commons.math3.primes.Primes +void parallelize(int count) { + if (!Primes.isPrime(count)) { + error "${count} was not prime" + } + // … +} +---- + +Libraries are cached by default in `~/.groovy/grapes/` on the Jenkins master. + +=== Loading resources + +External libraries may load adjunct files from a `resources/` directory using the `libraryResource` step. +The argument is a relative pathname, akin to Java resource loading: + +[source,groovy] +---- +def request = libraryResource 'com/mycorp/pipeline/somelib/request.json' +---- + +The file is loaded as a string, suitable for passing to certain APIs or saving to a workspace using `writeFile`. + +It is advisable to use an unique package structure so you do not accidentally conflict with another library. + +=== Pretesting library changes + +If you notice a mistake in a build using an untrusted library, +simply click the _Replay_ link to try editing one or more of its source files, +and see if the resulting build behaves as expected. +Once you are satisfied with the result, follow the diff link from the build’s status page, +and apply the diff to the library repository and commit. + +(Even if the version requested for the library was a branch, rather than a fixed version like a tag, +replayed builds will use the exact same revision as the original build: +library sources will not be checked out again.) + +_Replay_ is not currently supported for trusted libraries. +Modifying resource files is also not currently supported during _Replay_. From 6da74f5abd191781723691d22a0cc68378c55eba Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 15:21:35 -0800 Subject: [PATCH 17/22] On second thought, not sure any of this content is especially useful/relevant --- content/doc/book/pipeline/advanced.adoc | 159 ------------------------ content/doc/book/pipeline/chapter.yml | 1 - 2 files changed, 160 deletions(-) delete mode 100644 content/doc/book/pipeline/advanced.adoc diff --git a/content/doc/book/pipeline/advanced.adoc b/content/doc/book/pipeline/advanced.adoc deleted file mode 100644 index a7d30fbf99a1..000000000000 --- a/content/doc/book/pipeline/advanced.adoc +++ /dev/null @@ -1,159 +0,0 @@ ---- -layout: section ---- -:notitle: -:description: -:author: -:email: jenkinsci-docs@googlegroups.com -:sectanchors: -:toc: - -= Advanced Topics - -//// -XXX: This section needs to be gutted and reworked - -01:01 < bitwiseman> rtyler: executors - reading that section it seems like in mixes a number of differ ideas. 1) An implementation detail (Flyweight executors), 2) An naming convention - that I question the need for ("Heavyweight" executors), 3) Best practice guidance about where to use or not use the "input" step (not inside a node block), 4) a - discussion of why you'll see -01:01 < bitwiseman> builds running on master even if you don't have any executors available on master (because of Flyweight executors). I think I'd keep a section on the "input" in the - getting started, with a warning block about not using it inside a node block, and a link out to "advanced" or "best practices. #4 might go somewhere as a note block - in getting started or -01:01 < bitwiseman> might not. The rest should certainly go elsewhere. -01:06 < bitwiseman> rtyler: yeah, and that "Pipeline Plugin Context" and the "More information" that follows it, go elsewhere. As should multibranch and loading from SCM. -//// - -=== Types of Executors - -Every Pipeline build runs on a Jenkins master using a *flyweight executor*, -which is an uncounted (because it's a temporary rather than configured) slot. -Flyweight executors require very little computing power. A flyweight executor -(sometimes also called a flyweight task) represents Groovy script, which is -idle as it waits for a step to complete. - -To highlight the contrast between executor types, some Jenkins documentation -calls any regular executor a *heavyweight executor*. - -When you run a `node` step, an executor is allocated on a node, which is -usually an agent, as soon as an appropriate node is available. - -It is a best practice to avoid placing `input` within a node. The input element -pauses pipeline execution to wait for either automatic or manual approval. -By design and by nature, approval can take some time, so placing `input` within -a node wastes resources by tying up both the flyweight executor used for input -and the regular executor used by the node block, which will not be free for -other tasks until input is complete. - -Although any flyweight executor running a pipeline is hidden when the pipeline -script is idle (between tasks), the *Build Executor Status* widget on the -Jenkins page displays status for both types of executors. If the one available -executor on an agent has been pressed into service by a pipeline build that is -paused and you start a second build of the same pipeline, both builds are shown -running on the master, but the second build displays in the Build Queue until -the initial build completes and executors are free to help with further -processing. - -When you use inputs, it is a best practice to wrap them in timeouts. Wrapping -inputs in timeouts allows them to be cleaned up if approvals do not occur -within a given window. For example: - -[source, groovy] ----- -timeout(time:5, unit:'DAYS') { - input message:'Approve deployment?', submitter: 'it-ops' -} ----- - -//// -XXX: This section needs to be gutted and reworked -//// - -=== Pipeline Plugin Context - -The Pipeline plugin works with a suite of related plugins that enhance the -pipeline functionality of your Jenkins setup. The related plugins typically -introduce additional pipeline syntax or visualizations. - -For example, the table below, while not comprehensive, describes a few -pipeline-related plugins in terms of their importance to pipeline functionality -(required, recommended, or optional). - -To get the basic pipeline functionality, you only need to install the main -Pipeline plugin, but recommended plugins add additional capabilities that you -will probably want. For example, it is a best practice to develop pipelines as code by storing a `Jenkinsfile` with pipeline script in your SCM, -so that you can apply the same version control and testing to pipelines as you do to your other software, and that is why the -Multibranch Pipeline plugin is recommended. - -Optional plugins are mainly useful if you are creating pipelines that are -related to the technologies that they support. - - -[options="header"] -|======================= -|Plugin Name |Description |Status -|Pipeline (workflow-aggregator) | Installs the core pipeline engine and its dependent plugins: -Pipeline: API, -Pipeline: Basic Steps, -Pipeline: Durable Task Step, -Pipeline: Execution Support, -Pipeline: Global Shared Library for CPS pipeline, -Pipeline: Groovy CPS Execution, -Pipeline: Job, -Pipeline: SCM Step, -Pipeline: Step API -| required - -| Pipeline: Stage View -| Provides a graphical swimlane view of pipeline stage execution, as well as a build history of the stages -| recommended - -| Multibranch Pipeline -| Adds "Multibranch Pipeline" item type which enables Jenkins to automatically -build branches that contain a `Jenkinsfile` -| recommended - -| GitHub Branch Source -| Adds GitHub Organization Folder item type and adds "GitHub" as a branch source on Multibranch pipelines -| recommended for teams hosting repositories in GitHub - -| Bitbucket Branch Source -| Adds Bitbucket Team item type and adds "Bitbucket" as a branch source on Multibranch pipelines -| recommended for teams hosting repositories in Bitbucket; best with Bitbucket Server 4.0 or later. - -| Docker Pipeline -| Enables pipeline to build and use Docker containers inside pipeline scripts. -| optional - -|======================= - - -=== More Information - -As with any Jenkins plugin, you can install the Pipeline plugin using the Plugin -Manager in a running Jenkins instance. - -To explore Pipeline without installing -Jenkins separately or accessing your production system, you can run a -link:https://github.com/jenkinsci/workflow-aggregator-plugin/blob/master/demo/README.md[Docker -demo] of Pipeline functionality. - -Pipeline-related plugins are regularly "whitelisted" as compatible with or -designed for Pipeline usage. For more information, see the -link:https://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md[Plugin -Compatibility With Pipeline] web page. - -When you get flows from source control through `Jenkinsfile` or a link:https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md[Pipeline Global Library], -you may also have to whitelist method calls in the link:https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin[Script Security Plugin]. - -[NOTE] -==== -Several plugins available in the Jenkins ecosystem but not actually -related to the Pipeline feature set described in this guide also use the terms -"pipeline," "DSL," and "Job DSL" in their names. For example: - -* Build Pipeline plugin - provides a way to execute Jenkins jobs sequentially -* Build Flow Plugin - introduces a job type that lets you define an orchestration process as a script. - -This guide describes the link:https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin[Pipeline Plugin] that supports the current Pipeline feature set. -==== - diff --git a/content/doc/book/pipeline/chapter.yml b/content/doc/book/pipeline/chapter.yml index ac72b3e7a0ba..c0934aee8d77 100644 --- a/content/doc/book/pipeline/chapter.yml +++ b/content/doc/book/pipeline/chapter.yml @@ -4,4 +4,3 @@ sections: - jenkinsfile - multibranch - shared-libraries - - advanced From f4da68470c0c13ff3bb7da13daad6980a6a9a857 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 15:58:36 -0800 Subject: [PATCH 18/22] Copy-edits courtesy of a review from @omehegan --- content/doc/book/pipeline/jenkinsfile.adoc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/doc/book/pipeline/jenkinsfile.adoc b/content/doc/book/pipeline/jenkinsfile.adoc index 005030e35ce7..1ea42eb4edce 100644 --- a/content/doc/book/pipeline/jenkinsfile.adoc +++ b/content/doc/book/pipeline/jenkinsfile.adoc @@ -12,7 +12,7 @@ layout: section = The Jenkinsfile This section builds on the information covered in <>, -and introduces more useful steps, common patterns and demonstrates some +and introduces more useful steps, common patterns, and demonstrates some non-trivial `Jenkinsfile` examples. Creating a `Jenkinsfile`, which is checked into source control @@ -36,7 +36,7 @@ the Pipeline in a `Jenkinsfile` and check that in to source control. As discussed in the <> section, a `Jenkinsfile` is a text file that contains the definition of a Jenkins Pipeline and is checked into source control. Consider the following -Pipeline which implements a basic, three-stage, continuous delivery pipeline. +Pipeline which implements a basic three-stage continuous delivery pipeline. [pipeline] ---- @@ -58,8 +58,8 @@ node { // <1> Not all Pipelines will have these same three stages, but this is a good continuous delivery starting point to define them for most projects. The -following can be followed to create and execute a simple Pipeline in a -local test installation of Jenkins. +sections below will demonstrate the creation and execution of a simple Pipeline +in a test installation of Jenkins. [NOTE] ==== @@ -139,9 +139,9 @@ Running automated tests is a crucial component of any successful continuous delivery process. As such, Jenkins has a number of test recording, reporting, and visualization facilities provided by a link:https://plugins.jenkins.io/?labels=report[number of plugins]. -At a fundamental level, when there are test failures, it is useful to have -record them reporting and visualization. The example below uses the `junit` -step, provided by the +At a fundamental level, when there are test failures, it is useful to have +Jenkins record the failures for reporting and visualization in the web UI. The +example below uses the `junit` step, provided by the link:https://plugins.jenkins.io/junit[JUnit plugin]. In the example below, if tests fail, the Pipeline is marked "unstable", as @@ -174,7 +174,7 @@ pattern (`**/target/*.xml`). Deployment can imply a variety of steps, depending on the project or organization requirements, and may be anything from publishing built artifacts -to an Artifactory server, or pushing code to a production system. +to an Artifactory server, to pushing code to a production system. At this stage of the example Pipeline, both the "Build" and "Test" stages have successfully executed. In essense, the "Deploy" stage will only execute @@ -211,13 +211,13 @@ more advanced Pipeline Script syntax in more detail. Pipeline Script is a domain-specific language footnoteref:[dsl, https://en.wikipedia.org/wiki/Domain-specific_language] -based on Groovy, therefore much of +based on Groovy, most link:http://groovy-lang.org/semantics.html[Groovy syntax] -can be used without further consideration in Pipeline Script. +can be in Pipeline Script without modification. === String Interpolation -Groovy's "String" interpolation support can be confusing to many new-comers to +Groovy's "String" interpolation support can be confusing to many newcomers to the language. While Groovy supports declaring a string with either single quotes, or double quotes, for example: From e643d90fef6518425ec6bbfdb23f7dc4c7edc088 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Thu, 1 Dec 2016 16:28:10 -0800 Subject: [PATCH 19/22] "in the Jenkins environment" as a means for referring to the collective resources This comes after some discussion with @omehegan on how to refer to the concept --- STYLEGUIDE.adoc | 12 ++++++++++++ content/doc/book/pipeline/getting-started.adoc | 2 +- content/doc/book/pipeline/jenkinsfile.adoc | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/STYLEGUIDE.adoc b/STYLEGUIDE.adoc index c0574e2c45fb..5759baea18a1 100644 --- a/STYLEGUIDE.adoc +++ b/STYLEGUIDE.adoc @@ -10,6 +10,7 @@ CAUTION: This document is still a work in progress. * Master * Node * Pipeline +* Executor Mixing of these terms is incorrect @@ -18,6 +19,17 @@ should always be title-cased. When referring to a conceptual pipeline ("continuous delivery pipeline"), it it should always be lower-cased. +When needing to refer to the collection of executors and/or nodes it is best to +refer to them collectively as "the Jenkins environment", for example: + +____ +[..] they will now execute in parallel assuming the requisite capacity exists +in the Jenkins environment. +____ + +As opposed to "the Jenkins cluster", "agent pool" or any other phrase to +describe the collective set of resources provided by Jenkins. + == Syntax/Formatting Below are some tips for keeping documentation consistently formatted to ensure diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index cf92c70aed28..882cf3b0161b 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -100,7 +100,7 @@ node { // <1> echo 'Hello World' // <2> } ---- -<1> `node` allocates an executor and workspace on the Jenkins cluster. +<1> `node` allocates an executor and workspace in the Jenkins environment. <2> `echo` writes simple string in the Console Output. diff --git a/content/doc/book/pipeline/jenkinsfile.adoc b/content/doc/book/pipeline/jenkinsfile.adoc index 1ea42eb4edce..b92a3b1b3fab 100644 --- a/content/doc/book/pipeline/jenkinsfile.adoc +++ b/content/doc/book/pipeline/jenkinsfile.adoc @@ -53,7 +53,7 @@ node { // <1> } } ---- -<1> `node` allocates an executor and workspace on the Jenkins cluster. +<1> `node` allocates an executor and workspace in the Jenkins environment. <2> `stage` describes distinct parts of the Pipeline for better visualization of progress/status. Not all Pipelines will have these same three stages, but this is a good @@ -445,7 +445,7 @@ stage('Test') { Instead of executing the tests on the "linux" and "windows" labelled nodes in series, they will now execute in parallel assuming the requisite capacity -exists in the Jenkins cluster. +exists in the Jenkins environment. === Optional step arguments From c184c259a795615d7e382d8994d7fd36303f8cf6 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Fri, 2 Dec 2016 09:38:23 -0800 Subject: [PATCH 20/22] Minor copy edits courtesy of a review by @alvin-huang --- content/doc/book/pipeline/index.adoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 8ce11ce05c0a..5d3efe347c6a 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -123,10 +123,10 @@ image::/images/pipeline/realworld-pipeline-flow.png[title="Pipeline Flow", 800] [[step]] Step:: - A single task, fundamentally steps tell Jenkins _what_ to do. For example, in - order to instruct Jenkins to execute the shell command `make`, the `sh` - step would be used: `sh 'make'`. - When a plugin extends to Pipeline DSL, that typically means the plugin has + A single task; fundamentally steps tell Jenkins _what_ to do. In + order to execute the shell command `make`, the `sh` + step would be used. For example `sh 'make'`. + When a plugin extends the Pipeline DSL, that typically means the plugin has implemented a new _step_. [[node]] @@ -148,8 +148,8 @@ for more information. [[stage]] Stage:: - A "stage" is a step for defining a conceptually distinct subset of the + `stage` is a step for defining a conceptually distinct subset of the entire Pipeline, for example: "Build", "Test", and "Deploy". While stages - no bearing on the execution of the Pipeline, they are used by many plugins - which visualize or present Jenkins Pipeline status/progress. + have no bearing on the execution of the Pipeline, they are used by many + plugins to visualize or present Jenkins Pipeline status/progress. footnoteref:[blueocean,link:/projects/blueocean[Blue Ocean], link:https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin[Pipeline Stage View plugin]] From 89663060cda28fbc7af8ddc63d48f1528551fe72 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Fri, 2 Dec 2016 10:55:14 -0800 Subject: [PATCH 21/22] Add notes for where declarative pipeline examples are not yet implemented Once Declarative is an integral part of Pipeline, these should be updated --- content/doc/book/pipeline/getting-started.adoc | 1 + content/doc/book/pipeline/index.adoc | 2 ++ content/doc/book/pipeline/jenkinsfile.adoc | 11 +++++++++++ 3 files changed, 14 insertions(+) diff --git a/content/doc/book/pipeline/getting-started.adoc b/content/doc/book/pipeline/getting-started.adoc index 882cf3b0161b..a76a9de64d23 100644 --- a/content/doc/book/pipeline/getting-started.adoc +++ b/content/doc/book/pipeline/getting-started.adoc @@ -99,6 +99,7 @@ web UI, using two valuable steps. node { // <1> echo 'Hello World' // <2> } +// Declarative not yet implemented // ---- <1> `node` allocates an executor and workspace in the Jenkins environment. <2> `echo` writes simple string in the Console Output. diff --git a/content/doc/book/pipeline/index.adoc b/content/doc/book/pipeline/index.adoc index 5d3efe347c6a..fb62387a0f84 100644 --- a/content/doc/book/pipeline/index.adoc +++ b/content/doc/book/pipeline/index.adoc @@ -65,6 +65,8 @@ node { // <1> sh 'make publish' } } + +// Declarative not yet implemented // ---- <1> <> indicates that Jenkins should allocate an executor and workspace for this part of the Pipeline. diff --git a/content/doc/book/pipeline/jenkinsfile.adoc b/content/doc/book/pipeline/jenkinsfile.adoc index b92a3b1b3fab..605c094f5162 100644 --- a/content/doc/book/pipeline/jenkinsfile.adoc +++ b/content/doc/book/pipeline/jenkinsfile.adoc @@ -52,6 +52,7 @@ node { // <1> /* .. snip .. */ } } +// Declarative not yet implemented // ---- <1> `node` allocates an executor and workspace in the Jenkins environment. <2> `stage` describes distinct parts of the Pipeline for better visualization of progress/status. @@ -88,6 +89,7 @@ node { checkout scm // <1> /* .. snip .. */ } +// Declarative not yet implemented // ---- <1> The `checkout` step will checkout code from source control; `scm` is a special variable which instructs the `checkout` step to clone the specific @@ -118,6 +120,7 @@ node { } /* .. snip .. */ } +// Declarative not yet implemented // ---- <1> The `sh` step invokes the `make` command and will only continue if a zero exit code is returned by the command. Any non-zero exit code will fail the @@ -162,6 +165,7 @@ node { } /* .. snip .. */ } +// Declarative not yet implemented // ---- <1> Using an inline shell conditional (`sh 'make || true'`) ensures that the `sh` step always sees a zero exit code, giving the `junit` step the opportunity @@ -193,6 +197,7 @@ node { } /* .. snip .. */ } +// Declarative not yet implemented // ---- <1> Accessing the `currentBuild.result` variable allows the Pipeline Script to determine if there were any test failures. In which case, the value would be @@ -272,6 +277,7 @@ for example: node { echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}" } +// Declarative not yet implemented // ---- @@ -290,6 +296,7 @@ node { sh 'mvn -B verify' } } +// Declarative not yet implemented // ---- @@ -310,6 +317,7 @@ Pipeline project in the web UI, a `Jenkinsfile` can access that parameter via node { echo "${Greeting} World!" } +// Declarative not yet implemented // ---- ///// @@ -345,6 +353,7 @@ node { } /* .. snip .. */ } +// Declarative not yet implemented // ---- === Using multiple nodes @@ -392,6 +401,7 @@ stage('Test') { } } } +// Declarative not yet implemented // ---- <1> The `stash` step allows capturing files matching an inclusion pattern (`**/target/*.jar`) for reuse within the _same_ Pipeline. Once the Pipeline has @@ -441,6 +451,7 @@ stage('Test') { } } } +// Declarative not yet implemented // ---- Instead of executing the tests on the "linux" and "windows" labelled nodes in From ce79b63b8093ff043a416ca7bc47464682bccc4a Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Fri, 2 Dec 2016 12:15:53 -0800 Subject: [PATCH 22/22] Re-order and restructure a bit of the Shared Libraries document I'm not superbly thrilled with this content yet, needs more iteration at a later date --- .../doc/book/pipeline/shared-libraries.adoc | 244 +++++++++--------- 1 file changed, 125 insertions(+), 119 deletions(-) diff --git a/content/doc/book/pipeline/shared-libraries.adoc b/content/doc/book/pipeline/shared-libraries.adoc index f8800e3ec1f4..c35c431b576d 100644 --- a/content/doc/book/pipeline/shared-libraries.adoc +++ b/content/doc/book/pipeline/shared-libraries.adoc @@ -18,11 +18,35 @@ Pipeline scripts between various projects to reduce redundancies and keep code "DRY" footnoteref:[dry, http://en.wikipedia.org/wiki/Don\'t_repeat_yourself]. - Pipeline has support for creating "Shared Libraries" which can be defined in external source control repositories and loaded into existing Pipelines. -== Directory structure +== Defining Shared Libraries + +An Shared Library is defined with a name, a source code retrieval method such +as by SCM, and optionally a default version. The name should be a short +identifier as it will be used in scripts. + +The version could be anything understood by that SCM; for example, branches, +tags, and commit hashes all work for Git. You may also declare whether scripts +need to explicitly request that library (detailed below), or if it is present +by default. Furthermore, if you specify a version in Jenkins configuration, +you can block scripts from selecting a _different_ version. + +The best way to specify the SCM is using an SCM plugin which has been +specifically updated to support a new API for checking out an arbitrary named +version (_Modern SCM_ option). As of this writing, the latest versions of the +Git and Subversion plugins support this mode; others should follow. + +If your SCM plugin has not been integrated, you may select _Legacy SCM_ and +pick anything offered. In this case, you need to include +`${library.yourLibName.version}` somewhere in the configuration of the SCM, so +that during checkout the plugin will expand this variable to select the desired +version. For example, for Subversion, you can set the _Repository URL_ to +`https://svnserver/project/${library.yourLibName.version}` and then use +versions such as `trunk` or `branches/dev` or `tags/1.0`. + +=== Directory structure The directory structure of a Shared Library repository is as follows: @@ -58,38 +82,13 @@ Currently this feature is not supported for internal libraries. Other directories under the root are reserved for future enhancements. -== Defining Shared Libraries - -An Shared Library is defined with a name, a source code retrieval method such -as by SCM, and optionally a default version. The name should be a short -identifier as it will be used in scripts. - -The version could be anything understood by that SCM; for example, branches, -tags, and commit hashes all work for Git. You may also declare whether scripts -need to explicitly request that library (detailed below), or if it is present -by default. Furthermore, if you specify a version in Jenkins configuration, -you can block scripts from selecting a _different_ version. - -The best way to specify the SCM is using an SCM plugin which has been -specifically updated to support a new API for checking out an arbitrary named -version (_Modern SCM_ option). As of this writing, the latest versions of the -Git and Subversion plugins support this mode; others should follow. - -If your SCM plugin has not been integrated, you may select _Legacy SCM_ and -pick anything offered. In this case, you need to include -`${library.yourLibName.version}` somewhere in the configuration of the SCM, so -that during checkout the plugin will expand this variable to select the desired -version. For example, for Subversion, you can set the _Repository URL_ to -`https://svnserver/project/${library.yourLibName.version}` and then use -versions such as `trunk` or `branches/dev` or `tags/1.0`. - === Global Shared Libraries There are several places where Shared Libraries can be defined, depending on the use-case. _Manage Jenkins » Configure System » Global Pipeline Libraries_ as many libraries as necessary can be configured. -SInce these libraries will be globally usable, any Pipeline in the system can +Since these libraries will be globally usable, any Pipeline in the system can utilize functionality implemented in these libraries. These libraries are considered "trusted:" they can run any methods in Java, @@ -121,34 +120,25 @@ branch, using an anonymous checkout. == Using libraries -Pipeline scripts need do nothing special to access external libraries marked _Load implicitly_, -or the legacy internal library. -They may immediately use classes or global variables defined by any such libraries (details below). +Pipeline scripts can access shared libraries marked _Load implicitly_, They may +immediately use classes or global variables defined by any such libraries +(details below). -To access other external libraries, a script needs to use the `@Library` annotation. -It can take a library name: +To access other shared libraries, a script needs to use the `@Library` +annotation, specifying the library's name: [source,groovy] ---- @Library('somelib') ----- - -or a library with a version specifier (branch, tag, etc.): - -[source,groovy] ----- +/* Using a version specifier, such as branch, tag, etc */ @Library('somelib@1.0') ----- - -or several libraries: - -[source,groovy] ----- +/* Accessing multiple libraries with one statement */ @Library(['somelib', 'otherlib@abc1234']) ---- -The annotation can be anywhere in the script where an annotation is permitted by Java/Groovy. -When referring to class libraries (with `src/` directories), conventionally the annotation goes on an `import` statement: +The annotation can be anywhere in the script where an annotation is permitted +by Groovy. When referring to class libraries (with `src/` directories), +conventionally the annotation goes on an `import` statement: [source,groovy] ---- @@ -156,24 +146,16 @@ When referring to class libraries (with `src/` directories), conventionally the import com.mycorp.pipeline.somelib.UsefulClass ---- -It is legal, though unnecessary, to `import` a global variable (or function) defined in a `vars/` directory: +[NOTE] +==== +It is legal, though unnecessary, to `import` a global variable (or function) +defined in the `vars/` directory: +==== -[source,groovy] ----- -@Library('somelib') -import usefulFunction ----- - -If you have nowhere better to put it, the simplest legal syntax is an unused, untyped field named `_`: - -[source,groovy] ----- -@Library('somelib') _ ----- - -Note that libraries are resolved and loaded during compilation of the script, before it starts running. -This allows the Groovy compiler to understand the meaning of symbols you use in static type checking, -and permits them to be used in type declarations in your script: +Note that libraries are resolved and loaded during _compilation_ of the script, +before it starts executing. This allows the Groovy compiler to understand the +meaning of symbols used in static type checking, and permits them to be used +in type declarations in the script, for example: [source,groovy] ---- @@ -188,22 +170,20 @@ int useSomeLib(Helper helper) { echo useSomeLib(new Helper('some text')) ---- -This matters less for global variables/functions, which are resolved at runtime. +Global Variables/functions however, are resolved at runtime. === Overriding versions -A `@Library` annotation may override a default version given in the library’s definition, if the definition permits this. -In particular, an external library marked for implicit use can still be loaded in a different version using the annotation -(unless the definition specifically forbids this). +A `@Library` annotation may override a default version given in the library’s +definition, if the definition permits this. In particular, a shared library +marked for implicit use can still be loaded in a different version using the +annotation (unless the definition specifically forbids this). == Writing libraries -Whether external or internal, shared libraries offer several mechanisms for code reuse. - -=== Writing shared code - -At the base level, any valid Groovy code is OK. So you can define data -structures, utility functions, and etc., like this: +At the base level, any valid +link:http://groovy-lang.org/syntax.html[Groovy code] +is okay for use. Different data structures, utility functions, etc, such as: [source,groovy] ---- @@ -218,10 +198,9 @@ class Point { === Accessing steps -Library classes cannot directly call step functions like `sh` or `git`. -You might want to define a series of functions that in turn invoke other Pipeline step functions. -You can do this by not explicitly defining the enclosing class, -just like your main Pipeline script itself: +Library classes cannot directly call step functions such as `sh` or `git`. +They can however implement functions, outside of the scope of an enclosing +class, which in turn invoke Pipeline steps, for example: [source,groovy] ---- @@ -233,7 +212,7 @@ def checkOutFrom(repo) { } ---- -You can then call such function from your main Pipeline script like this: +Which can then be called from a Pipeline Script: [source,groovy] ---- @@ -241,9 +220,11 @@ def z = new org.foo.Zot() z.checkOutFrom(repo) ---- -However this style has its own limitations; for example, you cannot declare a superclass. +This approach has limitations; for example, it prevents the declaration of a +superclass. -Alternately, you can explicitly pass the set of `steps` to a library class, in a constructor or just one method: +Alternately, a set of `steps` can be passed explicitly to a library class, in a +constructor, or just one method: [source,groovy] ---- @@ -257,7 +238,7 @@ class Utilities { } ---- -which might be accessed like this from a script: +Which would be access from Pipeline with: [source,groovy] ---- @@ -268,9 +249,10 @@ node { } ---- -If you need to access `env` or other global variables as well, -you could pass these in explicitly in the same way, -or simply pass the entire top-level script rather than just `steps`: +If the library needs to access global variables, such as `env`, those should be +explicitly passed into the library classes, or functions, in a similar manner. + +Instead of passing numerous variables from the Pipeline Script into a library, [source,groovy] ---- @@ -282,7 +264,8 @@ class Utilities { } ---- -The above example shows the script being passed in to one `static` method, so it could be accessed like this: +The above example shows the script being passed in to one `static` method, +invoked from a Pipeline Script as follows: [source,groovy] ---- @@ -292,10 +275,15 @@ node { } ---- -### Defining global functions -You can define your own functions that looks and feels like built-in step functions like `sh` or `git`. -For example, to define `helloWorld` step of your own, create a file named `vars/helloWorld.groovy` and -define the `call` method: +=== Defining steps + + +Shared Libraries can also define functions which look and feel like built-in +steps, such as `sh` or `git`. + + +For example, to define `helloWorld` step, the file `vars/helloWorld.groovy` +should be created and have a `call` method defined: [source,groovy] ---- @@ -306,16 +294,17 @@ def call(name) { } ---- -Then your Pipeline can call this function like this: +The Pipeline Script would then be able to call this step: [source,groovy] ---- helloWorld "Joe" -helloWorld("Joe") ---- -If called with a block, the `call` method will receive a `Closure` object. You can define that explicitly -as the type to clarify your intent, like the following: +If called with a block, the `call` method will receive a +link:http://groovy-lang.org/closures.html[`Closure`]. +The type should be defined explicitly to clarify the intent of the step, for +example: [source,groovy] ---- @@ -327,7 +316,8 @@ def call(Closure body) { } ---- -Your Pipeline can call this function like this: +The Pipeline Script can then use this like any other step which accepts a +block: [source,groovy] ---- @@ -336,14 +326,12 @@ windows { } ---- -See [the closure chapter of Groovy language reference](http://www.groovy-lang.org/closures.html) for more details -about the block syntax in Groovy. === Defining global variables - -Internally, scripts in the `vars` directory are instantiated as a singleton on-demand, when used first. -So it is possible to define more methods, properties on a single file that interact with each other: +Internally, scripts in the `vars` directory are instantiated as a singleton +on-demand, when used first. So it is possible to define more methods, +properties on a single file that interact with each other: [source,groovy] ---- @@ -359,7 +347,8 @@ def say(name) { } ---- -Then your Pipeline can call these functions like this: +Then the Pipeline Script can invoke these functions, rooted off the `acme` +object: [source,groovy] ---- @@ -368,13 +357,21 @@ echo acme.foo; // print 5 acme.say "Joe" // print "Hello world, Joe" ---- -Note that a variable defined in an external library will currently only show up in _Global Variables Reference_ (under _Pipeline Syntax_) -after you have first run a successful build using that library, allowing its sources to be checked out by Jenkins. +[NOTE] +==== +A variable defined in a shared library will only show up in _Global Variables +Reference_ (under _Pipeline Syntax_) after you have first run a successful +build using that library, allowing its sources to be checked out by Jenkins. +==== + -### Define more structured DSL -If you have a lot of Pipeline jobs that are mostly similar, the global function/variable mechanism gives you -a handy tool to build a higher-level DSL that captures the similarity. For example, all Jenkins plugins are -built and tested in the same way, so we might write a global function named `jenkinsPlugin` like this: +=== Defining a more structured DSL + +If you have a lot of Pipeline jobs that are mostly similar, the global +function/variable mechanism gives you a handy tool to build a higher-level DSL +that captures the similarity. For example, all Jenkins plugins are built and +tested in the same way, so we might write a step named +`jenkinsPlugin`: [source,groovy] ---- @@ -395,22 +392,27 @@ def call(body) { } ---- -With this as an internal or implicit external library, -the Pipeline script will look a whole lot simpler, -to the point that people who know nothing about Groovy can write it: +Assuming the script has either been loaded as a +<> or as a +<> +the resulting `Jenkinsfile` will be dramatically simpler: -[source,groovy] +[pipeline] ---- +// Script // jenkinsPlugin { name = 'git' } +// Declarative not yet implemented // ---- === Using third-party libraries -You may use third-party Java libraries (typically found in Maven Central) within *trusted* library code via `@Grab`. -Refer to the [Grape documentation](http://docs.groovy-lang.org/latest/html/documentation/grape.html#_quick_start) for details. -For example: +It is possible to use third-party Java libraries, typically found in +link:http://search.maven.org/[Maven Central], +from *trusted* library code using the `@Grab` annotation. Refer to the +link:http://docs.groovy-lang.org/latest/html/documentation/grape.html#_quick_start[Grape documentation] +for details, but simply put: [source,groovy] ---- @@ -424,21 +426,25 @@ void parallelize(int count) { } ---- -Libraries are cached by default in `~/.groovy/grapes/` on the Jenkins master. +Third-party libraries are cached by default in `~/.groovy/grapes/` on the +Jenkins master. === Loading resources -External libraries may load adjunct files from a `resources/` directory using the `libraryResource` step. -The argument is a relative pathname, akin to Java resource loading: +External libraries may load adjunct files from a `resources/` directory using +the `libraryResource` step. The argument is a relative pathname, akin to Java +resource loading: [source,groovy] ---- def request = libraryResource 'com/mycorp/pipeline/somelib/request.json' ---- -The file is loaded as a string, suitable for passing to certain APIs or saving to a workspace using `writeFile`. +The file is loaded as a string, suitable for passing to certain APIs or saving +to a workspace using `writeFile`. -It is advisable to use an unique package structure so you do not accidentally conflict with another library. +It is advisable to use an unique package structure so you do not accidentally +conflict with another library. === Pretesting library changes