流水线(pipeline)
概述(Jenkinsfile)
JJenkins的流水线(pipeline)是其最核心的内容
在流水线中,可以创建更加灵活、更加自由的配置,同时更利于团队协作
将web-Ui的操作都落地为代码,代码配合注释更加容易阅读
流水线既能作为任务的本身,也能作为Jenkinsfile,其类似于dockerfile(将启动docker的所有命令,打包成一个文件)
Jenkins的web-ui所做的操作,也可以落地到Jenkinsfile里面,与dockerfile类似去开发
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。
语法(Jenkinsfile)
Jenkinsfile由5个
必备的组成部分
pipeline:整条流水线
agent:指定执行器
stages:所有阶段
stage:某一阶段,可有多个
steps:阶段内的每一步,可执行命令
测试
第一步:新建一个项目
创建完成后,会进入下面的ui界面,我们会发现这个界面明显比之前的更加少一点
第二步:编辑流水线
在下面的位置进行编辑,也就是Jenkinsfile的编写,类似于dockerfile,如下所示
这里有两种方式
- 直接将代码内嵌到里面,如下:在这里写完后,保存,便直接提交上去
- 从远程代码托管平台,去拉取Jenkinsfile文件,如下: 下面,便先去使用第一种方式去敲代码,直接将内容写到ui界面上面,在右侧可以去选择一些用例,选择完后,框内会自动出现例子,这里面包含了之前所说的必备的几个语法 说明:
pipeline:整条流水线
agent:指定执行器
stages:所有阶段
stage:某一阶段,可有多个
steps:阶段内的每一步,可执行命令
//可以在pipeline的上面去配置一些其他内容:如一些额外的常量的定义
pipeline {//指定执行器,在执行当前流水线得到时候,指定在那一台机器上执行//下面的配置意思是将当前pipeline的执行交给Jenkins去分配
agent any
//所有阶段
stages {//某一阶段,可有多个stage('Hello'){//阶段内的每一步,可执行命令
steps {
echo 'HelloWorld'
}}}}
如此,按下面的先测试修改一下,测试下面的Jenkinsfile
pipeline {
agent any
stages {stage('拉取代码'){
steps {
echo '拉取代码完成'}}stage('执行构建'){
steps {
echo '执行构建完成'}}}}
先将Groovy这个选项给取消掉,然后点击保存
如此,一个pipeline的项目就创建完成了
第三步:运行
点击运行,如下:在主节点运行
查看视图
进入,这个项目,会发现有有一个视图
在视图里面,可以更加清晰的去查看,下面的步骤便是之前配置的
查看输出日志
输出的内容如下:
指定阶段运行
最不一样的是其可以选择从指定阶段运行,如下:在这里便可以去重新执行某一个之前配置的阶段
更加漂亮的UI(Blue Ocean)
全新的流水线控制ui,可重复执行某阶段代码
插件中心搜索blue ocean安装即可
只需要安装一个插件即可,其实和老的ui界面功能差不多,就是界面更加好看一点
安装插件:
安装完后,在首页便可以进人查看界面了
进入后的界面如下:
点击具体的“mypipeline”,便会进入下面的界面
再去点击,便可以进入下面的界面,在这里可以去重新构建
在这个界面也可以去执行某一个阶段
使用pipeline自动打包docker镜像
Jenkinsfile配置语法
post
流水线完成后可执行的任务
- always 无论流水线或者阶段的完成状态。
- changed 只有当流水线或者阶段完成状态与之前不同时。
- failure 只有当流水线或者阶段状态为"failure"运行。
- success 只有当流水线或者阶段状态为"success"运行。
- unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。
- aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。
agent
可以指定执行节点
label 指定运行job的节点标签
any 不指定,由Jenkins分配
相关脚本片段生成器
点击下面的“流水线语法”即可进入该工具
点击后,进入下面的界面,在这个界面便可以去配置对应的片段
比如,在这里,我想去使用git,在上面的选项中,便选择上git,过后便可以与之前一样的去配置git的一些内容,最后便会去生成对应的脚本
- 测试 配置gitlab的地址和其分支 添加凭证,可以登陆到当前gitlab地址的账号密码 配置完后,生成后,内容如下:
第一步:拉取代码
按之前的步骤去配置对应的git脚本,这里我便使用上面生成的片段
第二步:执行构建
git是可以不要去配置的
在jar包构建时,需要maven,所有这里需要引入一个maven
查看之前安装的maven插件
- 进入Globalxxx 查看maven信息
- 在Jenkinsfile上去引入maven
调用maven命令,使用三个双引号可以在这个三个双引号里面写多条命令,如下:如果直接使用sh的话,这便是另外一个命令
第三步:将jar包发送到测试服务器上
使用插件将jar包发送到测试服务器上
这里因为是需要使用脚本,所以还是需要去使用之前说明的片段生成器,如下:选择sshPublisherxxx
这个配置与之前的设置的是一样的
按之前的配置完后,点击生成流水线脚本,如下:
在pipeline里面进行设置,如下
第四步:生成清理命令
在这里,还是按之前的配置这样去配置,点击生成后,便会生成对应的脚本
完整的Jenkinsfile
pipeline {
agent any
tools {
maven "maven3"}
stages {stage("拉取代码"){
steps {
git branch:'main', credentialsId:'gitlab', url: 'http://192.168.44.103/root/java-project.git'
echo '拉取成功'}}stage("执行构建"){
steps {
sh """
cd demo-1
mvn clean package
"""
echo '构建完成'}}stage("clean test server"){
steps{sshPublisher(
publishers:[sshPublisherDesc(
configName: 'testserver',
transfers:[sshTransfer(
cleanRemote:false,
excludes: '',
execCommand:
'''
rm -rf *
docker stop demo
docker rm demo
docker rmi demo
''',
execTimeout:120000,
flatten:false,
makeEmptyDirs:false,
noDefaultExcludes:false,
patternSeparator:'[, ]+',
remoteDirectory: '',
remoteDirectorySDF:false,
removePrefix: '',
sourceFiles:'/root')],
usePromotionTimestamp:false,
useWorkspaceInPromotion:false,
verbose:false)])}}stage("发送jar包到测试服务器"){
steps {sshPublisher(publishers:[sshPublisherDesc(configName: 'testserver', transfers:[sshTransfer(cleanRemote:false, excludes: '', execCommand: '', execTimeout:120000, flatten:false, makeEmptyDirs:false, noDefaultExcludes:false, patternSeparator:'[, ]+', remoteDirectory: '/jarfile', remoteDirectorySDF:false, removePrefix: 'demo-1/target', sourceFiles: '**/demo*.jar'),sshTransfer(cleanRemote:false, excludes: '', execCommand: '''docker build -t demo .
docker run -d -p 8080:8080--name demo demo''', execTimeout:120000, flatten:false, makeEmptyDirs:false, noDefaultExcludes:false, patternSeparator:'[, ]+', remoteDirectory:'/', remoteDirectorySDF:false, removePrefix: 'demo-1/docker', sourceFiles: 'demo-1/docker/dockerfile')], usePromotionTimestamp:false, useWorkspaceInPromotion:false, verbose:false)])
echo 'jar send over!'
}}}}
运行
运行后的结果如下:
- 日志
- Jenkins的镜像
这一整个过程,可以在Blue Ocean中去观察,如下:在这里可以查看更加详细的内容
Jenkinsfile创建多分支流水线
概述
现在一共有两个分支:
- 主分支
- 测试分支
Jenkins可以集成两个分支,同时去执行构建,当发现哪一个分支上的代码有变化,单独去构建某一个
比如:今晚上在test分支上提交了代码,执行一下,跑完测试后再决定要不要合并到主分支上
都是依赖于Jenkinsfile,通过Jenkinsfile去个性化的配置
测试
第一步:创建流水线
在Jenkins的Blue Ocean里面便可以直接去创建一个流水线的项目,如下:
点击后,进入下面的界面
在上面的界面,添加一个Git,出现下面的界面
在这里添加一个Git仓库
如何在这里创建一个流水线
有可能,这个ui界面创建不了Jenkinsfile,所以可能需要自己去手动创建一下
第二步:手动创建Jenkinsfile
点击项目名称边上的设置按钮
然后,会进入下面的界面
将账号密码配置上
第二个问题便是Jenkinsfile了,如下,其默认是会从项目的根目录上面去选择
在这里,将其放到项目的主目录下面,如下:
然后,点击保存
最后,主界面上会出现“Scan 多分支流水线日志内容”,如下
提示,Jenkinsfile找不到
第三步:在不同的分支下创建不一样的Jenkinsfile
所以,我们需要在项目里面新建一个Jenkinsfile,并将其提交上去
现在在main分支下,有一个Jenkinsfile,如下:
main分支下的内容如下:
master分支下的Jenkinsfile如下:
运行结果
进入Blu Ocean查看
进入分支,便可以去查看两个分支的内容
现在便可以进入对应的分支,去执行对应的构建
总结
声明式流水线(ui界面)
好处
- 更像是在Jenkins web ui中的操作
- 可读性比较高
- 可以使用blue ocean自动生成
- 支持语法检查
坏处
- 代码逻辑能力比脚本式弱,不能完成特别复杂的任务
脚本式流水线(Jenkinsfile)
好处
- 更少的代码和弱规范要求
- 更灵活的自定义代码操作
- 不受约束,可以构建特别复杂的工作流和流水线
坏处
- 读写对编程要求比较高
- 比声明式流水线代码更复杂
版权归原作者 ?abc! 所有, 如有侵权,请联系我们删除。