什么是Jenkins pipeline
Jenkins Pipeline是Jenkins的一个插件,它允许你以代码的方式定义和管理持续集成和交付流水线。通过Jenkins Pipeline,你可以将整个软件交付过程定义为一个可重复、可扩展和可管理的流水线。这个流水线可以包括构建、测试、部署和其他各种操作,使得软件交付过程更加自动化和可靠。Jenkins Pipeline支持使用Groovy语言编写流水线脚本,你可以通过代码的方式定义流水线的各个阶段和操作,以及它们的顺序和依赖关系。这使得流水线的定义更加灵活和可维护,同时也方便了版本控制和团队协作。
Pipeline 关键概念
以下是Jenkins Pipeline的关键概念,它们与Pipeline语法(请参阅下文概述)密切相关。
- 管道(Pipeline):一个管道是一个用户定义的CD管道模型。管道的代码定义了整个构建过程,通常包括构建应用程序、测试应用程序以及部署应用程序的阶段。
- 节点(Node):节点是一个属于Jenkins环境的机器,并且能够执行管道。
- 阶段(Stage):阶段块定义了整个管道中执行的概念上不同的任务子集(例如"构建"、"测试"和"部署"阶段),许多插件使用它来可视化或呈现Jenkins Pipeline的状态/进度。
- 步骤(Step):一个单独的任务。从根本上说,一个步骤告诉Jenkins在某个特定的时间点(或过程中的"步骤")做什么。例如,要执行shell命令make,请使用sh步骤:sh 'make'。当一个插件扩展Pipeline DSL时,[1] 这通常意味着该插件已经实现了一个新的步骤。
以下Pipeline代码框架说明了Declarative Pipeline语法和Scripted Pipeline语法之间的根本区别。
请注意,阶段和步骤(上文)是Declarative和Scripted Pipeline语法中都通用的元素。
Jenkins Pipeline 基础示例
Jenkins Pipeline 分声明式和脚本式两种,写法差不多。
1)声明式 Pipeline 示例
在声明式 Pipeline语法中,pipeline块定义了整个Pipeline中执行的所有工作。
python
pipeline {
agent any // 在任何可用的代理上执行此Pipeline或其任何阶段
stages {
stage('Build') {
steps {
git branch: 'master', credentialsId: 'gitee_wlddhj', url: 'https://gitee.com/personal_practice/demo.git'
}
}
stage('Test') {
steps {
sh label: '', script: '''
mvn clean package -Dmaven.test.skip=true -f pom.xml
'''
}
}
stage('Deploy') {
steps {
sh label: '', script: '''
cp target/*.jar /data/product/deploy/
'''
}
}
}
}
2)脚本式 Pipeline 示例
在脚本式 Pipeline语法中,一个或多个node块在整个Pipeline中执行核心工作。虽然这不是脚本式 Pipeline语法的强制要求,但将Pipeline的工作限制在一个node块中可以做两件事:
- 通过将项目添加到Jenkins队列来安排块中包含的步骤运行。一旦节点上的执行器空闲,步骤就会运行。
- 创建一个工作区(特定于该特定Pipeline的目录),可以在其中对从源控制中检出的文件进行工作。
python
node {
stage("pull code") {
git branch: 'master', credentialsId: 'gitee_wlddhj', url: 'https://gitee.com/personal_practice/demo.git'
}
stage("build") {
sh label: '', script: '''
mvn clean package -Dmaven.test.skip=true -f pom.xml
'''
}
stage("release") {
sh label: '', script: '''
cp target/*.jar /data/product/deploy/
'''
}
stage("start") {
ansiColor('xterm') {
sh "JENKINS_NODE_COOKIE=dontKillMe nohup java -jar /data/product/deploy/spring-demo-0.0.1-SNAPSHOT.jar > demo.log &"
}
}
}
注意:在shell环境中使用nohup,并且& 某个程序后,会后台执行,退出当前链接后程序依然可以执行。 但是在Jenkins pipeline中,nohup在Jenkins编译任务结束时,运行的程序会自动退出。针对该解决办法是设置系统环境变量
JENKINS_NODE_COOKIE=dontKillMe
Jenkins 环境变量
Jenkins Pipeline通过全局变量env
来公开环境变量,在Jenkinsfile的任何地方都可以使用。完整的可在Jenkins Pipeline中访问的环境变量列表在${YOUR_JENKINS_URL}/pipeline-syntax/globals#env中有详细说明,包括:
BUILD_ID
当前构建的ID,对于在Jenkins版本1.597+中创建的构建与BUILD_NUMBER相同
BUILD_NUMBER
当前构建的编号,例如"153"
BUILD_TAG
形如jenkins-${JOB_NAME}-${BUILD_NUMBER}
的字符串,方便放入资源文件、jar文件等以便更容易识别
BUILD_URL
可以找到此构建结果的URL(例如http://buildserver/jenkins/job/MyJobName/17/)
EXECUTOR_NUMBER
标识当前执行器(在同一台机器上的执行器)执行此构建的唯一编号。这是您在"构建执行器状态"中看到的编号,只是编号从0开始,而不是1
JAVA_HOME
如果您的任务配置为使用特定的JDK,则此变量设置为指定JDK的JAVA_HOME。当设置了此变量时,PATH也会更新以包括JAVA_HOME的bin子目录
JENKINS_URL
Jenkins的完整URL,例如https://example.com:port/jenkins/(注意:仅当在"系统配置"中设置了Jenkins URL时可用)
JOB_NAME
此构建的项目名称,例如"foo"或"foo/bar"
NODE_NAME
当前构建正在运行的节点的名称。对于Jenkins控制器,设置为'master'。
WORKSPACE
工作空间的绝对路径
可以像访问Groovy Map中的任何键一样引用或使用这些环境变量,例如:
groovy
pipeline {
agent any
stages {
stage('Example') {
steps {
echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
}
}
}
}
设置环境变量
在Jenkins Pipeline中设置环境变量的方法取决于使用的是声明式Pipeline还是脚本化Pipeline。
声明式Pipeline支持environment
指令,而脚本化Pipeline的用户必须使用withEnv步骤。
1)声明式Pipeline
groovy
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
DEBUG_FLAGS = '-g'
}
steps {
sh 'printenv'
}
}
}
}
2)脚本化Pipeline
groovy
node {
/* .. snip .. */
withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
sh 'mvn -B verify'
}
}