上一篇结束的时候,我们已经部署了一套Jenkins环境,今天我们就在这套环境里来创建一条简单的流水线来做应用的构建并发布到这个集群
开始之前
-
在集群中创建用到的registry的访问密钥,这里我们使用阿里云容器镜像服务的北京区域
$ docker login -u xxx -p xxx registry.cn-beijing.aliyuncs.com Login Succeeded $ kubectl create secret generic jenkins-docker-cfg -n ci --from-file=/root/.docker/config.json
> 注意:如果是在Mac上操作,需要先把~/.docker/config.json里的`credsStore`参数项删除再去login
-
创建流水线部署的目标环境,这里我们选择部署到这个集群的pro namespace,对于正式环境,请选择不同的集群
$ kubectl create ns pro
-
在jenkins中创建访问目标集群的密钥
$ kubectl -n kube-system get serviceaccount admin -o go-template --template='{{range .secrets}}{{.name}}{{"\n"}}{{end}}' ${admin-token-6xbcz} $ kubectl -n kube-system get secrets ${admin-token-6xbcz} -o go-template --template '{{index .data "token"}}' | base64 -D eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2V[...]
- 将获取到的token保存在Jenkins里
配置流水线
- 创建流水线项目
-
配置pipeline逻辑,将下面一段pipeline代码写入项目的
Pipeline script
pipeline { agent { kubernetes { label 'jenkins-pod' defaultContainer 'jnlp' yaml """ apiVersion: v1 kind: Pod metadata: labels: app: jenkins-slave-pod spec: containers: - name: golang image: golang:1.12 command: - cat tty: true - name: kaniko image: registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-kaniko:0.6.0 command: - cat tty: true volumeMounts: - name: ymian mountPath: /root/.docker - name: kubectl image: roffe/kubectl:v1.13.2 command: - cat tty: true - name: busybox image: ymian/busybox command: - cat tty: true volumes: - name: ymian secret: secretName: jenkins-docker-cfg items: - key: config.json path: config.json """ } } stages { stage('Build') { steps { container('golang') { git url: 'https://github.com/HYmian/gin-sample.git' sh """ go build -mod vendor -v """ } } } stage('Image Build And Publish') { steps { container("kaniko") { sh "kaniko -f `pwd`/Dockerfile -c `pwd` -d registry.cn-beijing.aliyuncs.com/${your_repo}/gin-sample" } } } stage('Deploy to pro') { steps { container("kubectl") { withKubeConfig( [ credentialsId: 'pro-env', serverUrl: 'https://kubernetes.default.svc.cluster.local' ] ) { sh ''' kubectl apply -f `pwd`/deploy.yaml -n pro kubectl wait --for=condition=Ready pod -l app=gin-sample --timeout=60s -n pro ''' } } } } } }
- 我们这里为了演示方便,直接在Jenkins里写pipeline的逻辑,但是在正式使用时,应该将pipeline保存为单独的文件并和项目的代码放在同一个仓库里
- 注意将代码里的${your_repo}替换成自己的仓库名称
- 验证流水线,手动触发,成功后可以在
blue ocean
中看到结果
小结
本文配置了一条包含构建、打包、部署三个stage的简单流水线,pipeline是Jenkins 2.0开始引入的概念,关于pipeline的优势可以参考官方给出的说明
可能在上面一节里,关于agent这一段的定义会让大家更迷惑一点,在下一篇文章里,我们会着重给大家介绍这一部分