日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于K8s的动态Jenkins Slave构建实践

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于K8s的动态Jenkins Slave构建实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

源于這篇文章分享的經(jīng)驗(yàn) 基于 Kubernetes 的 Jenkins 構(gòu)建集群實(shí)踐,這里記錄一下實(shí)踐落地過程。

環(huán)境

這里Jenkins Master的安裝沒有采用容器鏡像的方式,直接就是rpm包安裝。
版本信息:
Jenkins 2.107.1
Kubernetes plugin 1.4
kubernetes集群 1.5.2

這里就不詳細(xì)說明安裝過程了。

配置

環(huán)境都安裝好后,配置Jenkins,進(jìn)入系統(tǒng)管理—>系統(tǒng)設(shè)置—>云
新增一個(gè)云Kubernetes,配置如下:

配置比較簡單,這里也沒有采用自定義的slave模板,默認(rèn)Jenkins使用的是jenkins/jnlp-slave:alpine鏡像作為動(dòng)態(tài)的運(yùn)行的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進(jìn)行構(gòu)建。
新建一個(gè)Pipeline流水線項(xiàng)目,配置Pipeline運(yùn)行腳本:

腳本內(nèi)容:

podTemplate(label: 'mypod', cloud: 'kubernetes') {node ('mypod') {stage('test') {echo "hello, world"sleep 60}} }

label:Jenkins執(zhí)行的節(jié)點(diǎn)標(biāo)簽,可以隨意起;
cloud:就是我們上面配置云的名字標(biāo)識;
node:執(zhí)行構(gòu)建任務(wù)的slave節(jié)點(diǎn),需要跟上面的label一致

非常簡單的一個(gè)測試用例,讓我們來跑一下看看。
首先看一下構(gòu)建執(zhí)行狀態(tài):

可以看到Jenkins自動(dòng)創(chuàng)建了一個(gè)Slave節(jié)點(diǎn)在執(zhí)行我們的構(gòu)建任務(wù),
我們再通過k8s看下執(zhí)行的pod情況:

# kubectl get pod NAME READY STATUS RESTARTS AGE jenkins-slave-5d8m2-jzxk7 1/1 Running 0 38s# kubectl describe pod jenkins-slave-5d8m2-jzxk7 。。。 Events:FirstSeen LastSeen Count From SubObjectPath Type Reason Message--------- -------- ----- ---- ------------- -------- ------ -------46s 46s 1 {default-scheduler } Normal Scheduled Successfully assigned jenkins-slave-5d8m2-jzxk7 to master44s 44s 1 {kubelet master} spec.containers{jnlp} Normal Pulled Container image "jenkins/jnlp-slave:alpine" already present on machine44s 44s 1 {kubelet master} spec.containers{jnlp} Normal Created Created container with docker id 7cbdbd4ea859; Security:[seccomp=unconfined]44s 44s 1 {kubelet master} spec.containers{jnlp} Normal Started Started container with docker id 7cbdbd4ea859

通過上面的k8s的pod信息我們可以看到,pod名字就是Jenkins slave節(jié)點(diǎn)的名字。通過READY字段,我們也能發(fā)現(xiàn)pod中只有一個(gè)容器在跑,最后看下詳細(xì)信息,發(fā)現(xiàn)k8s確實(shí)是去拉取jenkins/jnlp-slave:alpine 鏡像了。

這里再貼一下Jenkins的控制臺打印信息:

項(xiàng)目實(shí)踐

真正的項(xiàng)目中實(shí)踐肯定不是這么簡單的,我們這里就以一個(gè)簡單maven構(gòu)建項(xiàng)目為例。
步驟如下:

  • 制作maven鏡像,設(shè)置maven倉庫私服mirror,添加ssh-key方便無密碼拉取倉庫代碼
  • 編寫Jenkinsfile,配置構(gòu)建流程
  • 執(zhí)行構(gòu)建

制作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相關(guān)的配置,
這里需要注意的是ssh的私鑰權(quán)限必須是600的,這個(gè)是配置無密碼從gitlab倉庫拉取源碼的。
通過Dockerfile來制作我們自己的maven鏡像:
docker build . -t e5:8889/maven:1.0

上傳到我們私服倉庫:
docker push e5:8889/maven:1.0

編寫Jenkinsfile

Jenkinsfile是jenkins pipeline構(gòu)建的一種腳本,其中定義了構(gòu)建流程。

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指定了我們代碼是在哪個(gè)容器內(nèi)進(jìn)行構(gòu)建的,其他的就都是一些簡單的構(gòu)建流程,這里就不細(xì)說了。

執(zhí)行構(gòu)建

我們最后再執(zhí)行一次構(gòu)建,看下Jenkins和k8s一些運(yùn)行情況。
Jenkins Console控制臺打印:

K8s的pod信息:

# kubectl get pod NAME READY STATUS RESTARTS AGE jenkins-slave-wm980-2v01l 2/2 Running 0 5s

通過READY字段,發(fā)現(xiàn)這時(shí)pod運(yùn)行的就有2個(gè)容器了,我們可以猜測一個(gè)是slave容器,一個(gè)是我們自定義的maven容器。
再來看下pod創(chuàng)建的詳細(xì)信息:

# kubectl describe pod jenkins-slave-wm980-2v01l Events:FirstSeen LastSeen Count From SubObjectPath Type Reason Message--------- -------- ----- ---- ------------- -------- ------ -------17s 17s 1 {default-scheduler } Normal Scheduled Successfully assigned jenkins-slave-wm980-2v01l to master15s 15s 1 {kubelet master} spec.containers{maven} Normal Pulled Container image "e5:8889/maven:1.0" already present on machine15s 15s 1 {kubelet master} spec.containers{maven} Normal Created Created container with docker id 85c8547aa047; Security:[seccomp=unconfined]15s 15s 1 {kubelet master} spec.containers{maven} Normal Started Started container with docker id 85c8547aa04715s 15s 1 {kubelet master} spec.containers{jnlp} Normal Pulled Container image "jenkins/jnlp-slave:alpine" already present on machine15s 15s 1 {kubelet master} spec.containers{jnlp} Normal Created Created container with docker id c10cc2694b05; Security:[seccomp=unconfined]14s 14s 1 {kubelet master} spec.containers{jnlp} Normal Started Started container with docker id c10cc2694b05

通過這行信息:"e5:8889/maven:1.0" already present on machine
我們發(fā)現(xiàn)果然有使用到自己的maven鏡像了。

結(jié)語

其實(shí)真正實(shí)踐起來還是會發(fā)現(xiàn)很多坑的,之前網(wǎng)上搜到很多教程都還需要自定義slave鏡像亦或者將Jenkins Master節(jié)點(diǎn)也作為容器放入k8s中,但是感覺一來麻煩,二來也沒太大必要就沒弄了。其實(shí)后面更關(guān)鍵是在應(yīng)用的部署上面,這里只是將構(gòu)建工具鏈都準(zhǔn)備好,提供一個(gè)應(yīng)用干凈的構(gòu)建環(huán)境。

寫完之后還發(fā)現(xiàn)有許多可以優(yōu)化的地方,比如maven本地緩存?zhèn)}庫的掛載等等。。

Kubernetes plugin的文檔:https://jenkins.io/doc/pipeline/steps/kubernetes/
https://github.com/jenkinsci/kubernetes-plugin/blob/master/README.md

總結(jié)

以上是生活随笔為你收集整理的基于K8s的动态Jenkins Slave构建实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。