您好,登錄后才能下訂單哦!
如何使用Jenkins Pipeline插件和Docker打造容器化構建環(huán)境,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Docker和Jenkins像DevOps界的巧克力和花生醬那樣,它們的組合產(chǎn)生了無數(shù)的機會,當然也產(chǎn)生了很多難題,筆者將提及這兩個方面。
我假定讀者已經(jīng)熟悉Jenkins和Docker,我將把焦點放在特定的配置上而不是把筆墨花費在許多博文已經(jīng)介紹過的入門概念上。
設定目標
我所要達成的目標其實非常簡單:在一個容器中搭建Jenkins主節(jié)點,并且在多個主機上搭建多個JNLP代理容器。這些代理節(jié)點可以運行在不同的AWS VPC或者ECS上。
我的目標是得到一個能在任何主機上部署的通用配置,而每個項目分別定義各自的構建環(huán)境。這樣各個開發(fā)團隊就可以掌控這份配置,而不用經(jīng)由Jenkins的構建團隊。我會盡量避免構建一個特定工具集的代理節(jié)點。容器技術能實現(xiàn)這樣的構建環(huán)境,但是要真正把每個細節(jié)都做好絕對是一個挑戰(zhàn)。
為了實現(xiàn)這個目標,我還使用了Jenkins Pipeline / Workflow插件。這個插件讓你能非常優(yōu)雅地使用DSL語言描述構建過程,例如這樣簡單地定義:
```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"
}
}
```
這個pipeline會在一個名為"test-agent"的Jenkins代理上執(zhí)行,它會基于“maven”3.3.3-jdk-8”鏡像構建一個容器。這個pipeline在物理節(jié)點上能正常運行,但是在容器中運行則會報錯。
運行在Docker中的Docker
在容器中運行Jenkins的主或從節(jié)點,可能有人會以為我需要特權模式來使用"Docker in Docker",但是我并沒有,Jér?me Petazzoni發(fā)表了一篇文章[《用Docker-in-Docker來構建持續(xù)集成環(huán)境?請三思》](https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/),你應該參考一下這篇文章。
如果你還在使用wrapdocker的腳本,你應該問問自己為什么,因為這樣用起來更簡單:
```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
```
這個命令會啟動Jenkins并且可以擁有所有的容器操作功能,所以并不需要特權模式來啟動容器,也不需要"Docker-in-Docker"模式。
有個地方需要注意:在這里你不能用官方的Jenkins鏡像,因為jenkins用戶需要屬于docker用戶組,這樣才能使用socket,從而能在容器中的Jenkins調(diào)用docker,最終實現(xiàn)通過Jenkins構建和運行其他容器。
Jenkins JNLP代理容器
在“系統(tǒng)管理”=>“管理節(jié)點”頁面,點擊“新建節(jié)點”,可以添加slave:
Jenkins從節(jié)點的啟動方式與主節(jié)點類似,它也需要連接docker的socket接口,你可以這樣啟動:
```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é)點一樣,你需要確保jenkins用戶有權限訪問docker socket接口,我使用的是Jenkins jnlp從節(jié)點容器,這樣,這個slave容器就可以執(zhí)行構建操作了,注意secret參數(shù)需要從master上的某個slave里查看。
準備就緒,開始構建
在容器中開始一個構建過程不難,問題是你必需讓這個代理容器綁定一個宿主機上的路徑<code>${JENKINS_HOME}:/var/jenkins_home</code>,而且被構建的容器也需要這個目錄的訪問權限。
```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
```
這個容器會把宿主機上的 /var/jenkins_home/workspace/uri-templates-in-docker目錄掛載到容器化環(huán)境以供Maven使用,并且會把這個路徑設置成當前工作路徑,這些在物理機上都能正常運行,但是要在容器中執(zhí)行,我需要嘗試這樣做:
這樣明顯不行,因為我把docker socket端口映射到了Jenkins代理容器上,掛載到Jenkins agent容器的所有卷實際上都是引用宿主上的路徑,假定宿主上的<code>${JENKINS_HOME}</code>是<code> /opt/jenkins_home</code>,以下的命令應該生效:
```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é)
把構建環(huán)境容器化是一個非常好的主意,這樣節(jié)省了很多時間。
注意,這份代碼可能不正正滿足你的需求,但是起碼是一個demo,我希望本文能幫助更多人用上Jenkins的容器來構建應用。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。