Kubernetes CICD 开发部署环境

此篇可作为开发人员部署环境, 请先查看CICD流程篇章

前提环境:

涉及参考文档:

插件文档介绍:

接着上篇文章操作 Kubernetes CICD发布架构流程思路

一、配置Job构建参数

1、web 界面手动设置构建参数

在这里插入图片描述
在这里插入图片描述

2、书写Pipeline 构建语法

pipeline {
	environment{
	    Giturl =  'http://192.168.11.178/root/aliyun.git'  //gitlab仓库
		BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()  //设置分支变量
		Project_Namespace = 'jenkins' //设置名称空间名称
		Project_Nmae = 'maven-test'	 //设置应用的Pod名称
		version =  sh(returnStdout: true,script: 'date +%Y%W%d%H%M').trim()  //设置当前时间为镜像版本标记
	}	
    agent{
        node{
          label 'jnlp-slave'
        }
      }
    stages {
		stage('Git拉取代码') {
            steps {                
				git branch: '${BRANCH}', credentialsId: '', url: "$Giturl"  //可以选定构建的分支
            }
        }
        stage('编译') {
            steps {
				timeout(5)   //超时5分钟中断任务
				{
				script {
					container('maven') { 
						// 打包构建出来的是jar包或者war包
						echo "[BUILD INFO] 文件编译中,请耐心等待......"
						if(params.jar_war == 'jar') { 
							sh """
								echo "开始编译 jar 包......"
								mvn clean package -X -P production -e -U
								"""
						} else{ 
							sh """
								echo "开始编译 war 包......"
								mvn -e clean package -U -Dmaven.test.skip=true -P production
								""" 
							}
						}
					}
				}
			}
		}
		stage('镜像打包上传镜像仓库'){
          steps{
			  timeout(3)   //超时3分钟中断任务
			  {	container("kaniko") {
                  sh """
						kaniko -f `pwd`/Dockerfile -c `pwd`  --skip-tls-verify=true --destination=192.168.11.130:4430/$Project_Namespace/$Project_Nmae:$version
					"""
					}
				}
			}
		}
		stage('发布到k8s集群'){
          steps{
              container("kubectl") {
                  withKubeConfig(caCertificate: '',  //如果serverUrl提供了,则用于验证API服务器证书的群集证书颁发机构。如果未提供参数,则跳过验证。
								clusterName: '', 	//修改当前上下文的集群。cluster如果serverUrl提供了a ,也用于生成的块。
								contextName: '', 	//将当前上下文切换到该名称。上下文必须已经存在于KubeConfig文件中。
								credentialsId: 'admin-sa',	//普通KubeConfig文件的Jenkins ID。(webp配置admin的serviceaccount)
								namespace: '',	//	修改当前上下文的命名空间
								serverUrl: 'https://kubernetes.default.svc.cluster.local'  //API服务器的网址。这将创建一个新cluster块并修改当前上下文以使用它。
								)
							{ 
								sh """
									sed -i 's/\$Project_Namespace/$Project_Namespace/g'   `pwd`/deployment.yaml  #替换名称空间
									sed  -i 's/\$Project_Nmae/$Project_Nmae/g' 	  `pwd`/deployment.yaml	 # 替换项目名称
									sed  -i 's/\$version/$version/g' `pwd`/deployment.yaml  #替换镜像版本号——时间代替版本号
									kubectl apply -f `pwd`/deployment.yaml 
									kubectl wait --for=condition=Ready pod -l app=jenkins-java-demo --timeout=60s -n jenkins
								 """
						}
					}
				}
			}
    }
}

二、新建分支并提交代码

1、创建并切换分支

git checkout -b newmaven

在这里插入图片描述

2、修改 deployment.yaml文件

在这里插入图片描述

vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $Project_Nmae
  namespace: $Project_Namespace
