本地安裝
1. Docker環(huán)境準(zhǔn)備
2. Jenkins容器運(yùn)行
可使用Jenkins官方提供的鏡像,其穩(wěn)定版鏡像為:jenkins/jenkins:lts
通過如下命令啟動(dòng)Jenkins容器:
docker run -d -p 8080:8080 jenkins/jenkins:lts
Jenkins工作目錄為/var/jenkins_home,可將此目錄掛載到宿主機(jī)上,如下(通過JNLP使用slave服務(wù)時(shí)需要使用50000端口):
docker run -d -p 8080:8080 -p 50000:50000 -v your_dir:/var/jenkins_home jenkins/jenkins:lts
注:當(dāng)掛載jenkins的工作目錄jenkins_home時(shí),可能會(huì)出現(xiàn)容器無法啟動(dòng),查看日志出現(xiàn)如下錯(cuò)誤:

這是由于Jenkins容器的當(dāng)前用戶是"jenkins",但當(dāng)"/var/jenkins_home"映射本地?cái)?shù)據(jù)卷時(shí),該目錄的擁有者是root用戶,因此jenkins用戶訪問root權(quán)限目錄會(huì)出現(xiàn)"Permision denied"的問題。解決辦法是將目錄用戶者改為1000,再重新啟動(dòng)容器即可,如下:
sudo chown -R 1000 your_dir
docker restart container
3. 獲取Jenkins初始密碼
在容器啟動(dòng)后,通過查看啟動(dòng)日志獲取Jenkins的初始密碼:docker logs 容器ID/容器名
如下圖所示,日志中“Please use the following password to proceed to installation:”下的一行為初始化密碼:

4. Jenkins初始化
本地訪問Jenkins服務(wù)地址為:http://localhost:8080
第一次打開Jenkins頁面時(shí),會(huì)進(jìn)入“Getting Started”頁面,需要輸入“Adminitrator password”即第3步獲取的密碼,輸入后點(diǎn)擊“Continue”繼續(xù),如下圖所示:

(注:如果沒有復(fù)制密碼,可通過命令
docker exec ?it jenkins /bin/bash進(jìn)入到Jenkins容器里,根據(jù)提示位置查找初始密碼)
然后頁面會(huì)提示安裝插件,可點(diǎn)擊選擇安裝其推薦的插件(這些插件都比較常用),即“Install Suggested Plugins”,等插件安裝完成后進(jìn)入管理員賬號(hào)頁面設(shè)置賬號(hào)(注:最好填寫上電子郵件地址,以防使用Blue Ocean創(chuàng)建Jenkinsfile時(shí)失敗),如下兩圖所示:


當(dāng)管理員賬號(hào)設(shè)置完成,點(diǎn)擊“Save and Finish”,即可開始Jenkins的使用,如下圖所示:

官方的Jenkins容器有一定的限制,下面我將介紹如何在Jenkins容器中使用docker命令,以及自定義dockerfile。
自定義dockerfile:
為了通過Jenkins實(shí)現(xiàn)Docker鏡像的build、push,我們需要一個(gè)使用Docker命令的環(huán)境。因此,我們?cè)贘enkins容器里掛載宿主機(jī)的docker.sock和Docker二進(jìn)制文件,Rancher上的docker-compose文件如下(my_jenkins為自定義的Docker鏡像,下面會(huì)給出Dockerfile模板):
version: '2'
services:
jenkins:
image: my_jenkins
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- jenkins_home:/var/jenkins_home
ports:
- 8080:8080/tcp
user: root
labels:
io.rancher.container.pull_image: always
相應(yīng)的Docker運(yùn)行命令如下:
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v jenkins_home:/var/jenkins_home -u root my_jenkins
注:由于Jenkins容器是Jenkins用戶,為了使Jenkins用戶能夠有權(quán)限運(yùn)行Docker命令,可以將Jenkins用戶加到主機(jī)的Docker組里(這樣會(huì)由于組gid的不同造成不可移植),或令Jenkins用戶可以免密使用sudo命令(在命令行中運(yùn)行echo jenkins ALL=NOPASSWD: ALL>> /etc/sudoers,這種方式會(huì)使得Jenkins在每次使用docker命令時(shí)必須輸sudo)。我們現(xiàn)在采取的解決方法是直接使用root權(quán)限運(yùn)行Jenkins容器。
通過如上的方式,我們能夠在Jenkins容器里使用Docker命令,但在使用過程中,可能會(huì)報(bào)如下圖的錯(cuò)誤:

libltdl.so.7位于/usr/lib/x86_64-linux-gnu/文件夾下,我們可以將該文件通過-v掛載到Jenkins容器,或者通過自定義dockerfile將libltdl.so.7直接復(fù)制到容器中。另外,自定義的dockerfile還能夠?qū)崿F(xiàn)定制化的Jenkins配置,令Jenkins容器啟動(dòng)時(shí)就能滿足我們的需求。例如,可以將Jenkins系統(tǒng)的時(shí)區(qū)設(shè)置為PRC;可以將需要的插件通過plugins.txt在Jenkins鏡像構(gòu)建時(shí)安裝下載;可以下載Android SDK并配置好環(huán)境變量,使得Jenkins容器能夠進(jìn)行Android項(xiàng)目構(gòu)建。
如下是一個(gè)自定義的dockerfile樣例:
FROM jenkins/jenkins:lts
MAINTAINER ×××
USER root
### 設(shè)置jenkins的時(shí)區(qū)
RUN cp /usr/share/zoneinfo/PRC /etc/localtime
ENV JAVA_OPTS=-Duser.timezone=Asia/Shanghai
### 自動(dòng)安裝jenkins插件
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt ### 下載安裝Android SDK ### package_file里聲明所有需要安裝的包 RUN wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip \
&& unzip -d /android-sdk sdk-tools-linux-3859397.zip \
&& rm sdk-tools-linux-3859397.zip
COPY package_file /android-sdk/tools/bin/
RUN echo y | ./android-sdk/tools/bin/sdkmanager --package_file=/android-sdk/tools/bin/package_file
ENV ANDROID_HOME=/android-sdk
### 將其他需要的文件拷貝到容器之中
### 直接在容器中使用docker所需的libltdl.so.7
### docker遠(yuǎn)程倉庫登錄認(rèn)證的config.json
COPY libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
COPY config.json /root/.docker/config.json