上线发布是运维的日常工作,常见的发布方式有:
·手动发布
· Jenkins发布平台
· Gitlab CI
......
除此之外还有需要开源软件,他们都有非常不错的发布管理功能。
面临的问题
作为运维人员,上线发布是必不可少的一环,一个正常的发布流程是怎么样的?
· 需求方提发布任务,走发布流程
· 供应方执行发布上线
环节看似简单,但是中间其实是有断层的。一般企业在走上线流程都是通过一些公共渠道,比如邮件、钉钉、飞书的流程,这些都很难和运维执行上线发布平台进行关联上,而且也不够直观。所以我们就需要解决以下几个问题:
· 流程和运维平台建立连接
· 从发起到结束形成闭环
为了选择JIRA?
JIRA优秀的项目管理,问题跟踪的工具,另外它的流程管理和看板模式也能够非常直观看到目前流程处在什么位置。另外它可以通过webhook和其他平台建立友好的连接,方便扩展。再者对于开发、测试、项目管理人员等来说Jira是他们日常的工具,使用熟练度非常高,降低了额外的学习成功。鉴于此,我们选择JIRA作为运维发布平台,争取做到一个平台做所有事。
方案设计
设计思路
充分利用Jira、Gitlab的webhook功能,以及Jenkins的灵活性。
· Jira上更新状态触发Jenkins执行合并分支流水线
· Gitlab上代码合并成功后触发Jenkins执行发布流水线
· 将发布结果通过钉钉等软件通知相应的人
整体思路相对简单,难点主要集中在Jenkins获取Jira、Gitlab的数据,所幸Jenkins的插件功能非常丰富,这里就使用Generic Webhook Trigger插件,可以很灵活地获取到触发软件地信息。
发布流程方案
然后整理出如下地发布流程。
涉及软件
PS:这里没有具体的软件部署
Jira与Jenkins进行集成合并分支
Jenkins配置
Jenkins的配置主要有两部分,如下:
· 配置Jenkins ShareLibrary功能
· 编写Jira触发相应的Jenkinsfile
(1)Jenkins上配置ShareLibarary
系统配置-->系统配置-->Global Pipeline Libraries
(2)创建流水线,配置Webhook以及添加Jenkinsfile
· 配置触发器
先配置一个变量和正则
再配置一个Token即可。
· 配置流水线,添加对于的Jenkinsfile
(3)Jenkinsfile的主要逻辑如下
PS:下面仅列出大致的框架,并没有详细的代码
· 获取Jira的配置信息进行解析
· 根据不同信息执行不同的操作
· 合并分支主要是通过调Gitlab的API接口完成
#!groovy
@Library('lotbrick') _
def gitlab = new org.devops.gitlab()
def tool = new org.devops.tools()
def dingmes = new org.devops.sendDingTalk()
pipeline {
agent { node { label "master"}}
environment {
DINGTALKHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxxx"
}
stages{
stage("FileterData"){
steps{
script{
response = readJSON text: """${webHookData}"""
// println(response)
env.eventType = response["webhookEvent"]
if (eventType == "jira:issue_updated"){
// 获取状态值
env.jiraStatus = response['issue']['fields']['status']['name']
env.gitlabInfos = response['issue']['fields']['customfield_10219']
infos = "${gitlabInfos}".split("\r\n")
for (info in infos){
prName = "$info".split("/")[0]
// brName = "$info".split("/")[1]
brName = info - "${prName}/"
println(prName)
println(brName)
if (jiraStatus == "已发布(UAT)"){
println('进行合并PRE分支操作')
}else if (jiraStatus == "已发布(PROD)"){
println('进行合并PROD分支操作')
}else if (jiraStatus == "已完成"){
println('进行分支打Tag并删除原分支')
}else{
println("查无此项")
}
}
}
}
}
}
}
// 构建后的操作
post {
failure {
script{
println("failure:只有构建失败才会执行")
dingmes.SendDingTalk("分支合并失败 ?")
}
}
aborted {
script{
println("aborted:只有取消构建才会执行")
dingmes.SendDingTalk("分支合并取消 ?","暂停或中断")
}
}
}
}
以上Jenkins上配置基本完成。
Jira上配置
Jira上的主要配置如下:
·建立工作流
· 工作流关联项目
· 配置项目触发Webhook
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理