Pipeline 核心语法

常用开发工具

选择任意pipeline类型的作业,点击“流水线语法”即可进入pipeline开发工具页面

Pipeline 核心语法_第1张图片

1.片段生成器

流水线代码片段生成器, 非常好用,在这里可以找到每个插件以及Jenkins内置的方法的使用方法,使用片段生成器可以根据个人需要生成方法,有些方法来源于插件,则需要先安装相关的插件才能使用

Pipeline 核心语法_第2张图片

 2.声明式语法生成器

可以生成声明式流水线语法的语句块,可以生成Pipeline各个阶段的语句

Pipeline 核心语法_第3张图片

 3.全局变量参考

这些是已经安装的Jenkins插件和Jenkins内置的全局变量清单

Pipeline 核心语法_第4张图片

 Pipeline的核心语法

声明式流水线的定义, 就一个pipeline{}

pipeline {
     //pipeline 
}

1. agent 构建节点

参数:
● any: 运行在任一可用节点。
● none:当pipeline全局指定agent为none,则根据每个stage中定义的agent运行(stage必须指定)。
● label:在指定的标签的节点运行。(标签=分组)
● node:支持自定义流水线的工作目录。

#在任一节点运行
agent any

#标签选择
agent { label "label Name" }

#自定义节点、工作目录
agent { 
   node {
      label "labelName",
      customWorkspace "/opt/agent/workspace"
   }
}

1. stages构建阶段

● 关系: 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}")
                }
            }
        }
    }
}

3. post 构建后操作

● 定义: 根据流水线的最终状态匹配后做一些操作,与stages同级
● 状态:
  ○ always:    不管什么状态总是执行
  ○ success:  仅流水线成功后执行
  ○ failure:     仅流水线失败后执行
  ○ aborted:   仅流水线被取消后执行
  ○ unstable: 不稳定状态,单侧失败等等

    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
            }
        }
        success{
            script{
                println("流水线成功后,要做的事情")
            }
        
        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }   
    }

4. environment 构建时的变量

● 定义:通过键值对(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}"
            }
        }
    }
}

当全局变量和阶段变量冲突时,全局会覆盖阶段的变量

5. options 运行时选项

常用选项:

# 设置保存最近的记录
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()
}

执行,在控制台可以看到日志输出时间

Pipeline 核心语法_第5张图片

6. parameters 流水线参数 

● 定义: 流水线在运行时设置的参数,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}"
            }
        }
    }
}

7. triggers 触发器

● 流水线的触发方式
  ○ 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"
            }
        }
    }
}

8. input 流水线交互

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......."
            }
        }
    }
}

9. when 阶段运行控制

判断条件
● 根据环境变量判断
● 根据表达式判断
● 根据条件判断(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"
            }
        }
    }
}

流水线语法

10.parallel 阶段并行

场景: 自动化测试,多主机并行发布

	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

Pipeline 核心语法_第6张图片

 11.变量参考

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"
                }
            }
        }
    }
}

执行构建时会有构建名称和描述信息:

Pipeline 核心语法_第7张图片

Jenkinsfile示例

@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

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()                 
                }
            }
        }
    }
}

你可能感兴趣的:(Jenkins,jenkins,运维)