spec:
  replicas: 2
  selector:
    matchLabels:
      app: $Project_Nmae
  template:
    metadata:
      labels:
        app: $Project_Nmae
    spec:
      containers:
      - name: $Project_Nmae
        image: 192.168.11.130:4430/$Project_Namespace/$Project_Nmae:$version
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: $Project_Nmae
  namespace: $Project_Namespace
spec:
  ports:
  - name: $Project_Nmae
    port: 8080
    targetPort: 8080
    nodePort: 30082
  selector:
    app: $Project_Nmae
  type: NodePort

3、对本次操作打标签并且提交代码

git add  -A &&  git commit  -m "v1"

在这里插入图片描述

git  push  origin newmaven

在这里插入图片描述

三、项目构建测试

1、构建新建 newmaven 分支(后期优化自动获取git分支)

在这里插入图片描述
点击构建测试
在这里插入图片描述
在这里插入图片描述

2、查看服务是否重启更新

kubectl  get po -n jenkins -w

在这里插入图片描述

3、日志发现时间正确

在这里插入图片描述
原因分析:

  • 搭建Jenkins 我已经将Jenkins与宿主机的时间文件挂载,同时这是一个新的Pod允许那问题就是宿主机(node节点),时间服务不正常。(问题排除)
    在这里插入图片描述
    在这里插入图片描述
    Jenkins 容器时间正常。

  • 接下来就是确定是否新起来容器时间有问题,简单只需要重新起一个新的Pod即可查看,Jenkins web界面再次构建测试。
    在这里插入图片描述
    在这里插入图片描述
    问题已排除到。 进行修复即可。

4、Slave Pod 挂载时间文件(/etc/localtime)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、再次构建Job

在这里插入图片描述

这时候可登录黑屏操作新的 jnlp-slave容器 的时间
在这里插入图片描述
在这里插入图片描述

四、钉钉构建通知

安装插件:

1、系统配置 钉钉 ID

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、书写Pipeline 构建语法

