当前位置: 首页 > news >正文

DevOps实现CI/CD实战(七)- Jenkins集成k8s实现自动化CI

自动化CI操作

完整的笔记,里面有完整的DevOps笔记和K8S集群搭建的笔记

  • https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps
1. 安装gitlab plugin 工具

在这里插入图片描述##### 2. 配置流水线任务的构建触发器,复制URL:http://192.168.201.111:8080/project/pipeline
在这里插入图片描述

3. Gitlab配置Webhooks,将上面的url:http://192.168.201.111:8080/project/pipeline粘贴到下面位置,下面勾选push events

在这里插入图片描述
但是在保存的时候报了zURL阻塞这个问题,解决方案如下,点击admin下面的network找到Outbound requests都选下面选项,然后点击保存
在这里插入图片描述

完成上面步骤,然后再次,到webhooks页面复制url然后点击保存。在这里插入图片描述
然后测试,报了403,应为Jenkins默认是不接收webhooks的请求的,这是Jenkins的安全机制导致的,需要修改Jenkins的系统配置

在这里插入图片描述

4. 修改Jenkins的Gitlab配置,需要先安装我们上面说的Gitlab plugin插件

在这里插入图片描述
再次去webhooks页面进行测试,然后成功了,然后Jenkins也触发了构建
在这里插入图片描述
Jenkins自动构建
在这里插入图片描述

但是构建失败了,原因就是我们构建打包的时候,配置了tag提交点,现在我们是需要按代码的最新的提交点打包部署,要去掉git的参数配置,修改Jenkinsfile文件里用到的$tag的地方。
在这里插入图片描述

5. 删除流水线的参数构建化过程

在这里插入图片描述

  • 修改项目的Jenkinsfile文件,$tag替换
// 所有的脚本命令都放在pipeline中
pipeline{// 指定任务在哪个集群节点执行agent any// 声明全局变量,方便后面使用environment{harborUser='sswang'harborPasswd='A123456a'harborAddr='harbor.com'harborRepo='sswang'}stages{stage('拉取git仓库代码') {steps {checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.201.112:8929/mytest/mytest.git']])}}stage('通过maven构建项目') {steps {sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'}}stage('通过SonarQube做代码质量检测') {steps {sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=http://192.168.201.111:9000/ -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=65a1741c6f4191105f68096278fe77adaa1d15a1'}}stage('通过docker制作自定义镜像') {steps {sh '''mv ./target/*.jar ./docker/docker build -t ${JOB_NAME}:latest ./docker/'''}}stage('将自定义镜像推送到Harbor中') {steps {sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborAddr}docker tag ${JOB_NAME}:latest ${harborAddr}/${harborRepo}/${JOB_NAME}:latestdocker push ${harborAddr}/${harborRepo}/${JOB_NAME}:latest'''}}stage('将部署的yml文件传送到k8s-master节点') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}stage('远程执行k8s-master节点的kubectl命令') {steps {sh 'ssh root@192.168.201.120 kubectl apply -f /usr/local/k8s/pipeline.yml'}}}
}

然后修改controller文件,触发了构建,虽然构建成功了,但是发现了一个问题,k8s的pod并没有更新。

针对这个问题,k8s提供了一种解决的方法,kubectl rollout restart deployment pipeline -n test执行完命令后发现容器在滚动重启了

在这里插入图片描述
还有修改项目中pipeline.yml的镜像的版本号为latest

apiVersion: apps/v1
kind: Deployment
metadata:namespace: testname: pipelinelabels:app: pipeline
spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- name: pipelineimage: harbor.com/sswang/pipeline:latestimagePullPolicy: Alwaysports:- containerPort: 8080---
apiVersion: v1
kind: Service
metadata:namespace: testname: pipelinelabels:app: pipeline
spec:selector:app: pipelineports:- port: 8082targetPort: 8080type: NodePort---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:namespace: testname: pipeline
spec:ingressClassName: nginxrules:- host: pipeline.test.comhttp:paths:- path: /pathType: Prefixbackend:service:name: pipelineport:number: 8082

重新触发部署后发现成功了
在这里插入图片描述
但是还有一个问题,因为我们是修改的pipeline.yml,所以生效了,但是我要是修改controller之后,还是没有变化,不信的话可以自己试一下,我试过了。哈哈哈,要解决这个问题,就要修改kubectl的命令

  • 最终修改Jenkinsfile文件,添加k8s部署命令
sh '''ssh root@192.168.201.120 kubectl apply -f /usr/local/k8s/pipeline.yml
ssh root@192.168.201.120 kubectl rollout restart deployment pipeline -n test'''

最终Jenkinsfile文件

// 所有的脚本命令都放在pipeline中
pipeline{// 指定任务在哪个集群节点执行agent any// 声明全局变量,方便后面使用environment{harborUser='sswang'harborPasswd='A123456a'harborAddr='harbor.com'harborRepo='sswang'}stages{stage('拉取git仓库代码') {steps {checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.201.112:8929/mytest/mytest.git']])}}stage('通过maven构建项目') {steps {sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'}}stage('通过SonarQube做代码质量检测') {steps {sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=http://192.168.201.111:9000/ -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=65a1741c6f4191105f68096278fe77adaa1d15a1'}}stage('通过docker制作自定义镜像') {steps {sh '''mv ./target/*.jar ./docker/docker build -t ${JOB_NAME}:latest ./docker/'''}}stage('将自定义镜像推送到Harbor中') {steps {sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborAddr}docker tag ${JOB_NAME}:latest ${harborAddr}/${harborRepo}/${JOB_NAME}:latestdocker push ${harborAddr}/${harborRepo}/${JOB_NAME}:latest'''}}stage('将部署的yml文件传送到k8s-master节点') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}stage('远程执行k8s-master节点的kubectl命令') {steps {sh '''ssh root@192.168.201.120 kubectl apply -f /usr/local/k8s/pipeline.ymlssh root@192.168.201.120 kubectl rollout restart deployment pipeline -n test'''}}}
}

修改controller文件验证

/*** @author analytics* @date 2024/8/20 22:10* @description*/
@RestController
public class TestController {@GetMapping("/test")public String test() {return "Hello Jenkins the final Pipeline:latest!!!!!!!!!!";}
}

最后终于成功了,xdm,到此,累坏了。
在这里插入图片描述
到此,DevOps实现自动化CI,CD操作已经完成了,整个过程比较繁琐,也比较复杂,在操作过程中也有各种各样的问题,希望xdm都能耐心一点,相信你也会成功的。
关于k8s集群搭建的文档已经在github中了,大家需要的可以去参考。里面也有完整的DevOps的笔记,与大家一起进步。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端Warning解决:多行文本省略号样式失效丢失,css
  • ERDAS实现根据矢量数据的一个属性字段,裁剪栅格并生成多个栅格文件
  • npm镜像源证书过期的问题解决
  • Linux学习-Ansible(二)
  • 严重干扰的验证码识别系统源码分享
  • Pandas与Matplotlib:Python中的动态数据可视化
  • 非凸科技钻石赞助第四届Rust China Conf 2024
  • 【渗透测试】——DVWA靶场搭建
  • 【运维监控】系列文章汇总索引
  • 网络学习-eNSP配置VRRP
  • 第15-02章:理解Class类并获取Class实例
  • 食品加工废水处理设备工作原理
  • C51单片机-单按键输入识别,键盘消抖
  • 极狐GitLab CI/CD 作业一直处于等待状态,如何解决?
  • 用Qt 对接‌百度语音识别接口
  • Google 是如何开发 Web 框架的
  • [笔记] php常见简单功能及函数
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Java 多线程编程之:notify 和 wait 用法
  • Java反射-动态类加载和重新加载
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js正则,这点儿就够用了
  • Logstash 参考指南(目录)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React-flux杂记
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring + angular 实现导出excel
  • vue.js框架原理浅析
  • 工程优化暨babel升级小记
  • 计算机在识别图像时“看到”了什么?
  • 配置 PM2 实现代码自动发布
  • 前端学习笔记之观察者模式
  • 听说你叫Java(二)–Servlet请求
  • 详解移动APP与web APP的区别
  • 用Canvas画一棵二叉树
  • Java总结 - String - 这篇请使劲喷我
  • 第二十章:异步和文件I/O.(二十三)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #QT 笔记一
  • (C语言)字符分类函数
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (杂交版)植物大战僵尸
  • (转)Oracle存储过程编写经验和优化措施
  • (转)setTimeout 和 setInterval 的区别
  • .htaccess 强制https 单独排除某个目录
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net Core 微服务之Consul(三)-KV存储分布式锁