CI/CD是大部分企业非常重要的一部分,也是必备的,相信大家都不陌生,每个企业都有自己的CI/CD,今天我们讲讲如何通过jenkins和argocd来实现CI/CD。
环境说明:
- 测试代码仓库:https://github.com/nieweixing/nieweixing-test-springboot
- k8s环境:腾讯云tke集群,版本1.18.4
- docker镜像仓库:腾讯云ccr个人版镜像仓库
- jenkins版本:2.332.2
- argocd版本:v2.3.3
本次自动化构建和发布的流程大致如下,jenkins里面配置maven的流水线,从远程仓库拉取代码,然后进行maven打包,docker构建镜像,推送镜像到远程镜像仓库,然后对应k8s部署yaml文件,并提交到远程github上,argocd感知到远程仓库的yaml有更新后,开始更新集群内部署的deployment,pod更新完成后,发布完成。
1. 部署jenkins
这里我们通过helm来部署下jenkins
代码语言:javascript复制helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm fetch jenkinsci/jenkins
helm install jenkins ./jenkins -n weixnie
部署好之后,通过service访问下jenkins的页面,如果集群有安装nginx-ingress,也可以配置ingress来通过域名访问。
安装下构建需要用到的插件,基本的插件都安装下,这里主要说明下本次需要用到的插件:
- Maven Integration:本次测试项目是springboot,需要用maven构建
- GitHub plugin:访问github的api
- Git Push Plugin:修改代码仓库的yaml文件,并推送到远程仓库
- Docker API Plugin:链接远程机器的docker构建镜像
- CloudBees Docker Build and Publish:推送docker镜像到远程仓库
2. 部署argocd
部署argocd可以直接用官网的yaml文件,但是官网的镜像是quay.io,国内可能无法拉取,可以用我已经上传到ccr的镜像,执行下面命令替换即可
代码语言:javascript复制# wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# sed -i "s/quay.io/argoproj/argocd-applicationset:v0.4.1/ccr.ccs.tencentyun.com/niewx-k8s/argocd-applicationset:v0.4.1/g" install.yaml
# sed -i "s/ghcr.io/dexidp/dex:v2.30.2/ccr.ccs.tencentyun.com/niewx-k8s/dexidp-dex:v2.30.2/g" install.yaml
# sed -i "s/quay.io/argoproj/argocd:v2.3.3/ccr.ccs.tencentyun.com/niewx-k8s/argocd:v2.3.3/g" install.yaml
# kubectl apply -f install.yaml -n weixnie
apply修改后的yaml文件,等pod运行正常即可
代码语言:javascript复制[root@VM-0-4-centos weixnie]# kubectl get pod,svc -n weixnie | grep argo
pod/argocd-application-controller-0 1/1 Running 0 4d23h
pod/argocd-applicationset-controller-8567f5896f-zrddj 1/1 Running 0 4d23h
pod/argocd-dex-server-549fb6cd85-pr5hx 1/1 Running 0 8d
pod/argocd-notifications-controller-769bc57494-pgddn 1/1 Running 0 4d23h
pod/argocd-redis-86c97c8c64-ltqr8 1/1 Running 0 4d23h
pod/argocd-repo-server-6cb9d8dfbc-lf59j 1/1 Running 0 8d
pod/argocd-server-6db9f6dcf7-xrp49 1/1 Running 0 5d2h
service/argocd-applicationset-controller ClusterIP 10.55.255.196 <none> 7000/TCP 9d
service/argocd-dex-server ClusterIP 10.55.252.200 <none> 5556/TCP,5557/TCP,5558/TCP 9d
service/argocd-metrics ClusterIP 10.55.253.213 <none> 8082/TCP 9d
service/argocd-notifications-controller-metrics ClusterIP 10.55.255.53 <none> 9001/TCP 9d
service/argocd-redis ClusterIP 10.55.255.160 <none> 6379/TCP 9d
service/argocd-repo-server ClusterIP 10.55.254.199 <none> 8081/TCP,8084/TCP 9d
service/argocd-server LoadBalancer 10.55.255.143 172.16.0.49 80:31639/TCP,443:31211/TCP 9d
service/argocd-server-metrics ClusterIP 10.55.253.38 <none> 8083/TCP 9d
然后获取下argocd初始的登录密码,登录用户默认是admin,初始密码默认存在argocd-initial-admin-secret,可以通过下面命令获取
代码语言:javascript复制# kubectl get secret -n weixnie argocd-initial-admin-secret -o=jsonpath={.data.password} | base64 -d
O42jxxxxxx
通过获取的密码和admin用户控制台登录argocd即可。
3. 配置流水线
接下来,我们开始在jenkins配置下流水线,首先配置下全局配置,配置下docker
配置下github服务器
配置下git plugin
然后配置下docker的cloud
全局配置好之后,我们创建下maven项目的流水线
配置下源码管理,Credentials是github的登录用户名和密码,源码库浏览器选githubweb
构建触发器选择GitHub hook trigger for GITScm polling,当github仓库有代码更新时,则会自动触发流水线执行。
注意,构建触发器不能勾选,因为我这里的流水线会修改部署的yaml上传到github上,如果勾选自动触发,会不断循环执行流水线,因此这里不能采用触发器,自动构建,如果不需要修改代码文件上传到github,可以配置下自动构建。
构建环境选择Use secret text(s) or file(s),然后配置下github的登录凭证
pre step配置下pom.xml,用来执行maven构建打包
结下来配置下Post Steps,这一步配置了2个任务,一个是打包镜像,选择Run regardless of build result,dockerfile路径指定下,如果是根路径则是.
,cloud选择我们之前配置的docker,image填写自己的镜像仓库地址ccr.ccs.tencentyun.com/nwx_registry/springboot:${BUILD_NUMBER},tag这里用了内置的环境变量,默认是每次执行job的数值,然后勾选Push image和Clean local images,并配置下镜像仓库的登录凭证
第二个任务是通过shell脚本修改deploy的部署yaml,将镜像换成最新的tag
代码语言:javascript复制cd /var/jenkins_home/workspace/github-mvn-test/deploy
old_tag=`grep -i ccr. deploy.yaml | awk -F ":" '{print $NF}'`
sed -i "s/ccr.ccs.tencentyun.com/nwx_registry/springboot:$old_tag/ccr.ccs.tencentyun.com/nwx_registry/springboot:${BUILD_NUMBER}/" deploy.yaml
cd /var/jenkins_home/workspace/github-mvn-test/
git add .
git commit -am "test"
最后配置下构建后操作,配置git push,将代码上传到github上。
4. 配置argocd的Applications
配置好jenkins流水线后,我们配置下argocd的应用,只要github仓库更新了部署的目录下文件,这里部署的yaml是在deploy目录下,接下来argocd就会自动执行应用,更新集群里面的工作负载。
创建好之后,会有个Applications
这里创建application时候遇到一个问题,一直提示argocd-server这个sa对应的rbac权限不足,但是部署的时候默认是绑定的argocd-application-controller这个ClusterRole是有足够的权限的。
后面我这直接给绑定了tke集群默认的tke:admin这个ClusterRole就正常了,这里具体的原因没排查到。
代码语言:javascript复制kubectl create clusterrolebinding argocd-application-controller-binding --clusterrole=tke:admin --serviceaccount=weixnie:argocd-application-controller
5. 测试提交代码触发自动构建及发布
上面jenkins和argocd,都配置好了,下面我们直接在远程仓库提交下代码,然后看下是否会自动构建并发布到tke集群内。
我们修改下README.md,加上当前时间
提交代码后,jenkins上点击下立即构建
可以查看下日志,发现构建成功,对应的镜像tag是42,然后我们看下argocd是否有自动部署
可以发现argocd执行了镜像更新操作,我看再到集群看下pod是否正常更新
可以发下pod也正常更新了,说明这里我们部署成功了。