tke上如何通过jenkins和argocd完成代码自动化发布

2022-05-11 21:07:46 浏览数 (1)

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也正常更新了,说明这里我们部署成功了。

0 人点赞