Jenkins之pipeline语法——2023.07

简介: Jenkins之pipeline语法——2023.07

一、概述


Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化;


Pipeline 是Jenkins 2.X 的最核心的特性,帮助Jenkins 实现从CI 到 CD 与 DevOps的转变。


Pipeline 是一组插件,让jenkins 可以实现持续交付管道的落地和实施。持续交付管道是将软件从版本控制阶段到交付给用户/客户的完整过程的自动化表现。


二、Pipeline任务


Pipeline定义有两种方式:

一种是Pipeline Script ,是直接把脚本内容写到脚本对话框中

另一种是 Pipeline script from SCM (Source Control Management–源代码控制管理),即从gitlab/github/git上获得pipeline脚本–JenkisFile。

1、Pipeline Script 运行任务

pipeline{
    agent any
    stages{
        stage("first"){
            steps {
                echo 'hello world'
            }
        }
        stage("run test"){
            steps {
                echo 'run test'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}


脚本中定义了2个阶段(stage):first和run test;post是jenkins完成构建动作之后需要做的事情。

运行任务,可以看到分为3个部分,如下图所示:

f5be70bf715340a9b9ac2a2d71f6430d.png

2、Pipeline script from SCM 通过代码库运行任务

将pipeline代码(Jenkinsfile)保存到代码库中,然后通过指定代码位置(脚本位置)的方式来运行pipeline任务。

创建Jenkinsfile,由Groovy语言实现。一般是存放在项目根目录,随项目一起受源代码管理软件控制。

7d2e0d76835e4f5fbbf45dfc30e4cb71.png

Jenkinsfile :创建在根目录

脚本的第二stage 是执行pytestzwf文件下的test_json.py脚本

将项目提交到代码库。


3、在 job(任务)中配置Pipeline script from SCM


0726bf11c76c4b789655ae70d730a84f.png

e18fbac4458f4cef8eb0f85e69ac8392.png

运行任务,查看结果:

57a995299def4f80b6b056d6f5084d96.png


三、Jenkinsfile 语法


Jenkinsfile 支持两种语法形式:

Declarative pipeline – 在pipeline v2.5 之后引入,结构化方式,比较简单,容易上手。这种类似于我们在做自动化测试时所接触的关键字驱动模式,只要理解其定义好的关键词,按要求填充数据即可。入门容易,但是灵活性欠缺。

Scripted pipeline – 基于grjoovy的语法,相较于Declarative,扩展性比较高,好封装,但是有些难度,需要一定的编程工具。


1、脚本式语法

使用Groovy语法实现pipeline,脚本式语法比较灵活和方便扩展,但是需要熟悉groovy语法。

node{
    stage("编译打包"){
        // groovy语法
        try{
        }
        catch(err){
            // 异常处理代码
        }
    }
    stage("部署"){
    }
}


2、声明式语法

def getversion(){
    def version = '1.0.0'
    return version;
}
pipeline{
    agent any
    tools{
        maven 'MAVEN_HOME'
    }
    options {
    }
    environment{{
    }
    parameters {
    }
    triggers{
    }
    stages {
        stage('编译打包') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            echo '编译打包'
        }
        stage('部署') {
            steps {
                echo '部署'
            }
        }
    }
    post {
        always {
        }
        success {
        }
        failure{
        }
    }
}


必须包含在固定格式Pipeline{} 块内,每个声明语句必须独立一行,行尾无需使用分号。

块 blocks{} 只能包含章节(Sections),指令(Directves),步骤(Steps) 或 赋值语句。


Jenkins pipeline是基于Groovy语言实现的DSL,用于描述流水线如何进行,包括编译、打包、部署、测试等等步骤


1. agent :节点

必须存在,agent必须在pipeline块内的顶层定义

agent 指定了整个流水线或特定的阶段, 会在Jenkins环境中执行的位置(master节点或其它从节点运行)。可以在 pipeline 块的顶层被定义, 也可以在 stage 内定义。

any

在任何可用的代理上执行流水线或阶段。例如: agent any

none

当在 pipeline 块的顶部没有全局代理, 该参数将会被分配到整个流水线的运行中并且每个 stage 部分都需要包含他自己的 agent 部分。比如: agent none

label

在提供了标签的 Jenkins 环境中可用的代理上执行流水线或阶段。 例如: agent { label ‘my-defined-label’ }

node

agent { node { label ‘labelName’ } } 和 agent { label ‘labelName’ } 一样, 但是 node 允许额外的选项 (比如 customWorkspace )。

agent any
agent { label 'my-master'}
agent{
  node{
    label "myslave"
    customWorkspace "myworkspace"
  }
}


2. tool

Global Tool Configuration(全局工具配置)中配置的工具, tools指令能帮助我们自动下载并安装所指定的构建工具,并将其加入 PATH 变量中。这样,我们就可以在sh步骤里直接使用了。但在agent none的情况下不会生效。

tools指令默认支持3种工具:JDK、Maven、Gradle。通过安装插件,tools 指令还可以支持更多的工具。

tools {
git ‘Default’
jdk ‘JAVA_HOME’
maven ‘MAVEN_HOME’
}


3. environment

设置环境变量,可在在 pipeline中 或 stage配置


在 pipeline 中定义 environment, 表示 pipeline 全局使用的环境变量

在 stage 中定义 environment, 表示当前 stage 的环境变量


有三种引用方式:

${env.BUILD_NUMBER} 方式一,推荐使用

$env.BUILD_NUMBER 方式二,

${BUILD_NUMBER} 方式三,不推荐使用

内置的环境变量:

使用环境变量
Jenkins 流水线通过全局变量 env 提供环境变量,它在 Jenkinsfile 文件的任何地方都可以使用。Jenkins 流水线中可访问的完整的环境变量列表记录在 ``${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
运行本次构建的节点名称。对于 master 节点则为 “master”。
WORKSPACE
workspace 的绝对路径。


全局变量可以在搭建好的jenkins服务上查看,访问地址:http://jenkins访问地址/pipeline-syntax/globals#env


2. stages :阶段集

必须存在,包含顺序执行的一个或者多个stage命令

在pipeline内仅能使用一次

需要定义stage的名字


3. steps :步骤

必须存在

steps位于stage指令块内部,包含一个或者多个step

stages{
  stage("stage name"){
    steps{
      echo "this is a step"
    }
  }
}


4. post :构建后的操作


非必须

always:无论pipeline运行的完成的状态如何都会运行

success:仅当当前pipeline具有 成功 状态时才运行

failure: 仅当当前pipeline 具有 失败 状态时才运行

当然还有其他选项,这里不再做扩展介绍;


5. parameters :参数

非必须

参数化构建的参数设置,参数类型有booleanParam、choice(选择)、file、text、string 等

parameters{
        string( name :'name',defaultValue:'beauty',description:'姓名是')
}


等同于如下设置:

1d7e089c45314d408c6cf177b4f578f9.png

构建时效果如下:

4f6ff7ae2c43487d848e3ddfffd8aaf6.png

6. triggers :触发器

非必须

定义了pipeline自动化触发的方式

cron:接受一个cron风格的字符串来定义pipeline触发的常规间隔

pollSCM:接受一个cron风格的字符串来定义jenkins检查SCM源更改的常规间隔;如果存在新的更改,则pipeline将被重新触发

triggers{
  cron('*/1 * * * *')
}


每隔一分钟执行一次

triggers{
  pollSCM('*/1 * * * *')
}


每隔一分钟监控SCM源,更改即触发

6104338d6fe24e50b8a1c5cf7e32961e.png

参考文章:

jenkins-Pipeline 教程

pipeline教程

相关文章
|
7月前
|
jenkins 持续交付
Jenkins Pipeline 参数化构建
Jenkins Pipeline 参数化构建
256 0
|
4月前
|
jenkins 持续交付 开发工具
jenkins学习笔记之一:流水线基础语法
jenkins学习笔记之一:流水线基础语法
|
4月前
|
Java jenkins 持续交付
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
145 0
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
|
4月前
|
前端开发 jenkins 持续交付
jenkins学习笔记之二十:docker in docker运行pipeline
jenkins学习笔记之二十:docker in docker运行pipeline
|
4月前
|
jenkins 持续交付 网络安全
Jenkins Pipeline SSH Publisher 环境变量、参数引用 要用双引号
Jenkins Pipeline SSH Publisher 环境变量、参数引用 要用双引号
126 0
|
4月前
|
jenkins 持续交付 Windows
Jenkins Pipeline 多分支流水线 Input length = 1
Jenkins Pipeline 多分支流水线 Input length = 1
38 0
|
4月前
|
jenkins 持续交付
Jenkins Pipeline 流水线 - Parameters 参数化构建
Jenkins Pipeline 流水线 - Parameters 参数化构建
123 0
|
4月前
|
jenkins 持续交付 网络安全
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
76 0
|
4月前
|
Kubernetes jenkins 网络安全
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
53 0
|
4月前
|
jenkins 网络安全 持续交付
Jenkins Pipeline 流水线 - 上传文件 Publish over SSH + Docker 编译 + 上传到阿里仓库
Jenkins Pipeline 流水线 - 上传文件 Publish over SSH + Docker 编译 + 上传到阿里仓库
144 0