利用Docker打造容器化構建環境
大小:0.6 MB 人氣: 2017-10-11 需要積分:1
本文中,我假定讀者已經熟悉Jenkins和Docker,我將把焦點放在特定的配置上而不是把筆墨花費在許多博文已經介紹過的入門概念上。
設定目標
我所要達成的目標其實非常簡單:在一個容器中搭建Jenkins主節點,并且在多個主機上搭建多個JNLP代理容器。這些代理節點可以運行在不同的AWS VPC或者ECS上。
我的目標是得到一個能在任何主機上部署的通用配置,而每個項目分別定義各自的構建環境。這樣各個開發團隊就可以掌控這份配置,而不用經由Jenkins的構建團隊。我會盡量避免構建一個特定工具集的代理節點。容器技術能實現這樣的構建環境,但是要真正把每個細節都做好絕對是一個挑戰。
為了實現這個目標,我還使用了Jenkins Pipeline / Workflow插件。這個插件讓你能非常優雅地使用DSL語言描述構建過程,例如這樣簡單地定義:
node(‘test-agent’) { stage “Container Prep”// do the thing in the containerdocker.image(‘maven:3.3.3-jdk-8’).inside { // get the codezstage ‘Checkout’git url: ‘https://github.com/damnhandy/Handy-URI-Templates.git’stage ‘Build’// Do the buildsh “。/mvnw clean install”} }
這個pipeline會在一個名為”test-agent”的Jenkins代理上執行,它會基于“maven”3.3.3-jdk-8”鏡像構建一個容器。這個pipeline在物理節點上能正常運行,但是在容器中運行則會報錯。
運行在Docker中的Docker
在容器中運行Jenkins的主或從節點,可能有人會以為我需要特權模式來使用”Docker in Docker”,但是我并沒有,Jér?me Petazzoni發表了一篇文章《用Docker-in-Docker來構建持續集成環境?請三思》,你應該參考一下這篇文章。
如果你還在使用wrapdocker的腳本,你應該問問自己為什么,因為這樣用起來更簡單:
docker run -v${JENKINS_HOME}:/var/jenkins_home \-v/var/run/docker.sock:/var/run/docker.sock \-p8080:8080-p50000:50000\index.csphere.cn/microimages/jenkins
這個命令會啟動Jenkins并且可以擁有所有的容器操作功能,所以并不需要特權模式來啟動容器,也不需要”Docker-in-Docker”模式。
有個地方需要注意:在這里你不能用官方的Jenkins鏡像,因為jenkins用戶需要屬于docker用戶組,這樣才能使用socket,從而能在容器中的Jenkins調用docker,最終實現通過Jenkins構建和運行其他容器。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%