39、jenkins持续集成(二)
在38、jenkins持续集成(一)中,我们介绍完了基于free style的持续集成构建接下来我们来学习pipeline实现的持续集成构建为什么之前已经有基于free style的持续集成了,还需要pipeline?在基于free style的持续集成中,我们发现都是界面化的配置,而且一旦jenkins宕机了就无法修改了而pipeline模式主要是依靠脚本化代码化的方式实现持续集成,更利于我们维
目录
前言
在38、jenkins持续集成(一)中,我们介绍完了基于free style的持续集成构建
接下来我们来学习pipeline实现的持续集成构建
一、pipeline简介
为什么之前已经有基于free style的持续集成了,还需要pipeline?
在基于free style的持续集成中,我们发现都是界面化的配置,而且一旦jenkins宕机了就无法修改了
而pipeline模式主要是依靠脚本化代码化的方式实现持续集成,更利于我们维护,当然相对于free style门槛更高
对于比较复杂的构建,已经我们很关心构建过程,不希望构建丢失建议使用pipeline
- pipeline是什么:
- jenkins pipeline实际上是基于Groovy语言实现的CI/CD领域的特定语言(DSL);
- Pipeline 支持两种语法:Declarative Pipeline(声明式)和 Scripted Pipeline(脚本式)语法
- Declarative Pipeline 体验上更接近于我们熟悉的 travis CI的travis.yml,通过声明自己要做的事情来规范流程
二、pipeline实现持续集成
需要提前安装好pipeline插件,参考:https://blog.csdn.net/qq23001186/article/details/126372380
1 - 新建pipeline任务
- 新建任务

- 描述根据自己需求填写

- 流水线 -> hello world

- 我们基于hello world 改造
- stages:相当于每个阶段,如拉取代码、构建项目、部署项目
- steps:相当于步骤
pipeline {
agent any
stages {
stage('pull code') {
steps {
echo 'pull code'
}
}
stage('build project') {
steps {
echo 'pull project'
}
}
stage('deploy project') {
steps {
echo 'deploy project'
}
}
}
}
- 构建


2 - 利用流水线语法生成脚本
- 流水线语法地址:http://192.168.124.61:8088/job/pipeline-test/pipeline-syntax/(IP根据自己安装的jenkins修改)






3 - 将流水线语法添加到之前的任务中
-
构建之前我们先进入pipeline-test目标新建target目录及good.txt

-
删除目标服务器之前使用free style构建传输的文件

pipeline {
agent any
stages {
stage('pull code') {
steps {
git credentialsId: 'gin-test-jenkins', url: 'https://github.com/qq23001186/gin_test.git'
}
}
stage('build project') {
steps {
sh '''echo “开始构建”
echo “构建完成”'''
}
}
stage('deploy project') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.124.51', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo “jenkins test success”', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'gin_test', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
- 查看构建结果



三、Jenkinsfile管理构建pipeline脚本
上面我们依然是在jenkins中使用pipeline脚本构建,如果jenkins挂掉了,而我们的pipeline脚本很重要,这就丢失了
同时我们也希望,pipeline的脚本也跟我们的代码一样有版本控制的功能
1 - git添加Jenkinsfile和传输文件
- 在github项目的根目录下新建一个文件:
Jenkinsfile
pipeline {
agent any
stages {
stage('pull code') {
steps {
git credentialsId: 'gin-test-jenkins', url: 'https://github.com/qq23001186/gin_test.git'
}
}
stage('build project') {
steps {
sh '''echo “开始构建”
echo “构建完成”'''
}
}
stage('deploy project') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.124.51', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo “jenkins test success”', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'gin_test', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
- 在项目中新建一个文件夹,并且新建一个文件goods.txt

2 - 测试流水线
- 流水线方式修改为:Pipeline script from SCM,指定git项目地址和Credentials

- 脚本路径:这里自动识别出来了,我们不需要更改

- 清空jenkins中workspace下的所有文件

- 删除目标服务器下的gin_test目录

- pipeline构建测试


四、构建触发器
1 - 其他工程构建后触发


2 - 触发远程构建


3 - 定时构建
- 定时构建语法:
* * * * *;定时字符串从左到右依次为 -> 分 时 日 月 周;* 等同于H,表示任意一个合理的数;- 第一个*表示分钟,取值0-59,若其他值不做设定,则表示每个设定的分钟都会构建;如
5 * * * *,表示每个小时的第5分钟都会构建一次 - 第二个*表示小时,取值0-23,若其他值不做设定,则表示每个设定小时的每分钟都会构建;如
* 5 * * *,表示在每天5点的时候,一小时内每一分钟都会构建一次 - 第三个*表示一个月的第几天,取值1-31,若其他值不做设定,则表示每个月的那一天每分钟都会构建一次;如
* * 5 * *,表示在每个月5号的时候,0点开始每分钟构建一次 - 第四个*表示第几月,取值1-12,若其他值不做设定,则表示每年的那个月每分钟都会构建一次;如
* * * 5 *,表示每年的5月份,1号0点开始每分钟构建一次 - 第五个*表示一周中的第几天,取值0-7,其中0和7代表的都是周日,若其他值不做设定,则表示每周的那一天几,每分钟都会构建一次;
* * * * 5,表示每周五0点开始每分钟构建一次
- 第一个*表示分钟,取值0-59,若其他值不做设定,则表示每个设定的分钟都会构建;如
- 构建实例
- 每天凌晨2:00跑一次:
H 2 * * * - 每隔5分钟构建一次:
H/5 * * * * - 每2小时构建一次:
H H/2 * * * - 每天中午12点定时构建一次:
H 12 * * *或0 12 * * *(0这种写法已被H替代了) - 每天下午18点前定时构建一次:
H 18 * * * - 每15分钟构建一次:
H/15 * * * *或*/15 * * * *(这种已经被第一种替代了,jenkins也不推荐这种写法了) - 周六到周日,18点-23点,三小时构建一次:
H 18-23/3 * * 6-7 - 如果是每分钟都执行一次构建:
*/1 * * * *,注意这里不能用H,否则触发不了
- 每天凌晨2:00跑一次:


4 - 轮询SCM构建
- 轮询SCM虽然也是基于corn的方式:但是和定时构建的区别在于,如果代码没有变更,SCM不会触发构建

五、参数化pipeline构建
之前虽然我们使用Jenkinsfile的方式将构建脚本放到了git上,但是pipeline脚本中有很多参数被写死了
例如,服务器的ip地址,shell脚本提示等
我们可以使用参数化构建过程来解决这个问题



- 返回回来的时候按钮文字就改变了:Build with Parmeters

- Jenkinsfile修改:将之前的
remoteDirectory: 'gin_test'修改为remoteDirectory: '${remote_dir}'
pipeline {
agent any
stages {
stage('pull code') {
steps {
git credentialsId: 'gin-test-jenkins', url: 'https://github.com/qq23001186/gin_test.git'
}
}
stage('build project') {
steps {
sh '''echo “开始构建”
echo “构建完成”'''
}
}
stage('deploy project') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.124.51',
transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: 'echo “jenkins test success”',
execTimeout: 120000, flatten: false, makeEmptyDirs: false,
noDefaultExcludes: false, patternSeparator: '[, ]+',
remoteDirectory: '${remote_dir}', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'target/**')],
usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}


魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)