Jenkins+Pipeline+Gitee本地自动化部署(Windows平台)——看完不会用你打我
目前DevOps和CI/CD正在大行其道,各家公司都有自己的产品,主要分为两类:微软的TFS、开源的Jenkins,目前来看Jenkins由于其开源性、丰富的组件更受欢迎。我去年就想学习一下Jenkins,不过由于各种原因直到最近才把本地自动化部署完整的弄出来,难度其实并不高,今天把文章发出来一是为了做个记录,二是希望能让新入门的朋友有一个参考。本文略过了Jenkins的安装过程,请大家安装完毕后
目前DevOps和CI/CD正在大行其道,各家公司都有自己的产品,主要分为两类:微软的TFS、开源的Jenkins,目前来看Jenkins由于其开源性、丰富的组件更受欢迎。我去年就想学习一下Jenkins,不过由于各种原因直到最近才把本地自动化部署完整的弄出来,难度其实并不高,今天把文章发出来一是为了做个记录,二是希望能让新入门的朋友有一个参考。本文略过了Jenkins的安装过程,请大家安装完毕后再参考本文实现自动化部署。
一、安装插件
1、操作路径:Manage Jenkins/Manage Plugins/可选插件/输入插件名称
2、Pipeline: Declarative:使用声明式编写流水线脚本所需的插件
3、Gitee:连接Gitee所需的插件
4、PowerShell:调用PowerShell脚本所需的插件
5、Timestamper:日志内容会包含时间信息所需的插件
注意:安装完插件后一定要在services.msc中重启Jenkins服务
二、创建流水线任务
1、新建Item/创建一个新任务-->选择流水线
三、添加Gitee配置
1、操作路径:Manage Jenkins/Configure System/Gitee配置
2、设置链接名:Gitee_DapperCore
3、设置Gitee域名URL:https://gitee.com/
4、在Gitee中添加Gitee API V5 的私人令牌:在Gitee登录状态下打开https://gitee.com/profile/personal_access_tokens
5、在Jenkins中添加Gitee API令牌
6、选择证书令牌
7、测试链接
四、管理凭据
1、我们上一步选择证书令牌时,需要先创建凭据然后才能选择证书令牌,Jenkins中有两处地方可以管理凭据
2、管理凭据1处:Manage Jenkins/Manage Credentials
3、管理凭据2处:点击A文件夹/凭据
五、使用流水线语法帮助工具
1、流水线脚本使用Groovy语法,为了降低用户的学习成本,Jenkins提供了帮助工具把常用脚本转换为Groovy语法
2、任务内部有"流水线语法"菜单
3、利用帮助工具把指定脚本转换为流水线语法
六、配置流水线任务
1、打开配置界面
2、配置General
3、配置流水线
4、保存配置并测试构建(到此为止Jenkins手动发布配置完毕,文章末尾有流水线脚本代码)
七、自动化部署
Jenkins是CI/CD的利器仅实现手动发布肯定不是我们的最终目标,大多数情况我们会希望当Gitee代码库有了新提交就自动编译、部署,下面就详细讲解如何实现这一效果。
1、配置流水线任务的构建触发器
2、修改 "需要在 Gitee webhook 中填写的URL"
有时 "需要在 Gitee webhook 中填写 URL" 的值是 "http://localhost:8080/xxx" ,对于这种情况我们要修改Jenkins URL。
3、把 "需要在 Gitee webhook 中填写的URL" 转换为外网地址
如果 "需要在 Gitee webhook 中填写的URL" 本来就是外网地址则无需转换,否则才将其转换为外网地址。
具体转换步骤请参考:https://blog.csdn.net/liqing0013/article/details/80731757
4、在Gitee中添加Web Hook
5、选择 "允许触发构建的分支"
如果想任何分支提交都触发构建,就选择 "允许所有分支触发构建" ;
如果想仅当master分支提交时才触发构建,就选择 "根据分支名过滤",包括输入框填写 "master" ;
6、选择 "允许触发构建的分支" 不同项所造成的影响(到此为止Jenkins自动发布配置完毕)
注意:如果是直接在Gitee代码库中修改代码然后提交来触发Jenkins自动构建,如果重复修改一个文件,则提交一次之后最好刷新一下Gitee页面再进行下一次修改和提交,否则有可能出现触发失败的情况。
八、流水线测试脚本
#!groovy
String workspace = "D:/opt/Jenkins/workspace";
String sourceCodePath = "";
pipeline{
agent {
node{label "master" //指定运行节点的标签或者名称
customWorkspace "${workspace}" //指定运行工作目录(可选)
}
}
options {
timestamps() //日志内容会包含时间信息,需要安装Timestamper插件
skipDefaultCheckout() //删除隐式checkout scm语句
disableConcurrentBuilds() //禁止并行
timeout(time:1,unit:'HOURS') //流水线超时时间设置为1h
}
stages {
//下载代码
stage("GetCode"){ //阶段名称
steps{ //步骤
timeout(time:5, unit:"MINUTES"){ //步骤超时时间
script{ //填写运行代码
println('获取代码');
}
}
}
}
//代码扫描
stage("ScanCode"){ //阶段名称
steps{ //步骤
timeout(time:20, unit:"MINUTES"){ //步骤超时时间
script{ //填写运行代码
println('扫描代码');
}
}
}
}
//构建
stage("Build"){ //阶段名称
steps{ //步骤
timeout(time:10, unit:"MINUTES"){ //步骤超时时间
script{ //填写运行代码
println('应用打包');
}
}
}
}
//代码发布
stage("Release"){ //阶段名称
steps{ //步骤
timeout(time:20, unit:"MINUTES"){ //步骤超时时间
script{ //填写运行代码
println('发布代码');
}
}
}
}
}
post{
always{ //总是执行的脚本片段
script {
println('always');
}
}
success{ //成功后执行
script {
currentBuild.description += "\n 构建成功"; //currentBuild是一个全局变量
}
}
failure{ //失败后执行
script {
currentBuild.description += "\n 构建失败";
}
}
aborted{ //取消后执行
script {
currentBuild.description += "\n 构建取消";
}
}
}
}
如果觉得文章写的不错,请点赞、评论支持一下,如果有其他问题同样欢迎在评论区留言。
更多推荐
所有评论(0)