Jenkins Pipeline是Jenkins的一个插件,它允许你以代码的方式定义和管理持续集成和交付流水线。通过Jenkins Pipeline,你可以将整个软件交付过程定义为一个可重复、可扩展和可管理的流水线。这个流水线可以包括构建、测试、部署和其他各种操作,使得软件交付过程更加自动化和可靠。Jenkins Pipeline支持使用Groovy语言编写流水线脚本,你可以通过代码的方式定义流水线的各个阶段和操作,以及它们的顺序和依赖关系。这使得流水线的定义更加灵活和可维护,同时也方便了版本控制和团队协作。
以下是Jenkins Pipeline的关键概念,它们与Pipeline语法(请参阅下文概述)密切相关。
以下Pipeline代码框架说明了Declarative Pipeline语法和Scripted Pipeline语法之间的根本区别。
请注意,阶段和步骤(上文)是Declarative和Scripted Pipeline语法中都通用的元素。
Jenkins Pipeline 分声明式和脚本式两种,写法差不多。
1)声明式 Pipeline 示例
在声明式 Pipeline语法中,pipeline块定义了整个Pipeline中执行的所有工作。
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块中可以做两件事:
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 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中的任何键一样引用或使用这些环境变量,例如:
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
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
DEBUG_FLAGS = '-g'
}
steps {
sh 'printenv'
}
}
}
}
2)脚本化Pipeline
node {
/* .. snip .. */
withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
sh 'mvn -B verify'
}
}