如何使用Jenkins Pipeline插件和Docker打造容器化構(gòu)建環(huán)境,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
寒亭ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
Docker和Jenkins像DevOps界的巧克力和花生醬那樣,它們的組合產(chǎn)生了無(wú)數(shù)的機(jī)會(huì),當(dāng)然也產(chǎn)生了很多難題,筆者將提及這兩個(gè)方面。
我假定讀者已經(jīng)熟悉Jenkins和Docker,我將把焦點(diǎn)放在特定的配置上而不是把筆墨花費(fèi)在許多博文已經(jīng)介紹過的入門概念上。
設(shè)定目標(biāo)
我所要達(dá)成的目標(biāo)其實(shí)非常簡(jiǎn)單:在一個(gè)容器中搭建Jenkins主節(jié)點(diǎn),并且在多個(gè)主機(jī)上搭建多個(gè)JNLP代理容器。這些代理節(jié)點(diǎn)可以運(yùn)行在不同的AWS VPC或者ECS上。
我的目標(biāo)是得到一個(gè)能在任何主機(jī)上部署的通用配置,而每個(gè)項(xiàng)目分別定義各自的構(gòu)建環(huán)境。這樣各個(gè)開發(fā)團(tuán)隊(duì)就可以掌控這份配置,而不用經(jīng)由Jenkins的構(gòu)建團(tuán)隊(duì)。我會(huì)盡量避免構(gòu)建一個(gè)特定工具集的代理節(jié)點(diǎn)。容器技術(shù)能實(shí)現(xiàn)這樣的構(gòu)建環(huán)境,但是要真正把每個(gè)細(xì)節(jié)都做好絕對(duì)是一個(gè)挑戰(zhàn)。
為了實(shí)現(xiàn)這個(gè)目標(biāo),我還使用了Jenkins Pipeline / Workflow插件。這個(gè)插件讓你能非常優(yōu)雅地使用DSL語(yǔ)言描述構(gòu)建過程,例如這樣簡(jiǎn)單地定義:
```js
node('test-agent') {
stage "Container Prep"
// do the thing in the container
docker.image('maven:3.3.3-jdk-8').inside {
// get the codez
stage 'Checkout'
git url: 'https://github.com/damnhandy/Handy-URI-Templates.git'
stage 'Build'
// Do the build
sh "./mvnw clean install"
}
}
```
這個(gè)pipeline會(huì)在一個(gè)名為"test-agent"的Jenkins代理上執(zhí)行,它會(huì)基于“maven”3.3.3-jdk-8”鏡像構(gòu)建一個(gè)容器。這個(gè)pipeline在物理節(jié)點(diǎn)上能正常運(yùn)行,但是在容器中運(yùn)行則會(huì)報(bào)錯(cuò)。
運(yùn)行在Docker中的Docker
在容器中運(yùn)行Jenkins的主或從節(jié)點(diǎn),可能有人會(huì)以為我需要特權(quán)模式來(lái)使用"Docker in Docker",但是我并沒有,Jér?me Petazzoni發(fā)表了一篇文章[《用Docker-in-Docker來(lái)構(gòu)建持續(xù)集成環(huán)境?請(qǐng)三思》](https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/),你應(yīng)該參考一下這篇文章。
如果你還在使用wrapdocker的腳本,你應(yīng)該問問自己為什么,因?yàn)檫@樣用起來(lái)更簡(jiǎn)單:
```sh
docker run -v ${JENKINS_HOME}:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 8080:8080 -p 50000:50000 \
index.csphere.cn/microimages/jenkins
```
這個(gè)命令會(huì)啟動(dòng)Jenkins并且可以擁有所有的容器操作功能,所以并不需要特權(quán)模式來(lái)啟動(dòng)容器,也不需要"Docker-in-Docker"模式。
有個(gè)地方需要注意:在這里你不能用官方的Jenkins鏡像,因?yàn)閖enkins用戶需要屬于docker用戶組,這樣才能使用socket,從而能在容器中的Jenkins調(diào)用docker,最終實(shí)現(xiàn)通過Jenkins構(gòu)建和運(yùn)行其他容器。
Jenkins JNLP代理容器
在“系統(tǒng)管理”=>“管理節(jié)點(diǎn)”頁(yè)面,點(diǎn)擊“新建節(jié)點(diǎn)”,可以添加slave:
Jenkins從節(jié)點(diǎn)的啟動(dòng)方式與主節(jié)點(diǎn)類似,它也需要連接docker的socket接口,你可以這樣啟動(dòng):
```sh
docker run -v ${JENKINS_HOME}:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name=jenkins-slave \
-d index.csphere.cn/microimages/jenkins-slave \
-url http://jenkins-master:8080/ \
a0a1b92971030d5f5dd69bd972c6cd899f705ddd3699ca3c5e92f937d860be7e \
test-agent
```
與Jenkins主節(jié)點(diǎn)一樣,你需要確保jenkins用戶有權(quán)限訪問docker socket接口,我使用的是Jenkins jnlp從節(jié)點(diǎn)容器,這樣,這個(gè)slave容器就可以執(zhí)行構(gòu)建操作了,注意secret參數(shù)需要從master上的某個(gè)slave里查看。
準(zhǔn)備就緒,開始構(gòu)建
在容器中開始一個(gè)構(gòu)建過程不難,問題是你必需讓這個(gè)代理容器綁定一個(gè)宿主機(jī)上的路徑<code>${JENKINS_HOME}:/var/jenkins_home</code>,而且被構(gòu)建的容器也需要這個(gè)目錄的訪問權(quán)限。
```sh
docker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/uri-templates-in-docker \
-v /var/jenkins_home/workspace/uri-templates-in-docker:/var/jenkins_home/workspace/uri-templates-in-docker:rw \
-e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** \
-e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** \
maven:3.3.3-jdk-8 cat
```
這個(gè)容器會(huì)把宿主機(jī)上的 /var/jenkins_home/workspace/uri-templates-in-docker目錄掛載到容器化環(huán)境以供Maven使用,并且會(huì)把這個(gè)路徑設(shè)置成當(dāng)前工作路徑,這些在物理機(jī)上都能正常運(yùn)行,但是要在容器中執(zhí)行,我需要嘗試這樣做:
這樣明顯不行,因?yàn)槲野裠ocker socket端口映射到了Jenkins代理容器上,掛載到Jenkins agent容器的所有卷實(shí)際上都是引用宿主上的路徑,假定宿主上的<code>${JENKINS_HOME}</code>是<code> /opt/jenkins_home</code>,以下的命令應(yīng)該生效:
```sh
docker run -t -d -u 1000:1000 -w /opt/jenkins_home/workspace/uri-templates-in-docker \
-v /opt/jenkins_home:/var/jenkins_home/workspace/uri-templates-in-docker:rw \
-e ********
maven:3.3.3-jdk-8 cat
```
總結(jié)
把構(gòu)建環(huán)境容器化是一個(gè)非常好的主意,這樣節(jié)省了很多時(shí)間。
注意,這份代碼可能不正正滿足你的需求,但是起碼是一個(gè)demo,我希望本文能幫助更多人用上Jenkins的容器來(lái)構(gòu)建應(yīng)用。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
分享名稱:如何使用JenkinsPipeline插件和Docker打造容器化構(gòu)建環(huán)境
瀏覽路徑:http://chinadenli.net/article46/jsijeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、服務(wù)器托管、App開發(fā)、電子商務(wù)、動(dòng)態(tài)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)