选择任意pipeline类型的作业,点击“流水线语法”即可进入pipeline开发工具页面
流水线代码片段生成器, 非常好用,在这里可以找到每个插件以及Jenkins内置的方法的使用方法,使用片段生成器可以根据个人需要生成方法,有些方法来源于插件,则需要先安装相关的插件才能使用
可以生成声明式流水线语法的语句块,可以生成Pipeline各个阶段的语句
这些是已经安装的Jenkins插件和Jenkins内置的全局变量清单
声明式流水线的定义, 就一个pipeline{}
pipeline {
//pipeline
}
参数:
● any: 运行在任一可用节点。
● none:当pipeline全局指定agent为none,则根据每个stage中定义的agent运行(stage必须指定)。
● label:在指定的标签的节点运行。(标签=分组)
● node:支持自定义流水线的工作目录。
#在任一节点运行
agent any
#标签选择
agent { label "label Name" }
#自定义节点、工作目录
agent {
node {
label "labelName",
customWorkspace "/opt/agent/workspace"
}
}
● 关系: stages > stage > steps > script
● 定义:
○ stages:包含多个stage阶段
○ stage: 包含多个steps步骤
○ steps: 包含一组特定的脚本(加上script后就可以实现在声明式脚本中嵌入脚本式语法了)
#在声明式语法中可以嵌入脚本式语法:
pipeline{
agent{label "build"}
stages{
stage('echo the rr'){
steps{
script{
a = 1
println("${a}")
}
}
}
}
}
● 定义: 根据流水线的最终状态匹配后做一些操作,与stages同级
● 状态:
○ always: 不管什么状态总是执行
○ success: 仅流水线成功后执行
○ failure: 仅流水线失败后执行
○ aborted: 仅流水线被取消后执行
○ unstable: 不稳定状态,单侧失败等等
post {
always{
script{
println("流水线结束后,经常做的事情")
}
}
success{
script{
println("流水线成功后,要做的事情")
}
}
failure{
script{
println("流水线失败后,要做的事情")
}
}
}
● 定义:通过键值对(k-v)格式定义流水线在运行时的环境变量, 分为流水线级别和阶段级别。
流水线级别环境变量参考
pipeline{
environment{
NAME = "Nannan Yang"
SEX = "girl"
AGE = "18"
}
agent{ label "build"}
stages{
stage("student informantion"){
steps{
echo "${NAME} is an ${AGE} year old ${SEX}"
}
}
}
}
当全局变量和阶段变量冲突时,全局会覆盖阶段的变量
常用选项:
# 设置保存最近的记录
options { buildDiscarder(logRotator(numToKeepStr: '1')) }
# 禁止并行构建
options { disableConcurrentBuilds() }
# 跳过默认的代码检出
options { skipDefaultCheckout() }
# 设定流水线的超时时间(可用于阶段级别)
options { timeout(time: 1, unit: 'HOURS') }
# 设定流水线的重试次数(可用于阶段级别)
options { retry(3) }
# 设置日志时间输出(可用于阶段级别)
options { timestamps() }
示例1
使用options定义可以设置丢弃旧的构建
pipeline{
agent{ label "build"}
options {
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '10', numToKeepStr: '4')
}
stages{
stage("hello"){
steps{
echo "hello"
}
}
}
}
示例2
安装timestamper插件,添加运行时选项 timestamps 在控制台可输出时间,可以在pipeline级和stage级使用
options{
timestamps()
}
执行,在控制台可以看到日志输出时间
● 定义: 流水线在运行时设置的参数,UI页面的参数,所有的参数都存储在params对象中。
示例:配置选择参数和字符参数并调用参数
pipeline{
agent{ label "build"}
parameters{
string defaultValue: 'lovely', description: '姓名', name: 'name', trim: true
choice choices: ['girl', 'boy'], description: '选择性别:', name: 'SEX'
}
stages{
stage("lovely"){
options{
timestamps()
}
steps{
echo "${params.name} is a ${params.SEX}"
}
}
}
}
● 流水线的触发方式
○ cron 定时触发: triggers { cron('H */7 * * 1-5') }
○ pollSCM: triggers { pollSCM('H */7 * * 1-5') }
示例1 每分钟构建一次
pipeline{
agent{ label "build"}
triggers {
cron '*/1 * * * *'
}
stages{
stage("lovely"){
options{
timestamps()
}
steps{
echo "lovely"
}
}
}
}
示例2 只有任务test pipeline 稳定构建时触发
pipeline{
agent{ label "build"}
triggers{
upstream 'test pipeline, '
}
stages{
stage("lovely"){
options{
timestamps()
}
steps{
echo "lovely"
}
}
}
}
pipeline交互,在阶段中定义,参数解析如下:
● message: 提示信息
● ok: 表单中确认按钮的文本
● submitter: 提交人,默认所有人可以
● parameters: 交互时用户选择的参数
pipeline {
agent any
stages {
stage('Deploy') {
input {
message "是否继续发布"
ok "Yes"
submitter "zeyang,aa"
parameters {
string(name: 'ENVTYPE', defaultValue: 'DEV', description: 'env type..[DEV/STAG/PROD]')
}
}
steps {
echo "Deploy to ${ENVTYPE}, doing......."
}
}
}
}
判断条件
● 根据环境变量判断
● 根据表达式判断
● 根据条件判断(not/allOf/anyOf)
示例1 当变量为某值时构建
pipeline{
agent{ label "build"}
environment{
name = "lovely"
}
stages{
stage("lovely"){
options{
timestamps()
}
when{
environment name: 'name', value: 'lovely'
}
steps{
echo "lovely"
}
}
}
}
流水线语法
场景: 自动化测试,多主机并行发布
stages {
stage("colors"){
……………
}
stage("并行的stage"){
parallel{
stage('Stage2.1'){
agent { label "build" }
steps{
echo "${params.enter}"
}
}
stage("Stage2.2"){
agent { label "build" }
steps{
echo "${params.env}"
}
}
}
}
}
blue ocean 下可以看到并行执行的stage
Jenkins变量:
1.内置变量(全局)
2.Pipeline中定义的变量(全局/局部)
3.JenkinsUI的参数化构建,这些参数也是Jenkins全局变量,与内置变量的引用方式相同
常见内置变量:
BUILD_NUMBER //构建号
BUILD_ID //构建号
BUILD_DISPLAY_NAME //构建显示名称
JOB_NAME //项目名称
EXECUTOR_NUMBER //执行器数量
NODE_NAME //构建节点名称
WORKSPACE //工作目录
JENKINS_HOME //Jenkins home
JENKINS_URL //Jenkins地址
BUILD_URL //构建地址
JOB_URL //项目地址
示例1 可以直接引用内置变量
echo "${WORKSPACE}"
echo "${JOB_URL}"
示例2 currentBuild变量 添加构建名称和描述
在流水线语法-全局变量参考中可以看到相关currentBuild
displayName //构建名称
description //构建描述
duration //持续时间
添加构建名称和描述
pipeline{
agent{ label "build"}
stages{
stage("lovely"){
steps{
script{
echo "${WORKSPACE}"
echo "${JOB_URL}"
currentBuild.displayName = "#pipeline-test"
currentBuild.description = "Trigger by gitlab"
}
}
}
}
}
执行构建时会有构建名称和描述信息:
@Library('mylib') _
def mytools = new org.devops.tools()
pipeline {
agent { label "build" }
options{
timeout(time: 1,unit:'HOURS')
timestamps()
}
parameters {
string defaultValue: 'yes', description: '执行', name: 'enter'
choice choices: ['dev', 'test', 'prd'], description: '环境', name: 'env'
}
environment{
colors = "\033[40;32m >>>>>>>>>>>绿色<<<<<<<<<<< \033[0m"
}
stages {
stage("colors"){
steps{
script{
ansiColor('xterm') {
println(colors)
}
}
}
}
stage("并行的stage"){
parallel{
stage('Stage2.1'){
agent { label "build" }
steps{
echo "${params.enter}"
}
}
stage("Stage2.2"){
agent { label "build" }
steps{
echo "${params.env}"
}
}
}
}
}
post{
failure{
echo "pipeline failure "
}
success{
echo "pipeline success "
}
}
}
DSL (Domain Specific Language) 领域特定语言,针对一个特定的领域,具有受限表达性的一种计算机程序语言,Jenkinsfile 的DSL可以通过片段生成器生成,常用DSL有:
checkout //checkout下载代码
withCredentials //使用凭证作为变量值
input //流水线交互
cleanWs //清理workspace
publishHTML //生成HTML报告
emailext //邮件通知
示例:
@Library('mylib') _
def mytools = new org.devops.tools()
pipeline{
agent any
stages{
stage('stage 1'){
steps{
script{
//checkout下载代码
checkout([$class: 'GitSCM', branches: [[name: 'main']], extensions: [], userRemoteConfigs: [[credentialsId: '872b5193-dfe4-4b6c-bacf-16f3e8758751', url: 'http://10.40.18.118/root/jenkinslib.git']]])
//withCredentials使用凭证作为变量值
withCredentials([usernamePassword(credentialsId: '872b5193-dfe4-4b6c-bacf-16f3e8758751', passwordVariable: 'password', usernameVariable: 'username')]){
println(username)
println(password)
}
}
}
}
stage('stage 2'){
steps{
script{
//input流水线交互
input message: '是否执行流水线', ok: 'YES', parameters: [choice(choices: ['dev', 'prd'], description: '选择发布环境', name: 'ENV')], submitter: 'ruonan.yang'
//清理workspace
cleanWs()
}
}
}
}
}