這篇文章給大家分享的是有關(guān)jenkins的部署和pipeline job 驗證測試。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、肅南裕固族自治網(wǎng)絡(luò)推廣、小程序定制開發(fā)、肅南裕固族自治網(wǎng)絡(luò)營銷、肅南裕固族自治企業(yè)策劃、肅南裕固族自治品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供肅南裕固族自治建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
目前很多企業(yè)應(yīng)用都已經(jīng)容器化,版本發(fā)布比較多,構(gòu)建的次數(shù)也比較多,相對于之前單臺 jenkins 有了很大的挑戰(zhàn)
,傳統(tǒng)的 Jenkins Slave 一主多從方式會存在一些痛點:
從圖上可以看到 Jenkins Master 和 Jenkins Slave 以 Docker Container 形式運行在 Kubernetes 集群的 Node 上,Master 運行在其中一個節(jié)點,并且將其配置數(shù)據(jù)存儲到一個 Volume 上去,Slave 運行在各個節(jié)點上,并且它不是一直處于運行狀態(tài),它會按照需求動態(tài)的創(chuàng)建并自動刪除。
這種方式的工作流程大致為:當(dāng) Jenkins Master 接受到 Build 請求時,會根據(jù)配置的 Label 動態(tài)創(chuàng)建一個運行在 Docker Container 中的 Jenkins Slave 并注冊到 Master 上,當(dāng)運行完 Job 后,這個 Slave 會被注銷并且 Docker Container 也會自動刪除,恢復(fù)到最初狀態(tài)。
這種方式帶來的好處有很多:
我們把 master 節(jié)點部署到 k8s 集群中,大家可以參照 官方 github 文檔進(jìn)行配置,我這里進(jìn)行了一點簡化,我這里使用的是 nfs 來存儲 jenkins 的數(shù)據(jù),用于進(jìn)行持久存儲。
kubectl apply -f https://raw.githubusercontent.com/wangzan18/jenkins-agent-k8s-cicd/master/master/jenkins.yaml
說明一下:這里 Service 我們暴漏了端口 8080 和 50000,8080 為訪問 Jenkins Server 頁面端口,50000 為創(chuàng)建的 Jenkins Slave 與 Master 建立連接進(jìn)行通信的默認(rèn)端口,如果不暴露的話,Slave 無法跟 Master 建立連接。這里使用 NodePort 方式暴漏端口,并未指定其端口號,由 Kubernetes 系統(tǒng)默認(rèn)分配,當(dāng)然也可以指定不重復(fù)的端口號(范圍在 30000~32767)。
Jenkins 的配置過程我這里不再掩飾,我們直接配置 kubernetes plugin。
管理員賬戶登錄 Jenkins Master 頁面,點擊 “系統(tǒng)管理” —> “管理插件” —> “可選插件” —> “Kubernetes plugin” 勾選安裝即可。
安裝完畢后,點擊 “系統(tǒng)管理” —> “系統(tǒng)設(shè)置” —> “新增一個云” —> 選擇 “Kubernetes”,然后填寫 Kubernetes 和 Jenkins 配置信息。
說明一下:
<svc_name>.<namespace_name>.svc.cluster.local
的命名方式,或者直接填寫外部 Kubernetes 的地址 https://<ClusterIP>:<Ports>
。http://<ClusterIP>:<Node_Port>
方式。配置完畢,可以點擊 “Test Connection” 按鈕測試是否能夠連接的到 Kubernetes,如果顯示 Connection test successful 則表示連接成功,配置沒有問題。
因為我們的 jenkins 是集群內(nèi)部的 pod,所以它是可以直接和 kubernetes api 進(jìn)行通信,并且我們也賦予了相應(yīng)的權(quán)限,如果說 master 是創(chuàng)建在集群外部的,我們需要提前為 jenkins agent 創(chuàng)建一個 service account,然后把相應(yīng)的 token 賦予到憑據(jù)的 sercet text。
創(chuàng)建一個 Pipeline 類型 Job 并命名為 jenkins-pipeline
,然后在 Pipeline 腳本處填寫一個簡單的測試腳本如下:
podTemplate {
node(POD_LABEL) {
stage('Run shell') {
sh 'echo hello world'
sh 'sleep 60'
}
}
}
創(chuàng)建還 job 之后,點擊構(gòu)建,我們會在構(gòu)建隊列中發(fā)現(xiàn)一個待執(zhí)行的 job,因為我們在 pipeline 中要求 jenkins agent 節(jié)點的名稱為 POD_LABEL,沒有發(fā)現(xiàn)這個 agent,所以會去請求 kubernetes 去創(chuàng)建 agent 節(jié)點。
jenkins agent 節(jié)點創(chuàng)建好了之后,會去 jenkins master 注冊,并去執(zhí)行隊列中的 job,完成之后取消注冊,并自行銷毀。
我們還可以去 console 查看構(gòu)建日志。
也可以在 k8s 上面看到啟動的 agent 容器。
wangzan:~/k8s $ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
jenkins-5df4dff655-f4gk8 1/1 Running 0 25m app=jenkins,pod-template-hash=5df4dff655
jenkins-pipeline-5-lbs5j-b2jl6-0mk2g 1/1 Running 0 7s jenkins/label=jenkins-pipeline_5-lbs5j,jenkins=slave
myapp1 1/1 Running 0 21h app=myapp1
The podTemplate
is a template of a pod that will be used to create agents. It can be either configured via the user interface, or via pipeline.
Either way it provides access to the following fields:
kubernetes
POD_LABEL
will be defined inside the step.merge()
or override()
. Controls whether the yaml definition overrides or is merged with the yaml definition inherited from pod templates declared with inheritFrom
. Defaults to override()
.activeDeadlineSeconds
has passed.podRetention
is set to 'never()' or 'onFailure()', pod is deleted after this deadline is passed.true
前面的 pipeline 中的 agent 是使用的默認(rèn)的鏡像 jenkins/jnlp-slave:3.35-5-alpine,我們也可以添加其他的一些鏡像到 pod 里面。
創(chuàng)建一個 Pipeline 類型 Job 并命名為 jenkins-pipeline-container
,然后在 Pipeline 腳本處填寫一個簡單的測試腳本如下:
podTemplate(containers: [
containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
]) {
node(POD_LABEL) {
stage('Get a Maven project') {
git 'https://github.com/jenkinsci/kubernetes-plugin.git'
container('maven') {
stage('Build a Maven project') {
sh 'mvn -B clean install'
}
}
}
stage('Get a Golang project') {
git url: 'https://github.com/hashicorp/terraform.git'
container('golang') {
stage('Build a Go project') {
sh """
mkdir -p /go/src/github.com/hashicorp
ln -s `pwd` /go/src/github.com/hashicorp/terraform
cd /go/src/github.com/hashicorp/terraform && make core-dev
"""
}
}
}
}
}
從 k8s 中也可以看到 pod 中存在三個容器。
wangzan:~/k8s $ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
jenkins-5df4dff655-f4gk8 1/1 Running 0 42m app=jenkins,pod-template-hash=5df4dff655
jenkins-pipeline-container-1-6zf73-chltq-b0rjt 3/3 Running 0 70s jenkins/label=jenkins-pipeline-container_1-6zf73,jenkins=slave
myapp1
The containerTemplate
is a template of container that will be added to the pod. Again, its configurable via the user interface or via pipeline and allows you to set the following fields:
使用 SCM 可以有很多好處:
使用 SCM ,就需要我們把上面所寫的 pipeline 代碼放到 Jenkinsfile,一般是這個名字,當(dāng)然也可以自定義名稱,我們把上面第一個案例使用 SCM 運行一下,首先就是修改我們的 job。
我的 jenkinsfile 地址為 https://github.com/wangzan18/jenkins-agent-k8s-cicd/blob/master/jenkinsfile/jenkins-pipeline-podtemplate.jenkinsfile 。
然后在控制臺查看運行日志。
其他參數(shù)大家可以根據(jù)自己的情況進(jìn)行設(shè)定。
Jenkins 中除了使用 Pipeline 方式運行 Job 外,通常我們也會使用普通類型 Job,如果也要想使用 kubernetes plugin 來構(gòu)建任務(wù)
那么就需要點擊 “系統(tǒng)管理” —> “系統(tǒng)設(shè)置” —> “云” —> “Kubernetes” —> “Add Pod Template” 進(jìn)行配置 “Kubernetes Pod Template” 信息。
Labels 名:在配置非 pipeline 類型 Job 時,用來指定任務(wù)運行的節(jié)點。
Containers Name: 這里要注意的是,如果 Name 配置為 jnlp,那么 Kubernetes 會用下邊指定的 Docker Image 代替默認(rèn)的 jenkinsci/jnlp-slave 鏡像,否則,Kubernetes plugin 還是會用默認(rèn)的 jenkinsci/jnlp-slave 鏡像與 Jenkins Server 建立連接,即使我們指定其他 Docker Image。這里我配置為 jenkins-slave,意思就是使用 plugin 默認(rèn)的鏡像與 jenkins server 建立連接,當(dāng)我選擇 jnlp 的時候,發(fā)現(xiàn)鏡像無法與 jenkins server 建立連接,具體情況我也不太清楚,也有可能是鏡像的問題。
新建一個自由風(fēng)格的 Job 名稱為 jenkins-simple
,配置 “Restrict where this project can be run” 勾選,在 “Label Expression” 后邊輸出我們上邊創(chuàng)建模板是指定的 Labels 名稱 jnlp-agent,意思是指定該 Job 匹配 jenkins-slave
標(biāo)簽的 Slave 上運行。
效果如我們預(yù)期所示:
前面我隨便在 https://hub.docker.com/r/jenkins/jnlp-slave 中選擇了一個鏡像,發(fā)現(xiàn)無法與 jenkins server 建立連接,那我們就自己制作一個鏡像。
通過 kubernetest plugin 默認(rèn)提供的鏡像 jenkinsci/jnlp-slave 可以完成一些基本的操作,它是基于 openjdk:8-jdk 鏡像來擴(kuò)展的,但是對于我們來說這個鏡像功能過于簡單,比如我們想執(zhí)行 Maven 編譯或者其他命令時,就有問題了,那么可以通過制作自己的鏡像來預(yù)安裝一些軟件,既能實現(xiàn) jenkins-slave 功能,又可以完成自己個性化需求,那就比較不錯了。如果我們從頭開始制作鏡像的話,會稍微麻煩些,不過可以參考 jenkinsci/jnlp-slave 和 jenkinsci/docker-slave 這兩個官方鏡像來做,注意:jenkinsci/jnlp-slave 鏡像是基于 jenkinsci/docker-slave 來做的。這里我簡單演示下,基于 jenkinsci/jnlp-slave:latest 鏡像,在其基礎(chǔ)上做擴(kuò)展,安裝 Maven 到鏡像內(nèi),然后運行驗證是否可行吧,大家可以查看我的鏡像:https://hub.docker.com/r/wangzan18/jenkins-slave-maven 。
podTemplate(containers: [
containerTemplate(
name: 'jnlp',
image: 'wangzan18/jenkins-agent:maven-3.6.3',
alwaysPullImage: false,
args: '${computer.jnlpmac} ${computer.name}'),
]) {
node(POD_LABEL) {
stage('git pull') {
echo "hello git"
}
stage('build') {
sh 'mvn -version'
}
stage('test') {
echo "hello test"
}
stage('deploy') {
echo "hello deploy"
sleep 10
}
}
}
這里 containerTemplate 的 name 屬性必須叫 jnlp
,Kubernetes 才能用自定義 images 指定的鏡像替換默認(rèn)的 jenkinsci/jnlp-slave 鏡像。此外,args 參數(shù)傳遞兩個 jenkins-slave 運行需要的參數(shù)。還有一點就是這里并不需要指定 container('jnlp'){...} 了,因為它被 Kubernetes 指定了要被執(zhí)行的容器,所以直接執(zhí)行 Stage 就可以了。
可以看到已經(jīng)達(dá)到我們想要的效果,確實也是使用我們自定義的 jenkins-slave 鏡像。
關(guān)于jenkins的部署和pipeline job 驗證測試就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。