1. 程式人生 > >Jenkins外掛之 Docker-Plugin 將slave執行在docker容器中

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配置完成,構建時啟動容器,構建後銷燬容器。