本文主要示範如何在阿裡雲Kubernetes服務上快速搭建jenkins持續內建環境,并基于提供的示例應用快速完成應用源碼編譯、鏡像建構和推送以及應用部署的流水線。
前置條件
已經建立了ACK叢集。
建議: 建議使用者先按照以下文檔安裝部署ack-jenkins應用, 然後成功運作建構任務示例demo-pipeline, 再依照此建構任務示例改造自己的建構任務配置。
1. 快速部署ack-jenkins
在容器服務-Kubernetes -> 市場 -> 應用目錄 -> ack-jenkins:

點選 參數 菜單修改 AdminPassword 字段, 選擇Kubernetes叢集、填寫命名空間和釋出名稱并點選建立:
通路jenkins服務:
使用使用者名密碼登入jenkins系統:
ps:如未設定登陸密碼,則可在部署完畢後使用如下命名檢視:
$ printf $(kubectl get secret --namespace ci jenkins-ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
在 新手入門頁面點選安裝推薦的插件(已預設安裝了所有推薦的插件)
在 執行個體配置頁面 點選儲存并完成。
點選開始使用Jenkins:
進入Jenkins系統後,可以看到名為demo-pipeline的建構任務,可以直接點選建構,測試Kubernetes叢集動态配置設定jenkins slave pod、jenkins slave pod自動連接配接jenkins master是否正常。首先點選建構任務進入建構任務詳情頁面,點選Build with Parameters,保持建構參數不動,點選開始建構。
執行建構後,Jenkins開始從Kubernetes叢集動态建立一個slave pod運作本次建構任務。示例應用代碼:
https://github.com/AliyunContainerService/jenkins-demo或
https://code.aliyun.com/haoshuwei/jenkins-demo.git若建構成功則驗證Jenkins on Kubernetes運作正常。
2. 配置 Kubernetes Cloud的配置說明
下面我們對Kubernetes Cloud的配置做簡單說明,這些配置在部署ack-jenkins的時候已經自動化配置完畢。
Jenkins使用Kubernetes Plugin連接配接Kubernetes叢集并動态生成和釋放slave pod,關于slave pod的模闆配置需要在 系統管理 -> 系統配置 -> 雲 中進行配置
- 名稱:kubernetes;
- Kubernetes 位址:
https://kubernetes.default.svc.cluster.local:443;jenkins 系統安裝在目前叢集中,可以使用内部服務端點通路叢集的 API Server
- Kubernetes 命名空間:jenkins;動态 slave pod 會在命名空間 jenkins 下生成和銷毀
點選 `測試` 按鈕驗證連接配接無誤:

- Jenkins 位址:http://ack-jenkins-default:8080;slave pod連接配接jenkins master使用的服務端點
- Jenkins 通道:ack-jenkins-default-agent:50000;slave pod使用jnlp連接配接jenkins master

- Pod Templates -> 名稱: slave-pipeline; slave pod名稱
- Pod Templates -> 命名空間:jenkins
- Pod Templates -> 标簽清單:slave-pipeline;jenkins 建構任務通過此标簽選擇使用哪個模闆生成slave pod

- Pod Templates -> 容器清單 -> jnlp;用于jnlp連接配接jenkins master

- Pod Templates -> 容器清單 -> kaniko;用于建構和推送容器鏡像

- Pod Templates -> 容器清單 -> maven:用于maven建構和打包應用

- Pod Templates -> 容器清單 -> kubectl:用于kubectl指令行部署應用

3. 如何為slave pod配置maven緩存
由于slave pod是在Kubernetes叢集中動态生成的,可能運作于叢集的任何一個worker節點,是以要保證每次動态生成slave pod時都能使用到maven緩存,就必須使用共享存儲持久化存儲卷,如何建立NAS共享存儲卷請參考:
https://help.aliyun.com/document_detail/144398.html例如,本示例中我們的Jenkins系統部署在jenkins命名空間下,那麼首先需要在jenkins命名空間下建立一個NAS持久化存儲卷,如下所示:
kubectl -n jenkins get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ack-jenkins-default Bound d-2ze8xhgzuw1t278jjzbj 20Gi RWO alicloud-disk-efficiency 3h16m
nas-csi-pvc Bound nas-c6c3e703-58a9-484e-8ce5-630486ea265d 20Gi RWX alicloud-nas-subpath 4m17s
存儲卷ack-jenkins-default是Jenkins Master的/var/jenkins_home目錄的持久化存儲,nas-csi-pvc則是我們為maven緩存NAS持久化存儲卷。
在Jenkins的 系統管理->系統配置->Kubernetes Cloud配置頁面中,點選Pod Templates details,如下圖所示:
在Pod Template中添加Persistent Volume Claim類型挂載,申明值為NAS存儲聲明的名字,本示例為nas-csi-pvc,挂載路徑為maven預設緩存路徑/root/.m2/repository。如下圖所示:
點選SAVE,儲存配置。
下面測試maven緩存是否生效。
首先編輯demo-pipeline建構任務,選擇Jekinsfile.maven檔案進行建構,如下圖所示:
儲存并執行建構,可以看到第一次maven建構時,需要花費一段時間下載下傳所有依賴包:
再次進行maven建構,則會引用緩存的依賴包,快速完成源碼打包:
如果您需要為jenkins slave pod挂載自定義settings檔案,則可以先建立Configmap,然後再配置到Pod Template上:
kubectl -n jenkins create configmap maven-config --from-file=settings.xml
4. 如何使用kaniko建構和推送容器鏡像
使用kaniko推送鏡像時,需要設定鏡像倉庫的通路權限,在本示例中,首先需要在Linux環境下(請注意不要在MacOS下生成)生成通路鏡像倉庫的config.json檔案,例如我們需要建構和推送一個鏡像registry.cn-hangzhou.aliyuncs.com/haoshuwei24/jenkins-demo:20200428,則生成config.json檔案的指令為:
$ docker login -u xxx -p xxx registry.cn-hangzhou.aliyuncs.com
Login Succeeded
在jenkins命名空間下使用生成的config.json檔案建立名為jenkins-docker-cfg的Secret:
kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json
在Pod Template中添加挂載配置和環境變量設定:
下面測試kaniko建構和推送鏡像。
首先修改demo-pipeline使用Jenkinsfile.kaniko檔案進行建構。
請将建構參數修改為您實際的鏡像倉庫相關資訊并執行建構:
檢視kaniko建構日志如下所示:
也可以在容器鏡像倉庫檢視是否已經成功推送:
5. jenkins更新
如果您的jenkins環境需要更換jenkins-master鏡像,請先為/var/jenkins_home目錄對應的雲盤存儲卷做快照備份,因為新版本的jenkins master會有自動化腳本往/var/jenkins_home目錄寫資料的動作,防止覆寫已有資料。