基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

上线发布是运维的日常工作,常见的发布方式有:

  • 手动发布
  • Jenkins发布平台
  • Gitlab CI
  • ……

除此之外还有需要开源软件,他们都有非常不错的发布管理功能。

面临的问题

作为运维人员,上线发布是必不可少的一环,一个正常的发布流程是怎么样的?

  • 需求方提发布任务,走发布流程
  • 供应方执行发布上线

环节看似简单,但是中间其实是有断层的。一般企业在走上线流程都是通过一些公共渠道,比如邮件、钉钉飞书的流程,这些都很难和运维执行上线发布平台进行关联上,而且也不够直观。所以我们就需要解决以下几个问题:

  • 流程和运维平台建立连接
  • 从发起到结束形成闭环

为啥选择Jira

JIRA优秀的项目管理,问题跟踪的工具,另外它的流程管理和看板模式也能够非常直观看到目前流程处在什么位置。另外它可以通过webhook和其他平台建立友好的连接,方便扩展。再者对于开发、测试、项目管理人员等来说Jira是他们日常的工具,使用熟练度非常高,降低了额外的学习成本。鉴于此,我们选择JIRA作为运维发布平台,争取做到一个平台做所有事。

方案设计

设计思路

充分利用Jira、Gitlab的webhook功能,以及Jenkins的灵活性。

  • Jira上更新状态触发Jenkins执行合并分支流水线
  • Gitlab上代码合并成功后触发Jenkins执行发布流水线
  • 将发布结果通过钉钉等软件通知相应的人

整体思路相对简单,难点主要集中在Jenkins获取Jira、Gitlab的数据,所幸Jenkins的插件功能非常丰富,这里就使用 Generic Webhook Trigger 插件,可以很灵活地获取到触发软件地信息。

发布流程方案

然后整理出如下地发布流程。

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

涉及软件

软件

功能

Jira

发布流程管理

Jenkins

执行各种流水线

Gitlab

代码仓库

Kubernetes

应用管理

Helm/kustomize

包管理

钉钉

消息通知

trivy

镜像扫描

镜像仓库

阿里云镜像仓库

PS:这里没有具体的软件部署

Jira与Jenkins进行集成合并分支

Jenkins配置

Jenkins的配置主要有两部分,如下:

  • 配置Jenkins ShareLibrary功能
  • 编写Jira触发相应的Jenkinsfile

(1)Jenkins上配置ShareLibarary

系统配置–>系统配置–>Global Pipeline Libraries

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

(2)创建流水线,配置Webhook以及添加Jenkinsfile

  • 配置触发器

先配置一个变量和正则

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

再配置一个Token即可

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

  • 配置流水线,添加对于的Jenkinsfile

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

(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("rn") 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("分支合并失败 :x:") } } aborted { script{ println("aborted:只有取消构建才会执行") dingmes.SendDingTalk("分支合并取消 :x:","暂停或中断") } } }}

以上Jenkins上配置基本完成。

Jira上配置

Jira上的主要配置如下:

  • 建立工作流
  • 工作流关联项目
  • 配置项目触发Webhook

建立工作流

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

将工作流关联项目组

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

配置webhook

设置–>系统–>网络钩子

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

上面配置完成后,即完成Jira上配置,然后就可以在对应项目的看板上查看所以待发布的项目,如下:

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

然后进行拖拽或者点击发布按钮,即可改变状态,触发流水线进行相应的操作了。

Gitlab与Jenkins集成发布系统

开发分支简要

这里主要使用的是功能分支开发模式,主要分为以下几个分支:

  • DEV分支:开发环境分支
  • TEST分支:测试环境分支
  • UAT分支:联调环境分支
  • PRE分支:预发布环境分支
  • MASTER分支:生产环境分支

代码合并路线是:DEV->TEST->UAT->PRE->MASTER

然后根据不同的分支判断执行不同环境的部署。

Jenkins配置流水线

(1)配置Webhook插件参数

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

获取Gitlab分支

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

定义gitlab push条件,不是任何改动都需要触发流水线

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

定义过滤正则表达式

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

这样就只有commit的时候才会触发流水线。

(2)配置Jenkinsfile

