在Google Kubernetes集群创建分布式Jenkins(二)-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

上一篇博客在Google Kubernetes集群创建分布式Jenkins(一)-CSDN博客我介绍了如何在GCP的K8S集群上部署一个分布式的Jenkins并实现了一个简单的Pipeline的运行。

在实际的开发中我们通常都会按照以下的CICD流程来设置Pipeline

在我司的实际实践中通常包括如下的步骤

  1. 往Git仓库提交开发分支的代码创建Pull request来进行code review
  2. Git仓库配置hook当收到PR时触发jenkins任务拉取代码到Jenkins进行编译和UT检查
  3. Jenkins把UT检查结果回写到PR的comments如果UT检查通过自动Approve+1
  4. 当其他人对PR的code review完成Approve+2自动合并代码到主分支。
  5. 合并到主分支触发Jenkins的打包任务Jenkins拉取主分支代码运行打包任务
  6. 打包任务完成后把打包的镜像推送到registry
  7. 更新部署的manifest更新镜像的标签
  8. 把应用部署到GKE

这里我将按照以上任务来设置相应的pipeline

Jenkins安装插件

要完成以上的任务我们需要安装以下的一些插件

Generic webhook trigger plugin

Github plugin

Credential binding plugin

Git仓库设置webhook

我选择GitHub作为示例在github上建立一个简单的Java Springboot项目实现一个rest接口完成一个简单的计算任务代码仓库在https://github.com/gzroy/webdemo.git。在这个repo的页面上点击Settings->webhooks然后选择添加webhook在Payload URL里面输入jenkins URL例如我的Jenkins URL是http://123.123.123.123/jenkins/generic-webhook-trigger/invoke?token=abcContentType选择application/json然后点击“Let me select individual events”选择触发hook的事件。这里我选择Pull request。

设置CICD项目

因为我打算以后其他项目都统一用这个CICD的流程所以新建一个CICD的项目把所需要的Jenkins pipeline的代码都放到这个项目中。以后其他项目只需要引用这个项目的相关文件即可完成CICD的任务。代码仓库在https://github.com/gzroy/cicd.git

创建PR自动触发测试的Pipeline

我们要实现的功能是当开发者新建一个分支修改完代码commit提交并创建PR之后应该要自动触发CI的pipeline来进行UT测试并把测试结果写到PR的comments里面这样其他reviewer可以查看这个测试的结果。

在CICD项目里面我新建了一个ut_pipeline.groovy文件内容如下

pipeline {
  agent{
    kubernetes{
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: maven
            image: maven:3.8.3-openjdk-17
            tty: true
            imagePullPolicy: "IfNotPresent"
            command:
            - cat
        '''
    }
  }
  triggers {
    GenericTrigger(
      genericVariables: [
        [key: 'action', value: '$.action', expressionType: 'JSONPath'],
        [key: 'clone_url', value: '$.pull_request.base.repo.clone_url', expressionType: 'JSONPath'],
        [key: 'ref', value: '$.pull_request.head.ref', expressionType: 'JSONPath'],
        [key: 'sha', value: '$.pull_request.head.sha', expressionType: 'JSONPath'],
        [key: 'number', value: '$.number', expressionType: 'JSONPath'],
        [key: 'comments_url', value: '$.pull_request.comments_url', expressionType: 'JSONPath']
      ],
      token: 'abc'
    )
  }
  environment {
    CREDENTIAL = credentials("${CREDENTIAL_ID}")
  }
  stages{
    stage("git checkout") {
      when {
        expression {
          return action=="opened" || action=="synchronize"
        }
      }
      steps {
        script {
          git(
            url: clone_url,
            credentialsId: CREDENTIAL_ID,
            branch: ref
          )
        }
      }
    }
    stage("test"){
      when {
        expression {
          return action=="opened" || action=="synchronize"
        }
      }
      steps{
        container('maven') {
          script{
            sh 'mvn test '
          }
        }
      }
      post {
        failure {
          sh """
          (curl -L -X POST \
          -H \"Accept: application/vnd.github+json\" \
          -H \"Authorization: Bearer ${env.CREDENTIAL_PSW}\" \
          -H \"X-GitHub-Api-Version: 2022-11-28\" \
          ${comments_url} \
          -d \'{\"body\": \"UT test failure for commit ${sha}\"}\')
          """
        }
        success {
          sh """
          (curl -L -X POST \
          -H \"Accept: application/vnd.github+json\" \
          -H \"Authorization: Bearer ${env.CREDENTIAL_PSW}\" \
          -H \"X-GitHub-Api-Version: 2022-11-28\" \
          ${comments_url} \
          -d \'{\"body\": \"UT test success for commit ${sha}\"}\')
          """
        }
      }
    }
  }
}

解释一下这个程序。在Agent模块里面定义了一个运行Jenkins Agent的Pod其中container除了默认的agent container之外还包括一个maven container在test这个stage里面将运行这个maven container的mvn test命令来执行UT测试。

在triggers模块中定义了GenericTrigger从webhook的回调API中获取body的数据把其中需要的数据赋值到变量给后续的stage使用。

在environment模块中定义了一个名为CREDENTIAL的全局变量通过credentials helper函数来获取Jenkins保存的凭证这里的CREDENTIAL_ID是在Jenkins System里面定义的全局变量。注意这里必须要加上双引号使得Groovy可以预先用Jenkins变量的值来替代这个变量如果用单引号则不行。

在Stages模块中定义了两个Stage这两个操作都是当PR新建或已有PR上发生新的commit时才执行。第一个Stage执行从Github仓库checkout的操作。第二个Stage是执行maven测试在Post里面定义了测试成功或失败需要给PR加上相应的comment。这里都使用了Github API来进行操作我们需要预先把Github用户的access token保存到Jenkins的credentials中。

PR review approve自动触发打包的pipeline

创建一个package_pipeline.groovy的文件当收到Webhook回调时判断如果是approve的事件那么将自动执行合并代码分支到主分支的操作然后拉取主分支的代码进行package并进行Docker构建然后把镜像推送到相应的registry。

待补充

部署镜像的pipeline

采用Gitops的方式来部署。

待补充

设置Pipeline

回到Jenkins的控制台新建一个webdemo_ut的Job选择Pipeline类型然后在Github项目里面填入https://github.com/gzroy/webdemo.git在构建触发器里面选择Generic Webhook TriggerToken也要填上这个Token需要和Github配置webhook的token一致。定义Pipeline里面选择Pipeline script from SCM填入CICD项目的地址和Script文件的路径Branch to build里面输入*/*然后保存即可。

之后我们在https://github.com/gzroy/webdemo.git这个项目上可以执行新建分支然后改动代码提交之后创建一个PR可以看到Jenkins将自动触发一个任务进行测试后把结果回写到PR的comments中。

新建一个webdemo_package的job配置和上面类似只是pipeline script选择package_pipeline.groovy文件。当我们Approve PR review之后可以看到Jenkins将自动触发package任务生成镜像并推送到registry。

总结

以上就是设置一个自动触发Jenkins任务的CICD流程。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: gok8s