一、master分支构建报错问题

在前一章我们实现了不同版本快速进行交付,但我们如果不选择分支直接构建就会报错了

1、尝试添加条件分支,master主分支镜像名为latest

我们前面构建镜像的时候选择的是以tag标签作为镜像的版本信息,当我们没有选择任何标签时,他会根据我们配置的默认值origin/master 主分支去构建,这样一来我们就要走两条路 master和tag版本,我们在构建镜像和部署/更新的任务中添加条件分支

        stage('4、通过jenkins主机构建docker镜像') {steps() {echo '通过jenkins主机构建docker镜像   - SUCCESS'script{if ("${tag}" == "origin/master" ){sh '''mv ./target/*.jar docker/docker build -t "${JOB_NAME}:latest" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:latestdocker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''}else{sh '''mv ./target/*.jar docker/docker build -t "${JOB_NAME}:${tag}" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:${tag}  ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''}}}}stage('5、发送Chart包到K8master主机 通过helm部署, 这里多写了个第6步已经删了') {steps() {echo '发送Chart包到K8master主机   - SUCCESS'script{  //这里当我们是master分支时 上传的镜像为latestif ("${tag}" == "origin/master" ){sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:latest --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}else {sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:${tag} --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}}

我们上面做了两条分支路线,当master时把镜像打成latest标签,并更新为latest,当为其他标签时和之前的步骤一样

构建是能够通过的,但是存在一个问题,当我们多次构建master分支的时候,因为helm识别镜像并没有被修改,所以不会更新,下面我们做个测试

2、修改输出代码上传

我们这里修改一下输出的值,然后去jenkins构建,如果成功,容器会重启,访问页面会为V6.0.0才对

测试构建

从结果可以看到,我们虽然用最新代码构建了,但是实际部署的容器并没有更新

3、测试 用latest标签构建更新

上面说了我们helm在更新时发现原来更新的镜像都是latest,helm认为并没有发生修改,所以不会去更新pod,我们应该让这个标签流动起来做为一个动态标签,这里我们使用git commithash的值作为最新的标签

cd /apps/devops_setup/data/jenkins/data/workspace/pipeline//查看
git log 

我们每次git写入到仓库都会生成一个commit hash值,可以通过这个值找到对应的操作,我们最新版本的镜像就以这个标签来指定

4、jenkinsfile全量配置整理

pipeline {agent anyenvironment {harborUser  = 'admin'harborPasswd  = 'Harbor12345'harborAddress = '101.43.4.210:30007'harborRepo   = 'repo'GIT_COMMIT_HASH = ""}stages {stage('1、 拉取gitlab上的代码到jenkins主机  ') {steps() {echo '拉取git仓库代码 - SUCCESS'checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://101.43.4.210:30001/root/mytest.git']]])}}stage('2、通过jenkins本机的maven+jdk来实现编译打包') {steps() {echo '通过maven构建项目 - SUCCESS'sh '/var/jenkins_home/maven/bin/mvn  clean package -DskipTests'}}stage('3、通过SonarQube做代码质量检测') {steps() {echo '通过SonarQube做代码质量检测  - SUCCESS'sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsoanr.sources=./  -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target -Dsonar.login=squ_3005d10215abc1ac559457cc90ba804c6c477c0c'           }}stage('4、通过jenkins主机构建docker镜像') {steps() {script {GIT_COMMIT_HASH = sh (script: "git log -n 1 --pretty=format:'%H'", returnStdout: true)if ("${tag}" == "origin/master" ){echo '通过jenkins主机构建docker镜像   - SUCCESS'sh """mv ./target/*.jar docker/docker build -t "${JOB_NAME}:latest" ./docker/docker build -t "${JOB_NAME}:${GIT_COMMIT_HASH}" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:${GIT_COMMIT_HASH}docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:latestdocker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${GIT_COMMIT_HASH}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest"""}else {sh '''mv ./target/*.jar docker/docker build -t "${JOB_NAME}:${tag}" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:${tag}  ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''}}}}stage('5、发送Chart包到K8master主机 通过helm部署, 这里多写了个第6步已经删了') {steps() {echo '发送Chart包到K8master主机   - SUCCESS'echo "${GIT_COMMIT_HASH}"script{if ("${tag}" == "origin/master"){echo "${tag}"sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:${GIT_COMMIT_HASH} --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}else {echo "${tag}"sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:${tag} --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}}}
}

说明

1、 添加全局变量 GIT_COMMIT_HASH = ""   当分支为master时将git commit hash写入全局变量2、 镜像构建那部分, 当为master分支时我们把git_commithash 作为标签打镜像//mytest:latest             后续单独拉取时的最新镜像//mytest:${git_commithash}   每次helm更新部署时所用的镜像3、  在helm部署部分,当我们操作的是master分支时,helm --set 更新的镜像名称的标签就是全局变量的GIT_COMMIT_HASH值

5、构建测试

我现在部署的版本是V5,我们下面的操作中会更新代码中输出的值为V7,作为master分支进行推送,通过jenkins构建后可以看到我们实际运行中使用的镜像是git_commithash的值

这样一来,我们就每次上传代码去jenkins构建就能得到最新的版本部署了

语法参考

// 获取shell命令的标准输出或者状态
https://blog.csdn.net/liurizhou/article/details/86670092?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2-86670092-blog-81546477.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2-86670092-blog-81546477.pc_relevant_vip_default&utm_relevant_index=3

二、设置构建触发器

上面实现了master主分支的自动化构建部署,但master分支会一直迭代版本的,下面我们将实现一个在推送代码后,自动去触发jenkins构建的一个触发器

1、安装jenkins webhook插件

//插件列表
Generic Webhook Trigger
gitlab

2、获取jenkins上的项目地址

http://101.43.4.210:30004/project/pipeline

3、在gitlab上添加webhook勾子并允许网络请求

4、关闭jenkins上gitlab插件验证,测试勾子是否可用

如上我们去测试勾子后会自动触发jenkins流程构建,下面我们更新下代码试试

5、上传新代码测试自动化构建

这样一来每次我们上传代码都会自动帮忙部署,当我们需要使用指定版本时也可以选择标签去部署,持续部署完成~( •̀ ω •́ )y

持续集成:指程序员在代码的开发工程中,可以频繁的将代码部署到主干上,并进行自动化测试持续交付:指在持续集成的基础之上,将代码部署到线上测试环境持续部署:指在持续交付的基础之上,将要部署的代码实现自动部署

三、钉钉通知构建

1、安装钉钉通知插件

Dingtalk

2、打开钉钉软件获取机器人地址

//获取到的webhook
https://oapi.dingtalk.com/robot/send?access_token=d677b287ca50a1ed3ab23eaf0c78b8b01c76c0826ce2f3741ae4df6ab41fc8a5

3、配置钉钉通知的webhook

4、添加jenkinsfile 通知配置

post{success{dingtalk(robot: 'jenkins',   type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 成功构建: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "])}failure {dingtalk(robot: 'jenkins',   type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 构建失败: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "])}
}

配置说明

post{success{    //success  当构建成功时发送dingtalk(     //钉钉robot: 'jenkins',  // 指定全局配置中钉钉机器人对应配置的id号,通过id号来识别不同的钉钉机器人 type: 'MARKDOWN',   //输出的格式title: "success: ${JOB_NAME}",  //输出的标题信息text: ["- 成功构建: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "]     //输出的文本信息 这里有一些是直接取jenkins全局变量的值${currentBuild.durationString})}failure {      //当构建失败后的通知信息dingtalk(robot: 'jenkins',   type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 构建失败: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "])}
}

后续如果想要其他全局变量的信息,可以在jenkins流水线语法处查看

5、全量配置

pipeline {agent anyenvironment {harborUser  = 'admin'harborPasswd  = 'Harbor12345'harborAddress = '101.43.4.210:30007'harborRepo   = 'repo'GIT_COMMIT_HASH = ""}stages {stage('1、 拉取gitlab上的代码到jenkins主机  ') {steps() {echo '拉取git仓库代码 - SUCCESS'checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://101.43.4.210:30001/root/mytest.git']]])}}stage('2、通过jenkins本机的maven+jdk来实现编译打包') {steps() {echo '通过maven构建项目 - SUCCESS'sh '/var/jenkins_home/maven/bin/mvn  clean package -DskipTests'}}stage('3、通过SonarQube做代码质量检测') {steps() {echo '通过SonarQube做代码质量检测  - SUCCESS'sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsoanr.sources=./  -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target -Dsonar.login=squ_3005d10215abc1ac559457cc90ba804c6c477c0c'           }}stage('4、通过jenkins主机构建docker镜像') {steps() {script {GIT_COMMIT_HASH = sh (script: "git log -n 1 --pretty=format:'%H'", returnStdout: true)if ("${tag}" == "origin/master" ){echo '通过jenkins主机构建docker镜像   - SUCCESS'sh """mv ./target/*.jar docker/docker build -t "${JOB_NAME}:latest" ./docker/docker build -t "${JOB_NAME}:${GIT_COMMIT_HASH}" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:${GIT_COMMIT_HASH}docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:latestdocker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${GIT_COMMIT_HASH}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest"""}else {sh '''mv ./target/*.jar docker/docker build -t "${JOB_NAME}:${tag}" ./docker/docker login ${harborAddress} -u${harborUser} -p${harborPasswd}docker tag ${JOB_NAME}:${tag}  ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''}}}}stage('5、发送Chart包到K8master主机 通过helm部署, 这里多写了个第6步已经删了') {steps() {echo '发送Chart包到K8master主机   - SUCCESS'echo "${GIT_COMMIT_HASH}"script{if ("${tag}" == "origin/master"){echo "${tag}"sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:${GIT_COMMIT_HASH} --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}else {echo "${tag}"sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "helm upgrade -i ${JOB_NAME} --set containers.image=$harborAddress/$harborRepo/${JOB_NAME}:${tag} --set name=${JOB_NAME} /usr/local/test/helm/mytest/", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'helm/mytest/* helm/mytest/templates/*  ')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}}}post{success{dingtalk(robot: 'jenkins',type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 成功构建: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "])}failure {dingtalk(robot: 'jenkins',type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 构建失败: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString} "])}}}

devops学习(十一) 构建主分支--触发器--钉钉通知相关推荐

  1. 如何从 OpenVINO 的主分支构建 Python Wheel 包

    作者:Adrian Boguszewski 和 Raymond Lo 翻译:武卓 博士  英特尔AI框架软件布道师 什么是Wheel包? Python *.whl文件或者叫Wheel包,是一个 Pyt ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. git版本分支和分支、分支和主分支切换

    问题描述: 公司里项目管理使用的是gitLab(收费的), 如果开发人员提交代码,  需要首先创建一个分支, 然后把代码提交到你创建的分支上去(不允许把代码直接提交到主分支上). 在代码提交到已经创建 ...

  4. PyTorch框架学习十一——网络层权值初始化

    PyTorch框架学习十一--网络层权值初始化 一.均匀分布初始化 二.正态分布初始化 三.常数初始化 四.Xavier 均匀分布初始化 五.Xavier正态分布初始化 六.kaiming均匀分布初始 ...

  5. git master主分支_Git分支管理策略及简单操作

    前几天整理了一下之前项目的开发代码,当时使用了Git来进行代码版本管理.虽然本人熟悉常用的Git操作,但是对分支的管理经验非常欠缺.拿这个项目来说,在项目中有不下20个分支,每个分支间的继承关系相当之 ...

  6. git学习(三)分支管理

    分支管理 git学习参考 廖雪峰官方网站 git基本操作,一篇文章就够了! 一.分支作用 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交 ...

  7. 怎么用python编写个apk_【android】如何利用python做Android项目自动化构建,并一键实现构建结果发送到钉钉通知以及通过二维码下载apk或者其他处理等功能...

    今天我们来谈一谈用python做Android项目自动化构建的过程.我们知道在常规的Android开发过程中,开发人员打包的时候需要在Android Studio当中进行,或者通过gradle命令,但 ...

  8. Git分支 查看branch 创建 切换checkout 合并merge(先切回主分支) 删除branch -d 推送push

    Git分支 分支的概念 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN.如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时 ...

  9. 【git与github交互之主分支和次分支切换、合并等】

    文章目录 git与github交互分支切换 1. 单个账号分支创建合并测试 2. 作为项目管理者在gihub页面端对成员提交代码审核并合并 3. 多人协作开发逻辑流程 git与github交互分支切换 ...

  10. Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知

    Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知 文章目录 Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知 1.实 ...

最新文章

  1. jquery 设置css样式
  2. IP核引发的关于定,浮点数的认识
  3. 3DSlicer23:Module-Create Loadable
  4. BD和DBMS和SQL概念
  5. 虚拟机几种网络连接方式的区别
  6. CSS-posiziton
  7. Netty堆外内存泄露排查盛宴
  8. Server-Side Timestamping in the Audit Trail System (XAF时间戳在审核中的应用代码)
  9. [三思笔记]---一步一步学DataGuard
  10. Maven之POM文件build标签详解
  11. IT大败局----第七章 企业并购的陷阱
  12. 动态规划练习一 18:买书
  13. jquery遍历数组的方式
  14. Elasticsearch实战(十四)---聚合搜索Aggs多层嵌套聚合处理
  15. (转)安装完Fedora 18后需要做的事情
  16. 微信开发:申请测试公众号
  17. 第三章微分中值定理及导数应用(极值)
  18. 计算机组成原理的复习提纲,计算机组成原理复习提纲.doc
  19. 90后创业者自述:不性感没逼格不能活
  20. 【信息系统项目管理师】2019年上半年信息系统项目管理师上午综合知识真题

热门文章

  1. android车载行业前景,车载 Android 系统快来了,但前景可能并不乐观
  2. kafka消费者报错:Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
  3. 光纤配线柜如何选择,又该怎么安装?
  4. IDEA项目上传码云报错:Push rejected: Push to origin/master was rejected
  5. Python 实现PPPOE自动拨号
  6. 计算机开机后无法网络拨号怎样处理,电脑不能拨号上网显示调制解调器已删除怎么办...
  7. opencv视频拼接 opencv视频拼接优化
  8. php分页设计美化,国产PHP框架之ThinkPHP各模块开发系列十七,美化分页显示
  9. 路由器和三层交换机区别
  10. 1.Series和DataFrame