持续集成工具之Jenkins pipline简单示例
pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来说 Pipline 就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。
前文我们主要聊了下jenkins的插件安装、用户及权限管理、邮件发送、配置凭证到gitlab上拉取项目和创建普通job;回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13810648.html;今天我们来了解下jenkins的一个核心功能pipline以及jenkins的分布式slave节点的部署;
pipline介绍
pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来说 Pipline 就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。
pipline优势
可持续性:jenkins 的重启或者中断后不影响已经执行的 Pipline Job;
支持暂停:pipline 可以选择停止并等待人工输入或批准后再继续执行。
可扩展:通过 groovy 的编程更容易的扩展插件。
并行执行:通过 groovy 脚本可以实现 step,stage 间的并行执行,和更复杂的相互依赖关系。
pipline语法
Stage:阶段,一个 pipline 可以划分为若干个 stage,每个 stage 都是一个操作,比如 clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个 node 执行。
Node:节点,每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是 jenkins agent,node 是执行 step 的具体服务器。
Step:步骤,step 是 jenkins pipline 最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类Jenkins 插件提供实现,例如: sh “make”;
示例
node { stage("clone 代码"){ echo "代码 clone" } stage("代码构建"){ echo "代码构建" } stage("代码测试"){ echo "代码测试" } stage("代码部署"){ echo "代码部署" } }
提示:上面是pipline脚本示例,node用于指定节点,stage用于指定阶段名称;而下面的echo就是在每个阶段需要做的事;基本语法就是这样;从上面的示例不难反应一个job的工作流程;我们写pipline 构建pipline job就是根据项目构建流程来把要做的事用上述语法的形式表示出来,然后jenkins就可以根据我们定义的pipline任务,依次去各节点执行定义在自身的阶段任务;
创建pipline job
提示:新建任务要首先给任务写一个名称,然后选择流水线,点确定;
提示:我们在general写上任务描述,然后就可以直接到流水线把我们上面的pipline 示例贴在此处;
提示:选择立即构建;
提示:最后执行成功就会显示浅绿色的方格,每个方格代表一个阶段;我们可以点击方格查看对应阶段执行的操作日志;如下
当然我们也可以查看整个构建过程的日志,如下
提示:找到左下方的构建时间,点击时间后端小三角,选择console output就可以查看整个构建的日志中了;
当然,我上面只是一个很简单的测试,主要是让我们去理解pipline执行的流程和效果;
生成Groovy代码
示例:把拉取代码生成Groovy脚本
提示:点击配置,进入到配置任务的界面;
提示:找到流水线语法,然后点击跳转到另外一个页面;
提示:这里我们可以选择很多类型,比如我们要拉去代码,可以选择git:Git ;
提示:选择git:Git后,它会让我们输入仓库地址和凭证,如果这里没有凭证我们也可以选择添加凭证;选择好以后点击下面的生成流水线脚本;然后我们就可以把生成后的脚本,拷贝到我们需要执行的步骤里;
提示:编辑好pipline脚本后,点击应用,我们又可以去执行我们现在的任务;
提示:可以看到我们第二次构构建任务也是执行成功的;在克隆代码阶段,我们也可以看到jenkins到我们指定的仓库中拉去代码;
验证:在服务器上对任务目录中看看是否将gitlab上的代码拉去下来了?
提示:可以看到对应的任务目录下的确有从gitlab上拉去的文件;
pipline 中执行 shell 命令
提示:执行shell命令我用sh去执行,把要执行的shell命令用引号引起来;上面在代码构建这个阶段,用shell命令做了一件事,到test-pipline-job目录打包了所有文件,生成了一个test.tar.gz的压缩文件;
验证:执行test-pipline-job,看看服务器对应的目录下是否有test.tar.gz文件生成?
提示:从构建日志和视图上看是执行成功了;我们在去服务器上确认下
提示:在test-pipline-job目录下的确有test.tar.gz文件生成;说明我们在代码构建阶段执行的shell命令成功了;
配置jenkins的slave节点
在要成为slave节点上安装java环境
[root@node05 ~]# yum install -y java-1.8.0-openjdk-devel
验证:java环境
[root@node05 ~]# java -version openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode) [root@node05 ~]#
创建存放slave数据的目录
[root@node05 ~]# mkdir /data/jenkins/slave01 -p [root@node05 ~]# tree /data /data └── jenkins └── slave01 2 directories, 0 files [root@node05 ~]#
在jenkinsweb图形界面找到节点管理,选择新建节点
提示:填写slave节点名称或者IP地址,然后选择固定节点,然后点击确定;
提示:填写对应的信息,在启动方式里选择SSH,然后主机就写slave主机的ip地址,然后选择凭证,如果没有就选择添加;
提示:这里把连接slave节点的用户和密码填写上;也可以选择公钥私钥,然后把私钥放上去也行;填写好,点添加;然后在凭证里再选我们添加的凭证;
提示:这里如果是第一次连接slave我们要选择为验证那个选项,这样jenkins去用ssh连接slave出现输入yes,它会帮我们输入,否则jenkins会连接上不是;如果之前用ssh连接过slave,host key验证我们可以选择第一个know那个;选择好以后点击保存就好;
提示:以上就是成功将192.168.0.45配置成jenkins的slave节点的状态,如果我们添加到对应节点上有小红叉,说明我们添加slave节点有问题;我们可以查看日志,来排查对应的错误;
查看slave构建日志
提示:从上面日志上,我们可以看到jenkins启动slave时,首先会去我们指定的数据目录找java命令,然后返回java的版本,然后启动一个sftp线程,拷贝remoting.jar到我们指定的数据目录,然后在slave节点上执行 java -jar 把对应的jar包运行起来;
验证:在192.168.0.45上查看是否运行了remoting.jar的进程
提示:可以看到在192.168.0.45上,运行了一个remoting.jar的jave进程;
配置 slave 执行 job
执行job
提示:这里提示我们执行job失败,说没有git;我们在slave节点上安装git命令
[root@node05 ~]# yum install git -y
再次构建job,看看是否能够够构建成功?
提示:这里这个错误严格上不应该出现,我们在pipline中写的构建代码,cd的目录在slave上是不存在的,所以构建代码这一步就失败了;
修改pipline脚本,然后重新构建job
再次构建
查看执行job日志
提示:在日志中的确可以看到,执行过程是在我们指定的slave节点上执行的;
验证:去slave节点上对应目录下看看是否有test.tar.gz生成?
提示:可以看到slave节点上对应目录下生成了我们指定打包文件;