在Google Kubernetes集群创建分布式Jenkins(二)

news2024/11/23 9:47:24

上一篇博客在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=abc,ContentType选择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 Trigger,Token也要填上,这个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流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手 Golang 实现静态图像与视频流人脸识别

说起人脸识别,大家首先想到的实现方式应该是 Python 去做相关的处理,因为相关的机器学习框架,库都已经封装得比较好了。但是我们今天讨论的实现方式换成 Golang,利用 Golang 去做静态图像和视频流人脸识别的相应处理。 静态图像人…

【leaflet】1. 初见

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 概念概念解释特点 2️⃣ 学习路线图3️⃣ html示例🛬 文章小结📖 参考资料 🛫 导读 需求 要做游戏地图了,看到大量产品都使用的leaflet,所以开始学习这个。 开发环境…

IP可视对讲实时录制系统

介绍 软件架构 技术支持 CallRecored介绍 IP可视对讲实时录制系统设计了数据库表,并完成了数据库建模,采用了视频编解码技术,高效网络传输,磁盘高效读写技术,以及提供开放接口。 系统客户端采用扁平化UI,…

说说对高阶组件的理解?应用场景?

一、是什么 高阶函数(Higher-order function),至少满足下列一个条件的函数 接受一个或多个函数作为输入输出一个函数 在React中,高阶组件即接受一个或多个组件作为参数并且返回一个组件,本质也就是一个函数&#xf…

【c趣编程】输入一个整数,判断其有几位

目录 1题目要求: 2解题思路: 3代码如下所示: 4运行代码如下: 5总结: 1题目要求: 只用一个scanf输出一串数,不可以一个一个的输入并计数,那样太浪费时间了。 C语言是一门面向过…

RabbitMQ 系列教程

一、RabbitMQ 部署及配置详解(集群部署) 二、RabbitMQ 部署及配置详解 (单机) 三、RabbitMQ 详解及实例(含错误信息处理) 四、RabbitMq死信队列及其处理方案 五、RabbitMQ Java开发教程—官方原版 六、RabbitMQ Java开发教程(二&#x…

2022年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于函数,以下选项中描述错误的是? A:函数能完成特定的功能,对函数的使用不需要了解函数内部实现原理,只要了解函数的输入输出方式即可。 B:使用函数的主要目的是减低编程难度和…

利用mybatis-plus的分页插件在xml文件中联表查询实现分页(MySQL数据库)

文章目录 准备工作Mybatis-Plus分页插件配置进行分页测试domain层Controller层Service层ServiceImplMapper层分页接口测试带其他条件的分页查询 自定义的 mapper#method(xml文件中) 使用分页domain层Controller层Service层ServiceImplMapper层UserMapper…

机器视觉目标检测 - opencv 深度学习 计算机竞赛

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

【Python大数据笔记_day05_Hive基础操作】

一.SQL,Hive和MapReduce的关系 用户在hive上编写sql语句,hive把sql语句转化为MapReduce程序去执行 二.Hive架构映射流程 用户接口: 包括CLI、JDBC/ODBC、WebGUI,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端…

UPLOAD-LABS1

less1 (js验证) 我们上传PHP的发现不可以,只能是jpg,png,gif(白名单限制了) 我们可以直接去修改限制 在查看器中看到使用了onsubmit这个函数,触发了鼠标的单击事件,在表单提交后马上调用了re…

Ajax请求中的跨域问题及其解决方案

跨域问题 跨域是指从一个域名的网页去请求另一个域名的资源, 比如当前在百度页面(https://baidu.com)去请求京东服务器(https://www.jd.com)的资源 传统请求不会跨域 在a站点可以通过超链接或者form表单提交或者window.location.href的方式跨域访问b站点的资源(静态或者动态)…

35岁危机来临前,程序员如何未雨绸缪?

程序员逼近35岁”高龄“,救命。。。 (目瞪口呆)什么? 程序员而立之年,为未来担忧?(双手抱头不敢置信) 不可能!他们明明那么努力、那么辛苦了!!!&a…

用趋动云GPU部署自己的Stable Diffusion

注:本文内容来自于对DataWhale的开源学习项目——免费GPU线上跑AI项目实践的学习,参见:Docs,引用了多处DataWhale给出的教程。 1.创建项目 1)进入趋动云用户工作台,在当前空间处选择注册时系统自动生成的…

debian/ubuntu/windows配置wiregurad内网服务器(包含掉线自启动)

文章目录 前言一、服务器配置安装wireguard软件生成私钥公钥配置服务器参数配置服务器sysctl参数启动、停止服务端 二、用户端配置安装wireguard软件生成私钥公钥配置客户端参数启动、停止客户端配置服务开机启动 三、服务器添加、删除客户四、配置掉线自启动配置掉线自启动脚本…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中,因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷,基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

MySQL中的多列子查询

-- 多列子查询 -- 如何查询与WOARD 的部门和岗位完全相同的所有雇员(并且不含smith本人) -- (字段1,字段2...) (select 字段1,字段2 from ...) -- 分析: 1. 得到smith的部门和岗位 SELECT deptno,job FROM empWHERE ename WARD; -- 2.使…

字符编码转换时发生内存越界引发的摄像头切换失败问题的排查

目录 1、问题说明 2、初步分析 3、字符串字符编码说明 4、进一步分析 5、为啥在日常测试时没有遇到切换摄像头失败的问题呢? 6、华为MateBook笔记本使用高通的CPU 7、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更…

电脑msvcp110.dll丢失怎么办,msvcp110.dll缺失的详细修复步骤

在现代科技发展的时代,电脑已经成为我们生活和工作中不可或缺的工具。然而,由于各种原因,电脑可能会出现一些问题,其中之一就是msvcp110.dll文件丢失。这个问题可能会导致一些应用程序无法正常运行,给我们的生活和工作…