上一篇結束的時候,我們已經部署了一套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這一段的定義會讓大家更迷惑一點,在下一篇文章裡,我們會着重給大家介紹這一部分