def labels = "slave-${UUID.randomUUID().toString()}"// 引用共享库@Library('jenkins_shareLibrary')// 应用共享库中的方法def tools = new org.devops.tools()def branchName = ""// 获取分支if ("${gitlabWebhook}" == "gitlabPush"){ branchName = branch - "refs/heads/" currentBuild.description = "构建者${userName} 分支${branchName}"}pipeline { agent { kubernetes { label labels yaml """apiVersion: v1kind: Podmetadata: labels: some-label: some-label-valuespec: volumes: - name: docker-sock hostPath: path: /var/run/docker.sock type: '' - name: maven-cache persistentVolumeClaim: claimName: maven-cache-pvc containers: - name: jnlp image: registry.cn-hangzhou.aliyuncs.com/rookieops/inbound-agent:4.3-4 - name: maven image: registry.cn-hangzhou.aliyuncs.com/rookieops/maven:3.5.0-alpine command: - cat tty: true volumeMounts: - name: maven-cache mountPath: /root/.m2 - name: docker image: registry.cn-hangzhou.aliyuncs.com/rookieops/docker:19.03.11 command: - cat tty: true volumeMounts: - name: docker-sock mountPath: /var/run/docker.sock - name: sonar-scanner image: registry.cn-hangzhou.aliyuncs.com/rookieops/sonar-scanner:latest command: - cat tty: true - name: kustomize image: registry.cn-hangzhou.aliyuncs.com/rookieops/kustomize:v3.8.1 command: - cat tty: true - name: kubedog image: registry.cn-hangzhou.aliyuncs.com/rookieops/kubedog:v0.5.0 command: ['cat'] tty: true - name: trivy image: registry.cn-hangzhou.aliyuncs.com/rookieops/trivy:v2 command: ['cat'] tty: true volumeMounts: - name: docker-sock mountPath: /var/run/docker.sock""" } } environment { auth = 'joker' } options { timestamps() // 日志会有时间 skipDefaultCheckout() // 删除隐式checkout scm语句 disableConcurrentBuilds() //禁止并行 timeout(time:1, unit:'HOURS') //设置流水线超时时间 } stages { // 拉取代码 stage('GetCode') { steps { checkout([$class: 'GitSCM', branches: [[name: "${gitBranch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '83d2e934-75c9-48fe-9703-b48e2feff4d8', url: "${gitUrl}"]]]) } } // 单元测试和编译打包 stage('Build&Test') { steps { container('maven') { script { tools.PrintMes('编译打包', 'blue') } } } } // 代码扫描 stage('CodeScanner') { steps { container('sonar-scanner') { script { tools.PrintMes('代码扫描', 'blue') } } } } // 构建镜像 stage('BuildImage') { steps { container('docker') { script { tools.PrintMes('构建镜像', 'blue') } } } } // 镜像扫描 stage('Vulnerability Scanner') { steps { container('trivy') { script{ tools.PrintMes('镜像扫描', 'blue') } } } } // 推送镜像 stage('Push Image') { steps { container('docker') { script{ tools.PrintMes('推送镜像', 'blue') } } } } // 部署 stage('Deploy DEV') { when { branchName 'dev' } steps { container('kustomize'){ script{ tools.PrintMes('部署DEV环境','blue') } } } } stage('Deploy TEST') { when { branchName 'test' } steps { container('kustomize'){ script{ tools.PrintMes('部署TEST环境','blue') } } } } stage('Deploy UAT') { when { branchName 'uat' } steps { container('kustomize'){ script{ tools.PrintMes('部署UAT环境','blue') } } } } stage('Deploy PRE') { when { branchName 'pre' } steps { container('kustomize'){ script{ tools.PrintMes('部署PRE环境','blue') } } } } stage('Deploy PROD') { when { branchName 'master' } steps { container('kustomize'){ script{ tools.PrintMes('部署PROD环境','blue') } } } } // 跟踪应用启动情况 stage('Check App Start') { steps{ container('kubedog'){ script{ tools.PrintMes('跟踪应用启动', 'blue') } } } } // 接口测试 stage('InterfaceTest') { steps { sh 'echo "接口测试"' } } } // 构建后的操作 post { success { script { println('success:只有构建成功才会执行') currentBuild.description = 'n构建成功!' dingmes.SendDingTalk("构建成功 :white_check_mark:") } } failure { script { println('failure:只有构建失败才会执行') currentBuild.description = 'n构建失败!' dingmes.SendDingTalk("构建失败 :x:") } } aborted { script { println('aborted:只有取消构建才会执行') currentBuild.description = 'n构建取消!' dingmes.SendDingTalk("构建失败 :x:","暂停或中断") } } }}

