基于kubernetes集群的项目持续集成(gitlab+harbor+Jenkins)自动化构建部署(CICD)流程事例 weir 2018-06-05 16:30:52.0 kubernetes,CICD 14527 持续集成对于大型可持续发展的项目来说是一个非常必要的环节,对于系统运维影响了比较大,公司一般都是在内部局域网内完成。可以区分开发测试预上线和正式环境的一系列操作,真正的实现运维的自动化管理。 开始之前说一个之前文章里面的坑,你懂的: 首先是说k8s集群的其实没什么坑了只是要完善一下,有几个地方之前安装需要端口,但是高可用之后就不需要了,这里就需要修改一下: master 和node 都要去掉端口号,都检查一遍 还有上次安装的Jenkins也有个问题,不知道你们有没有类似的问题: yum 安装需要openjdk 但是我在/etc/profile 里面设置的变量没有生效搞得我又删除了yum安装的Jenkins,直接用war包安装了一个然后用的是oracle JDK: java -jar jenkins.war --httpPort=8180 还有就是后面k8s集群在使用harbor私有仓库时如果你的项目是私有的,那就需要设置访问权限: kubectl create secret docker-registry harborweir --docker-server=hub.weir.com:1180 --docker-username=admin --docker-password=Harbor12345 --docker-email=team@test.com 这个是我本地测试的,大家根据自己的账号密码还有私有仓库域名来定。 剩下的我们就需要怎么通过Jenkins来做到从代码上传到自动部署到k8s集群这个过程了。 构建过程就跟我上次发的图示差不多,放到Jenkins里面其实就是一系列的脚本按顺序执行就行了。 environment { REPOSITORY="git@192.168.38.57:weir/spring-cloud-project.git" MODULE="eureka_server" SCRIPT_PATH="/home/weir/script" } 这个就是定义一些变量提供给下面使用,我这里拿一个模块做例子: #!groovy pipeline { agent any environment { REPOSITORY="git@192.168.38.57:weir/spring-cloud-project.git" MODULE="eureka-server-one" SCRIPT_PATH="/home/weir/script" } stages { stage('获取代码') { steps { echo "开始获取代码从:git:${REPOSITORY}" deleteDir() git "${REPOSITORY}" } } stage('代码静态检查') { steps { echo "开始检查" } } stage('编译+单元测试') { steps { echo "开始编译" dir('parent-spring_cloud/eureka-server-one') { sh 'mvn -B -Dmaven.test.failure.ignore=true -am clean package' } } } stage('构建镜像') { steps { echo "开始构建镜像" dir('parent-spring_cloud') { sh '${SCRIPT_PATH}/build-images.sh ${MODULE}' } } } stage('发布系统') { steps { echo "开始发布系统" sh '${SCRIPT_PATH}/deploy1.sh ${MODULE}-deployment ${MODULE}' } } } } REPOSITORY=git@192.168.38.57:weir/spring-cloud-project.git 这个是项目git地址 MODULE="eureka_server" 这是里面的一个模块按模块来划分 SCRIPT_PATH="/home/weir/script" 这个是要执行的脚本存放位置 第一步代码拉去: stage('获取代码') { steps { echo "开始获取代码从:git:${REPOSITORY}" deleteDir() git "${REPOSITORY}" } } 从git服务器拉取代码到安装Jenkins的机器上面 第二步代码静态检查: stage('代码静态检查') { steps { echo "开始检查" } } 这个我没做,可根据自身实际情况来做。 第三步编译代码: stage('编译+单元测试') { steps { echo "开始编译" dir('parent-spring_cloud/eureka_server') { sh 'mvn -B -Dmaven.test.failure.ignore=true -am clean package' } } } 我这里工程结构有点复杂,多了几层所以用了dir。Maven构建目的是要打成jar包(或者war包) 第四步构建镜像: stage('构建镜像') { steps { echo "开始构建镜像" dir('parent-spring_cloud') { sh '${SCRIPT_PATH}/build-images.sh ${MODULE}' } } } 这里用到了本地脚本build-images.sh文件: #/bin/bash MODULE=$1 TIME=`date "+%Y%m%d%H%M"` DIT_REVISION=`git log -1 --pretty=format:"%h"` IMAGE_NAME=hub.weir.com:1180/spring-cloud/${MODULE}:${TIME}_${DIT_REVISION} cd ${MODULE} docker build -t ${IMAGE_NAME} . cd - docker push ${IMAGE_NAME} echo "${IMAGE_NAME}" > /home/weir/script/IMAGE_NAME 看看脚本里面要执行的东西就知道这是在构建模块的docker镜像,这里是不是还少一个文件就是Dockerfile,这个文件在项目工程里面所以拿到工程代码自然就拿到这个文件了。 大家注意一下脚本里面的写法。 第五步发布模块: stage('发布系统') { steps { echo "开始发布系统" sh '${SCRIPT_PATH}/deploy.sh ${MODULE}-deployment ${MODULE}' } } 这里的发布就是自动化部署到k8s集群里面,这里也用到了一个脚本文件deploy.sh: #!/bin/bash IMAGE=`cat /home/weir/script/IMAGE_NAME` DEPLOYMENT=$1 MODULE=$2 templ=`cat /home/weir/script/${MODULE}.template.yaml` printf "image=$IMAGE\ncat << EOF\n$templ\nEOF" | bash > /home/weir/k8s/${MODULE}.yaml echo "update image to:${IMAGE}" kubectl apply -f /home/weir/k8s/${MODULE}.yaml 如果对于linux脚本熟悉的来说这些都非常简单,对我来说是第一次写废了好大功夫。 后面优化做成通用的就更好了,只需要传不同的模块名称就完美了。