什么是 pipeline

简单来说,就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Jenkins 2.0 以上支持。Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色。Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本,并且 Jenkins 支持从代码库直接读取脚本,从而实现了 Pipeline as Code 的理念。

Pipeline 的几个基本概念:

1、pipeline:
定义的块包含了所有的脚本内容。
2、agent:该部分指定整个 Pipeline 或特定阶段将在 Jenkins 环境中执行的位置,也就是流水线要在哪里运行,具体取决于该 agent 部分的放置位置。该部分必须在 pipeline 块内的顶层定义 ,也可以使用在 stage 级。
A、any : 在任何可用的机器上执行 pipeline
B、none :当在 pipeline 顶层使用 none 时,每个 stage 需要指定相应的 agent
3、Stage: 阶段(可以跨多个 node):
一个 Pipeline 可以划分为若干个 Stage 也就是划分为多个阶段。,每个 Stage 代表一组操作。注意,Stage 是一个逻辑分组的概念,可以跨多个 Node。一个 stages 下的多个 stage 是串行的。
4、Step: 步骤:
Step 是最基本的操作单元,小到创建一个目录,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供。同一个 stage 中的 steps 是可以并行的。
5、sh 执行 shell 命令
6、input:
需要你手动点击确定,Pipeline 才会进入后续环节,常用于部署环节,因为很多时候部署都需要人为的进行一些确认
7、post:
所有 pipeline 执行完成后,会进入 post 环节,该环节一般做一些清理工作,同时还可以判断 pipeline 的执行状态

使用条件

要使用 Jenkins Pipeline,需要:
Jenkins 2.x 或更高版本
Pipeline 插件

Pipeline 定义

Pipeline 脚本是用Groovy写的
可以通过以下任一方式创建基本 Pipeline(在 jenkins 工程页面 Pipeline 处可选择):

1、pipeline script:直接在 Web UI 的 script 输入框里面输入 pipeline script 语句即可。
2、pipeline script from SCM:需要配置 SCM 代码存储 Git 地址或 SVN 地址,指定 script 文件 Jenkinsfile(第一行 Jenkinsfile 应该是 #!/usr/bin/env groovy Jenkinsfile) 所在路径,每次构建 job 会自动去指定的目录执行 script 文件

以上两种方法定义 Pipeline 的语法都是一样的。

直接在 Web UI 中输入

pipeline{
    agent any
    stages{
        stage('stage1'){
            steps{
                echo "step1"
                echo "step1-2"
            }
        }
        stage('stage2'){
            steps{
                echo "step2"
            }
        }
        stage('stage3'){
            steps{
                echo "step3"
            }
        }
    }
}

结果:

内置文档

Pipeline 配有内置的文档功能,可以更轻松地创建不同复杂性的 Pipeline。根据 Jenkins 实例中安装的插件自动生成和更新内置文档。
1、内置文档可以在全局范围内找到:jenkins 地址/pipeline-syntax/
2、同样的文档也作为 pipeline 语法链接到任何配置的 Pipeline 的侧栏中项目

代码段生成器

1、从工程的配置中,点击 pipeline 处的 Pipeline Syntax。
2、直接访问借口 jenkins 地址/pipeline-syntax 导航到 Pipeline。
3、在内置文档处点击片段生成器。

注意

1、如果在目录了空间中生成了@tmp目录导致执行目录出错的话,需要使用 dir 方法去进入项目执行目录。
2、同样,在并发执行的过程中,有@2@3等等目录,在出现 #1 的情况时,需要注意 workspace 需要用变量表示 dir("${env.WORKSPACE}")
eg:

dir('../'){
        dir("${env.WORKSPACE}") {
            dir('workspace下面的项目目录'){
                sh label: '', script: 'cmd'
            }      
        }
    }

参考文档:
1、https://www.cnblogs.com/cay83/p/7537823.html
2、https://www.xncoding.com/2017/03/22/fullstack/jenkins02.html


↙↙↙阅读原文可查看相关链接,并与作者交流