(3)在Gitlab上配置钩子

settings->webhook

基于Jira的运维发布平台的设计与实现 简单易懂(jira平台搭建)

到这里,Gitlab和Jenkins集成就差不多完成了,后面就是具体的调试以及配置了。

写到最后

道路千万条,适合自己才最好。

上面是根据工作的实际情况做的运维发布,整体思路还有实现方式并不复杂,主要是充分利用各个软件地webhook能力,以及充分利用Jenkins灵活的插件功能,使得从创建发布计划和执行发布进行打通。

个人觉得还是有必要记录一下,也希望能帮助到有这方面需要的人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年10月18日 上午8:02
下一篇 2022年10月18日 上午8:04

相关推荐

  • 农机化所花生装备研发项目获中华农业科技一等奖

        近日,农业部南京农业机械化研究所主持完成的“花生机械化收获技术装备研发与示范”项目获2010-2011年度中华农业科技…

    科研百科 2022年5月18日
    258
  • 教育部:明确公办园生均公用经费标准,2024年达到每年600元

    近日,教育部、国家发改委、财政部正式印发了《关于实施新时代基础教育扩优提质行动计划的意见》(以下简称《扩优提质行动》)。8月30日,教育部基础教育司司长田祖荫在教育部新闻发布会上表…

    科研百科 2023年10月7日
    210
  • 重点科研项目监督 重点项目研究

    重点科研项目监督与重点项目研究 近年来,随着科技的不断发展,重点科研项目监督与重点项目研究已经成为学术界和政府机构中备受关注的话题。在重点项目研究中,研究人员需要对项目的进展和成果…

    科研百科 2024年3月29日
    71
  • 自己抄袭自己的国自然标书,这种行为算学术不端吗?(国自然抄袭处理)

    有很多人写标书时都想要借鉴自己的标书,那么便会产生如下问题: ①这种行为算学术不端吗? ②那能中标吗? ✅关于国自然标书这个问题: 首先,抄袭自己没有中标的标书不算学术不端。但如果…

    科研百科 2024年6月23日
    108
  • 灵山县施国驹简历2867770091

    灵山县施国驹简历 施国驹,男,出生于1978年,灵山县人。他是一位经验丰富的企业家,拥有多年的商业经验和成功的创业经历。下面是他的简历: 教育背景:1995年-1999年,就读于灵…

    科研百科 2024年10月17日
    3
  • 企业客户项目管理系统

    企业客户项目管理系统:提升客户满意度和工作效率 随着市场竞争的加剧,企业客户项目管理系统的重要性越来越凸显。一个高效的客户项目管理系统可以帮助企业提高客户满意度和工作效率,从而在激…

    科研百科 2024年12月11日
    0
  • “国稻6号”在湘示范喜获高产

      金秋十月,稻穗飘香。由中国水稻研究所选育的三系超级杂交稻新品种“国稻6号”,在湖南省作双季晚稻种植喜获丰收。湖南省农业厅组织专家对湘潭县泉塘子种植的“国稻6号”百亩示范田进行现…

    科研百科 2022年5月19日
    301
  • 室内游乐项目管理系统

    室内游乐项目管理系统:让游戏更加有趣,更加高效 随着现代社会的不断发展,人们越来越注重身心健康和娱乐。室内游乐项目管理系统作为一种新型的娱乐方式,越来越受到人们的喜爱。它可以帮助玩…

    科研百科 2024年12月16日
    0
  • 员工档案管理系统

    员工档案管理系统 随着现代企业的快速发展,员工的档案管理也变得越来越重要。一个有效的员工档案管理系统可以帮助企业更好地管理员工信息,提高工作效率,减少数据泄露的风险。 员工档案管理…

    科研百科 2024年8月13日
    29
  • 软件项目管理 6.4.类比(自顶向下)估算法(自顶向下的软件开发成本估算方法)

    【公众号 “项目管理研究所” 将会第一时间更新文章并[分享行业分析报告]】 归档于软件项目管理初级学习路线第六章 软件项目成本计划《初级学习路线合集 》 前言 大家好,这节我们学习…

    2022年7月13日
    312