基于K8s的动态Jenkins Slave构建实践
前言
源于這篇文章分享的經驗 基于 Kubernetes 的 Jenkins 構建集群實踐,這里記錄一下實踐落地過程。
環境
這里Jenkins Master的安裝沒有采用容器鏡像的方式,直接就是rpm包安裝。
版本信息:
Jenkins 2.107.1
Kubernetes plugin 1.4
kubernetes集群 1.5.2
這里就不詳細說明安裝過程了。
配置
環境都安裝好后,配置Jenkins,進入系統管理—>系統設置—>云
新增一個云Kubernetes,配置如下:
配置比較簡單,這里也沒有采用自定義的slave模板,默認Jenkins使用的是jenkins/jnlp-slave:alpine鏡像作為動態的運行的slave。
其中Kubernetes URL也可以通過命令查看:
# kubectl cluster-info
Kubernetes master 所在的地址即可,比如:
Kubernetes master is running at https://10.1.241.82:8080/r/projects/1a7/kubernetes:6443
這里的URL就填 https://10.1.241.82:8080/r/projects/1a7/kubernetes:6443
測試
這里測試全部使用pipeline進行構建。
新建一個Pipeline流水線項目,配置Pipeline運行腳本:
腳本內容:
label:Jenkins執行的節點標簽,可以隨意起;
cloud:就是我們上面配置云的名字標識;
node:執行構建任務的slave節點,需要跟上面的label一致
非常簡單的一個測試用例,讓我們來跑一下看看。
首先看一下構建執行狀態:
可以看到Jenkins自動創建了一個Slave節點在執行我們的構建任務,
我們再通過k8s看下執行的pod情況:
通過上面的k8s的pod信息我們可以看到,pod名字就是Jenkins slave節點的名字。通過READY字段,我們也能發現pod中只有一個容器在跑,最后看下詳細信息,發現k8s確實是去拉取jenkins/jnlp-slave:alpine 鏡像了。
這里再貼一下Jenkins的控制臺打印信息:
項目實踐
真正的項目中實踐肯定不是這么簡單的,我們這里就以一個簡單maven構建項目為例。
步驟如下:
- 制作maven鏡像,設置maven倉庫私服mirror,添加ssh-key方便無密碼拉取倉庫代碼
- 編寫Jenkinsfile,配置構建流程
- 執行構建
制作maven鏡像
FROM maven:latestADD settings.xml /root/.m2/RUN mkdir /root/.ssh/ADD .ssh /root/.ssh/RUN chmod 600 /root/.ssh/id_rsa其中settings.xml包含了maven倉庫私服mirror、sonarqube等等一些maven相關的配置,
這里需要注意的是ssh的私鑰權限必須是600的,這個是配置無密碼從gitlab倉庫拉取源碼的。
通過Dockerfile來制作我們自己的maven鏡像:
docker build . -t e5:8889/maven:1.0
上傳到我們私服倉庫:
docker push e5:8889/maven:1.0
編寫Jenkinsfile
Jenkinsfile是jenkins pipeline構建的一種腳本,其中定義了構建流程。
podTemplate(label: 'mypod', cloud: 'kubernetes', containers: [containerTemplate(name: 'maven',image: 'e5:8889/maven:1.0',ttyEnabled: true,command: 'cat') ]) {node ('mypod') {container('maven') {git url: 'git@192.168.1.2:maven/springboot-archetype.git', credentialsId: '6033483b-5125-4ce1-941d-83b23ae64ba6'stage('create-archetype') {sh 'mvn archetype:create-from-project'}stage('update-local-catalog') {sh 'cd target/generated-sources/archetype'sh 'mvn clean install'sh 'mvn archetype:update-local-catalog'}stage('deploy') {sh 'mvn deploy'}stage('build-tag') {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()echo build_tag}}} }我們通過containers.containerTemplate指定了我們代碼是在哪個容器內進行構建的,其他的就都是一些簡單的構建流程,這里就不細說了。
執行構建
我們最后再執行一次構建,看下Jenkins和k8s一些運行情況。
Jenkins Console控制臺打印:
K8s的pod信息:
# kubectl get pod NAME READY STATUS RESTARTS AGE jenkins-slave-wm980-2v01l 2/2 Running 0 5s通過READY字段,發現這時pod運行的就有2個容器了,我們可以猜測一個是slave容器,一個是我們自定義的maven容器。
再來看下pod創建的詳細信息:
通過這行信息:"e5:8889/maven:1.0" already present on machine
我們發現果然有使用到自己的maven鏡像了。
結語
其實真正實踐起來還是會發現很多坑的,之前網上搜到很多教程都還需要自定義slave鏡像亦或者將Jenkins Master節點也作為容器放入k8s中,但是感覺一來麻煩,二來也沒太大必要就沒弄了。其實后面更關鍵是在應用的部署上面,這里只是將構建工具鏈都準備好,提供一個應用干凈的構建環境。
寫完之后還發現有許多可以優化的地方,比如maven本地緩存倉庫的掛載等等。。
Kubernetes plugin的文檔:https://jenkins.io/doc/pipeline/steps/kubernetes/
https://github.com/jenkinsci/kubernetes-plugin/blob/master/README.md
總結
以上是生活随笔為你收集整理的基于K8s的动态Jenkins Slave构建实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdram内存控制
- 下一篇: 思博伦TestCenter进行某大型保险