pipeline {
	environment{
	    Giturl =  'http://192.168.11.178/root/aliyun.git'
		BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
		Project_Namespace = 'jenkins'
		Project_Nmae = 'maven-test'	
		version =  sh(returnStdout: true,script: 'date +%Y%W%d%H%M').trim()
		NowTimes =  sh(returnStdout: true,script: 'date +%F" "%T').trim()
		BUILD_USER = ""
	}	
    agent{
        node{
          label 'jnlp-slave'
        }
      }
    stages {
		stage('Git拉取代码') {
            steps {                
				git branch: '${BRANCH}', credentialsId: '', url: "$Giturl"
            }
        }
        stage('编译') {
            steps {
				timeout(5)
				{
				script {
					container('maven') { 
						// 打包构建出来的是jar包或者war包
						echo "[BUILD INFO] 文件编译中,请耐心等待......"
						if(params.jar_war == 'jar') { 
							sh """
								echo "开始编译 jar 包......"
								mvn clean package -X -P production -e -U
								"""
						} else{ 
							sh """
								echo "开始编译 war 包......"
								mvn -e clean package -U -Dmaven.test.skip=true -P production
								""" 
						}
					}
                }
            }
        }
		}
		stage('镜像打包上传镜像仓库'){
          steps{
			  timeout(3)  
			  {	container("kaniko") {
                  sh """
						kaniko -f `pwd`/Dockerfile -c `pwd`  --skip-tls-verify=true --destination=192.168.11.130:4430/$Project_Namespace/$Project_Nmae:$version
					"""
					}
				}
			}
		}
		stage('发布到k8s集群'){
          steps{
              container("kubectl") {
                  withKubeConfig(caCertificate: '',  //如果serverUrl提供了,则用于验证API服务器证书的群集证书颁发机构。如果未提供参数,则跳过验证。
								clusterName: '', 	//修改当前上下文的集群。cluster如果serverUrl提供了a ,也用于生成的块。
								contextName: '', 	//将当前上下文切换到该名称。上下文必须已经存在于KubeConfig文件中。
								credentialsId: 'admin-sa',	//普通KubeConfig文件的Jenkins ID。(webp配置admin的serviceaccount)
								namespace: '',	//	修改当前上下文的命名空间
								serverUrl: 'https://kubernetes.default.svc.cluster.local'  //API服务器的网址。这将创建一个新cluster块并修改当前上下文以使用它。
								)
							{ 
								sh """
									sed -i 's/\$Project_Namespace/$Project_Namespace/g'   `pwd`/deployment.yaml  #替换名称空间
									sed  -i 's/\$Project_Nmae/$Project_Nmae/g' 	  `pwd`/deployment.yaml	 # 替换项目名称
									sed  -i 's/\$version/$version/g' `pwd`/deployment.yaml  #替换镜像版本号——时间代替版本号
									kubectl apply -f `pwd`/deployment.yaml 
									kubectl wait --for=condition=Ready pod -l app=jenkins-java-demo --timeout=60s -n jenkins
								 """
						}
					}
				}
			}
    }
	post {
		success {
				wrap([$class: 'BuildUser']) {
                   script {
                       BUILD_USER_ID = "${env.BUILD_USER_ID}"
                       BUILD_USER = "${env.BUILD_USER}"
                       BUILD_USER_EMAIL = "${env.BUILD_USER_EMAIL}"
                   }
				   dingtalk (
                        robot: 'dingding',
                        type: 'MARKDOWN', 
                        title: '恭喜 $JOB_BASE_NAME Job部署成功',
                        text: [
								'# [$Project_Nmae 应用部署成功](${env.JOB_URL})', 
								'',
								'---',
								'',
								'# [=====================](${env.JOB_URL}) ',
								'<font color=red>项目状态</font>: [部署成功](${env.JOB_URL}) 🤩',
								'# [ ]()',
								'部署时间: ${NowTimes}',
								'# [ ]()',
								'构建镜像:  192.168.11.130:4430/$Project_Namespace/$Project_Nmae:$version',
								'# [                                      ]()',
								'持续时间: 待定',  
								'# [ ]()',
								'执行人:  [${BUILD_USER}](${env.JOB_URL})',
								'',
								'# [=====================](${env.JOB_URL}) ',
								'',
								'---',
								'',			
								'![成功](https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3047085180,1986287365&fm=26&gp=0.jpg)'		
                        ],
						atAll: true,
						)
					}
				}
		failure {
			wrap([$class: 'BuildUser']) {
				script {
					BUILD_USER = "${env.BUILD_USER}"
					}
				dingtalk (
                        robot: 'dingding',
                        type: 'ACTION_CARD',
                        title: '$JOB_BASE_NAME Job 部署失败 😈',
                        text: [
								'# [$Project_Nmae 应用部署失败](${env.JOB_URL})', 
								'',
								'---',
								'',
								'<font color=red>项目状态</font>: 部署失败 😈',
								'# [ ]()',
								'部署时间: ${NowTimes}',
								'# [ ]()',
								'构建镜像:  192.168.11.130:4430/$Project_Namespace/$Project_Nmae:$version',
								'# [ ]()',
								'持续时间: 待定',  
								'# [ ]()',
								'执行人:  ${BUILD_USER}',
								'',
								'---',
								'',
								'![](https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1228642624,727395396&fm=26&gp=0.jpg)'								
                        ],
						btns: [
							[
								title: '部署失败😈',
								actionUrl: ''
							  ],
							[
								title: '跳转$JOB_BASE_NAME Job',
								actionUrl: '${BUILD_URL}'
							]
						 ],
						atAll: true,
					)
			}
		}
	}	
}

2、 再次构建测试

实验成功 都再次跑在 CICD 测试这个Job,看到不同的Job没事,代码是相同的。
在这里插入图片描述
在这里插入图片描述

3、查看钉钉消息

在这里插入图片描述
服务也发布成功
在这里插入图片描述

访问服务
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值