基于Jira的运维发布平台的设计与实现(下)

发表于:2022-8-19 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:乔克    来源:稀土掘金

  建立工作流
  将工作流关联项目组
  配置webhook
  设置-->系统-->网络钩子
  上面配置完成后,即完成Jira上配置,然后就可以在对应项目的看板上查看所以待发布的项目,如下:
  然后进行拖拽或者点击发布按钮,即可改变状态,触发流水线进行相应的操作了。
  Gitlab与Jenkins集成发布系统
  开发分支简要
  这里主要使用的是功能分支开发模式,主要分为以下几个分支:
  ·DEV分支:开发环境分支
  · TEST分支:测试环境分支
  · UAT分支:联调环境分支
  · PRE分支:预发布环境分支
  · MASTER分支:生产环境分支
  代码合并路线是:DEV->TEST->UAT->PRE->MASTER
  然后根据不同的分支判断执行不同环境的部署。
  Jenkins配置流水线
  (1)配置Webhook插件参数
  获取Gitlab分支
  定义gitlab push条件,不是任何改动都需要触发流水线。
  定义过滤正则表达式。
  这样就只有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: v1
  kind: Pod
  metadata:
    labels:
      some-label: some-label-value
  spec:
    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("构建成功 ?")
              }
          }
          failure {
              script {
                  println('failure:只有构建失败才会执行')
                  currentBuild.description += '\n构建失败!'
                  dingmes.SendDingTalk("构建失败 ?")
              }
          }
          aborted {
              script {
                  println('aborted:只有取消构建才会执行')
                  currentBuild.description += '\n构建取消!'
                  dingmes.SendDingTalk("构建失败 ?","暂停或中断")
              }
          }
      }
  }
  (3)在Gitlab上配置钩子
  settings->webhook
  到这里,Gitlab和Jenkins集成就差不多完成了,后面就是具体的调试以及配置了。
  写到最后
  道路千万条,适合自己才最好。
  上面是根据工作的实际情况做的运维发布,整体思路还有实现方式并不复杂,主要是充分利用各个软件地webhook能力,以及充分利用Jenkins灵活的插件功能,使得从创建发布计划和执行发布进行打通。
  个人觉得还是有必要记录一下,也希望能帮助到有这方面需要的人。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号