背景
介绍 Jenkins Pipeline,该工具扩展了流行的 CD(Continuous Delivery) 应用程序以管理最复杂的软件管道并帮助您持续高效地交付。
Jenkins Pipeline
Pipeline 为 Jenkins 添加了一套强大的自动化工具。它支持从简单的持续集成任务到全面的持续交付管道的软件交付。构建、测试和交付每个应用程序的步骤成为应用程序本身的一部分,存储在 Jenkinsfile 中。
Jenkins Pipeline 提供了一种特定领域的语言来创建、编辑、查看和运行软件交付管道。所有经验水平的用户都可以使用 Jenkins 随附的交互式工具快速创建 Jenkins Pipelines。
Jenkins Pipeline Visualization
Jenkins Pipelines 最好通过 Jenkins Blue Ocean 用户界面进行可视化。Jenkins Blue Ocean 用户界面专注于持续交付管道和现代开发工具的期望。只需单击一下,用户就可以在用于管理任务的传统 Jenkins 页面和 Blue Ocean 之间切换以编辑、监控和运行他们的管道。
Blue Ocean 和 Declarative Pipeline 专注于新用户和持续交付,旨在协同工作。它们使 DevOps 团队的所有成员都可以访问 Pipelines 的创建、审查和可视化。用户可以快速查看管道状态,直观地创建和编辑新管道,并个性化他们对重要管道的视图。他们可以通过分支和拉取请求的本地集成轻松协作代码更改。
System Requirements
Pipeline and Blue Ocean 适用于所有 Jenkins 2.x 版本. This Refcard is known to work with:
- Jenkins 2.204.5 or higher
- Pipeline 2.6 or higher
- Blue Ocean 1.22 or higher
要启动一个预装了 Pipeline 和 Blue Ocean 的新 Jenkins:
- Ensure Docker is installed
- Run docker run -p 8888:8080 jenkinsci/ blueocean:latest
- Browse to http://localhost:8888/blue
创建 Jenkins 文件
Blue Ocean 中的“创建管道”体验可帮助用户以清晰、简单的步骤创建新的管道。
Pipeline Editor
Blue Ocean Pipeline Editor 允许用户在选定的存储库中快速设计和保存新的 Jenkinsfile。如果存储库中已经存在 Jenkinsfile,它将改为基于现有的 Jenkinsfile 创建一个新的 Pipeline。您始终可以通过选择一个分支并单击铅笔图标在编辑器中编辑此 Jenkinsfile。
Branches and Pull Requests
在 Blue Ocean 中创建新的 Pipeline 时,它还会为存储库创建一个新的 Multibranch Pipeline 项目。Jenkins 监控这个存储库并自动为每个包含 Jenkinsfile 的分支和拉取请求创建一个新的管道。删除分支、拉取请求或 Jenkinsfile 将自动删除关联的流水线。
声明式管道可以根据分支或拉取请求调整其执行;根据用户输入调整执行;并发布测试结果并保存工件。
Pipeline基础
管道使用 Jenkinsfile 中的定义来检查代理上的代码并运行定义的阶段和步骤。所有声明式管道都必须以管道开头,并包含这四个语法正确的指令:代理、阶段、阶段和步骤。这些将在以下部分中更详细地描述。这是一个最小管道的示例:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'npm -version'
}
}
}
}
Steps and Stages
Steps:管道由构建、测试和部署应用程序的多个步骤组成。将“步骤”视为执行单个操作的单个命令。当一个步骤成功时,它会进入下一步。
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps"
ls -lah
'''
}
}
}
}
Agents
代理指令告诉 Jenkins 在哪里执行流水线阶段。大多数流水线步骤都需要适当配置的代理。
到目前为止,所有示例都使用了 agent any,它允许 Pipeline 阶段在任何可用的代理上执行。在幕后,agent 关键字会导致一些事情发生:
- 块中包含的所有步骤都排队等待 Jenkins 执行。一旦执行器可用,步骤将开始执行。
- 分配了一个工作区,其中将包含从源代码管理中签出的文件,以及管道的任何其他工作文件
Environmental Variables and Credentials
环境变量可以全局设置,如下例所示,也可以按阶段设置。如您所料,为每个阶段设置环境变量意味着它们仅适用于定义它们的阶段
pipeline {
agent any
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
可以在构建脚本中引用 Jenkinsfile 中的环境变量来改变脚本的行为。Makefile、自动化测试或部署脚本可以使用环境变量的值来执行。
环境变量的另一个常见用途是在构建或测试脚本中设置或覆盖“虚拟”凭据。Pipeline 允许用户快速安全地访问预定义的凭据,而无需知道其值,也无需将凭据存储在 Jenkinsfile 中。
Post Actions
整个 Pipeline 和每个 Stage 可以选择定义一个 post 部分。Pipeline 的这个 post 部分在封闭的 Pipeline 或 Stage 的末端运行。它对于删除文件、归档结果或发送通知很有用。帖子部分支持许多附加条件块:总是、已更改、失败、成功和不稳定。它们根据阶段的状态在阶段结束时执行
pipeline {
agent any
stages {
stage('No-op') {
steps {
sh 'ls'
}
}
}
post {
always {
echo 'Finished'
deleteDir() // Clean the workspace
}
success {
echo 'I succeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Latest job status differs from previous job status'
}
}
}
Input
通常,在阶段之间传递时,尤其是环境阶段,您可能需要人工输入才能继续。例如,要判断应用程序是否处于足够好的状态以“提升”到生产环境,这可以通过输入步骤来完成。在下面的示例中,“健全性检查”阶段会阻止输入,并且在没有人确认进度的情况下不会继续进行。输入步骤不需要代理。它应该始终从使用 agent none 的阶段运行,这样它就不会不必要地保留代理。
stage('Sanity Check') {
agent none
steps {
input 'Does the staging environment look ok?'
}
}
Advanced Pipeline Settings
Refer to the Tutorials and Jenkins Handbook at jenkins.io/doc for more information on advanced topics such as Snippet Generator, Declarative Directive Generator, Shared Libraries, Script Blocks, Pipeline Options, and Parameterized Pipelines.
Additional Resources
- Getting Started with Jenkins Pipeline
- Shared Libraries
- Blue Ocean Documentation
- Pipeline Syntax Reference
- Pipeline Steps Reference
- CloudBees University Training
refer to:Continuous Delivery With Jenkins Pipeline - DZone Refcardz