Jenkins外掛之 Docker-Plugin 將slave執行在docker容器中
Jenkins外掛名稱
Docker plugin
This plugin integrates Jenkins with Docker
This plugin allows slaves to be dynamically provisioned using Docker.
外掛文件地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin
Docker宿主機配置
1 安裝docker
第一步. 新增docker yum源
vi /etc/yum.repos.d/docker.repo
[docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://download.docker.com/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg [docker-ce-stable-debuginfo] name=Docker CE Stable - Debuginfo $basearch baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/stable enabled=0 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg [docker-ce-stable-source] name=Docker CE Stable - Sources baseurl=https://download.docker.com/linux/centos/7/source/stable enabled=0 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg
第二步. 安裝docker
yum install -y docker
第三步. 配置docker開啟遠端訪問
vi /etc/sysconfig/docker
在OPTIONS=中加入 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
如:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock'
第四步. 配置docker加速站點
vi /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
啟動docker
systemctl start docker && systemctl enable docker
2 配置Jenkins
安裝docker外掛
jenkins外掛名稱
Docker plugin
This plugin integrates Jenkins with Docker
外掛文件地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin
配置外掛
“Manage Jenkins”–>“Configure system”->“cloud” 新增一個docker
修改配置
3 使用Docker slave
測試:
1 自由風格專案:在Master Jenkins中新建一個自由風格的專案
嘗試構建,一開始等待拉起docker-slave,稍等幾秒鐘,開始正常構建。
2 pipeline風格的專案
在agent部分增加label屬性
pipeline {
agent {
label 'Docker-slave'
}
stages {
stage ('Exec Test Command') {
steps{
echo 'begin+++++++++++++++++++++'
sh 'sleep 300s'
sh 'whereis java'
echo 'end+++++++++++++++++++++++'
}
}
}
}
3. 使用pipeline 構建maven專案
先配置jenkins docker外掛
將maven的本地依賴包儲存目錄對映到物理伺服器,以避免每次在slave上執行maven構建都要到遠端倉庫下載依賴包(這時很費時的)。如果使用多臺伺服器執行容器化的jenkins-slave,那最好使用一個共享儲存(如NFS等)儲存依賴。
掛載還遇到一個許可權問題參見另外一個博文【容器掛載volume出現“Permission denied”的問題定位解決】
進到容器執行 [email protected]:/home/jenkins# ls -Z
結果:(可見maven_repository目錄與其它不同)
unconfined_u:object_r:home_root_t:s0 maven_repository system_u:object_r:container_file_t:s0:c324,c498 opt
system_u:object_r:container_file_t:s0:c324,c498 bin
system_u:object_r:proc_t:s0 proc
system_u:object_r:container_file_t:s0:c324,c498 boot
system_u:object_r:container_file_t:s0:c324,c498 root
system_u:object_r:container_file_t:s0:c324,c498 dev
system_u:object_r:container_file_t:s0 run
解決辦法:宿主機要掛載到容器的目錄執行
chcon -Rt container_file_t /home/jenkins/maven_repository
生成docker映象
預設的jenkins/ssh-slave 不包含maven,另外如果你需要特定的jdk版本也需要自己重構映象。
我的映象加入了我需要的jdk版本,maven版本和sonarscanner。注意:所有這些的目錄要與master節點的目錄配置相同。如master節點的maven在這個目錄:/var/jenkins_home/maven,那映象裡也將maven放在這個目錄。
我在映象中使用sonarscanner時遇到一個許可權問題,沒有許可權執行命令。分析原因應該是,執行使用jenkins使用者所以沒有執行許可權。嘗試過將sonarscanner的使用者設定為jenkins不行,也嘗試使用sudo,但是jenkins-slave的官方映象使用的應該是debain系,預設沒有sudo命令。所以我在確認安全的情況下將執行jenkins-slave的使用者修改為了root使用者,sonarscanner執行沒才問題了。這裡需要修改兩個地方:
一是使用jenkins/ssh-slave官方Dockerfile重構映象時修改PermitRootLogin 為yes(官方是no)。
RUN sed -i /etc/ssh/sshd_config \
-e 's/#PermitRootLogin.*/PermitRootLogin yes/' \
-e 's/#RSAAuthentication.*/RSAAuthentication yes/' \
另外就是在jenkins-docker設定中將User 設定為root
同時執行多個構建任務 (agent label 都是 ‘Docker-slave’)
至此以docker 容器執行的slave配置完成,構建時啟動容器,構建後銷燬容器。