一、简单例子
Jenkins流水线是通过Jenkinsfile
配置文件配置的。Jenkinsfile文遵循Groovy风格的规范。项目从开发到部署一般都经历,构建,测试,部署三个阶段。现在用流水线模拟这个过程(使用上个例子的my_pipeline项目):
将Jenkinsfile改成:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
}
}
}
}
构建成功后,查看控制台输出。stages是一系列阶段,steps是每个阶段要执行的步骤。
二、如何创建Jenkins流水线
- 通过Blue Ocean -在Blue Ocean 中建立管道项目后,Blue Ocean UI可以帮助您编写管道的Jenkinsfile并将其提交给源代码管理。
- 通过经典UI,您可以通过经典UI直接在Jenkins中输入基本的Pipeline。
- 在SCM中,您可以手动编写Jenkinsfile,并将其提交到项目的源代码管理存储库中。
Blue Ocean是Jenkins 插件,后面再谈。上个例子就是通过经典UI创建的流水线。
三、使用环境变量
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
当前生成正在运行的节点的名称。
WORKSPACE
工作空间的绝对路径
例子:修改my_pipeline的Jenkinsfile为:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo "BUILD_ID is ${env.BUILD_ID}"
echo "BUILD_NUMBER is ${env.BUILD_NUMBER}"
echo "BUILD_TAG is ${env.BUILD_TAG}"
echo "BUILD_URL is ${env.BUILD_URL}"
echo "EXECUTOR_NUMBER is ${env.EXECUTOR_NUMBER}"
echo "JAVA_HOME is ${env.JAVA_HOME}"
echo "JENKINS_URL is ${env.JENKINS_URL}"
echo "JOB_NAME is ${env.JOB_NAME}"
echo "NODE_NAME is ${env.NODE_NAME}"
echo "WORKSPACE is ${env.WORKSPACE}"
}
}
}
}
构建完成后查看控制台输出:
上面的是内置的环境变量,现在来自定义环境变量,修改Jenkinsfile为:
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
steps {
echo "CC is ${env.CC}"
}
}
}
}
构建成功后查看控制台输出:
环境变量可以在运行时设置,并且可以由shell脚本(sh)、Windows批处理脚本(bat)和PowerShell脚本(PowerShell)使用。每个脚本都可以是returnStatus或returnStdout。修改Jenkinsfile为:
pipeline {
agent any
environment {
CC = """${sh(
returnStdout: true,
script: 'echo "clang"'
)}"""
EXIT_STATUS = """${sh(
returnStatus: true,
script: 'exit 1'
)}"""
}
stages {
stage('Example') {
steps {
echo "CC is ${env.CC}"
echo "EXIT_STATUS is ${env.EXIT_STATUS}"
}
}
}
}
构建成功后查看控制台输出:
字符串插值
Jenkins Pipeline使用与Groovy相同的规则进行字符串插值。Groovy支持用单引号或双引号声明字符串,例如:
def singlyQuoted = 'Hello'
def doublyQuoted = "World"
只有后一个字符串将支持基于美元符号($)的字符串插值,例如:
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
输出:
Hello Mr. ${username}
I said, Hello Mr. Jenkins
敏感环境变量的插值
Groovy字符串插值可能会泄露敏感的环境变量(即凭据)。这是因为敏感的环境变量将在Groovy评估期间进行插值,并且环境变量的值可能比预期的更早可用,从而导致敏感数据在各种上下文中泄漏。要避免字符串可以使用单引号。
通过插值注入
另一个注意事项。对用户控制的变量使用Groovy字符串插值,步骤将参数传递给命令解释器,如sh、bat、powershell或pwsh步骤,可能会导致类似于SQL注入的问题。当使用Groovy插值将包含特殊字符(例如/$&%^><|;)的用户控制变量(通常是环境变量,通常是传递给构建的参数)传递给sh、bat、powershell或pwsh步骤时,就会发生这种情况。举个简单的例子:
pipeline {
agent any
parameters {
string(name: 'STATEMENT', defaultValue: 'hello; ls /', description: 'What should I say?')
}
stages {
stage('Example') {
steps {
sh("echo ${params.STATEMENT}")
}
}
}
}
执行sh时会执行echo hello; ls /。会输出hello,同时会将根目录列举出来。修改Jenkinsfile,构建项目查看控制台输出:
使用参数
声明性管道支持开箱即用的参数,允许管道在运行时通过parameters指令接受用户指定的参数。修改Jenkinsfile为:
pipeline {
agent any
parameters {
string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
}
stages {
stage('Example') {
steps {
echo "${params.Greeting} World!"
}
}
}
}
构建成功后查看控制台输出: