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

自动化CI操作

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

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替换
groovy 复制代码
// 所有的脚本命令都放在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}:latest
				docker 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

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: harbor.com/sswang/pipeline:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  selector:
    app: pipeline
  ports:
    - port: 8082
      targetPort: 8080
  type: NodePort

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: nginx
  rules:
  - host: pipeline.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: pipeline
            port:
              number: 8082

重新触发部署后发现成功了

但是还有一个问题,因为我们是修改的pipeline.yml,所以生效了,但是我要是修改controller之后,还是没有变化,不信的话可以自己试一下,我试过了。哈哈哈,要解决这个问题,就要修改kubectl的命令

  • 最终修改Jenkinsfile文件,添加k8s部署命令
bash 复制代码
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文件

groovy 复制代码
// 所有的脚本命令都放在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}:latest
				docker 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
                ssh root@192.168.201.120 kubectl rollout restart deployment pipeline -n test'''
			}
		}
	}
}

修改controller文件验证

java 复制代码
/**
 * @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的笔记,与大家一起进步。

相关推荐
XMYX-02 天前
深入理解 DevOps:从理念到实践
运维·devops
cronaldo912 天前
研发效能DevOps: Vite 使用 Axios 实现数据双向绑定
vue.js·vue·devops
联蔚盘云2 天前
阿里云 DevOps 资源安全扫描实践
安全·阿里云·devops
落非2 天前
kubesphere问题处理:devops
运维·devops
东方不败之鸭梨的测试笔记2 天前
如何建立devops?
java·运维·devops
运维&陈同学2 天前
【第三章】Python基础之元组tuple
linux·开发语言·python·运维开发·devops
思码逸研发效能3 天前
如何通过对敏捷实践的调整,帮助远程团队提升研发效能?
研发效能·敏捷开发·devops·敏捷流程·研发效能度量
霍格沃兹测试开发学社测试人社区3 天前
深入了解测试开发与DevOps体系
运维·软件测试·测试开发·devops
xcg3401234 天前
【系统分析师】-2024年11月论文-论DevOps开发
论文·devops·2024.11软考
天草二十六_简村人4 天前
jenkins用户在执行scp的时候如何做免密登录
运维·ci/cd·node.js·jenkins·php·devops