Docker+Jenkins+Pipeline实现持续集成(一)
本地安装
1. Docker环境准备
2. Jenkins容器运行
可使用Jenkins官方提供的镜像,其稳定版镜像为:jenkins/jenkins:lts
通过如下命令启动Jenkins容器:
docker run -d -p 8080:8080 jenkins/jenkins:lts
Jenkins工作目录为/var/jenkins_home,可将此目录挂载到宿主机上,如下(通过JNLP使用slave服务时需要使用50000端口):
docker run -d -p 8080:8080 -p 50000:50000 -v your_dir:/var/jenkins_home jenkins/jenkins:lts
注:当挂载jenkins的工作目录jenkins_home时,可能会出现容器无法启动,查看日志出现如下错误:
这是由于Jenkins容器的当前用户是"jenkins",但当"/var/jenkins_home"映射本地数据卷时,该目录的拥有者是root用户,因此jenkins用户访问root权限目录会出现"Permision denied"的问题。解决办法是将目录用户者改为1000,再重新启动容器即可,如下:
sudo chown -R 1000 your_dir
docker restart container
3. 获取Jenkins初始密码
在容器启动后,通过查看启动日志获取Jenkins的初始密码:docker logs 容器ID/容器名
如下图所示,日志中“Please use the following password to proceed to installation:”下的一行为初始化密码:
初始化密码
4. Jenkins初始化
本地访问Jenkins服务地址为:http://localhost:8080
第一次打开Jenkins页面时,会进入“Getting Started”页面,需要输入“Adminitrator password”即第3步获取的密码,输入后点击“Continue”继续,如下图所示:
(注:如果没有复制密码,可通过命令
docker exec −it jenkins /bin/bash
进入到Jenkins容器里,根据提示位置查找初始密码)
然后页面会提示安装插件,可点击选择安装其推荐的插件(这些插件都比较常用),即“Install Suggested Plugins”,等插件安装完成后进入管理员账号页面设置账号(注:最好填写上电子邮件地址,以防使用Blue Ocean创建Jenkinsfile时失败),如下两图所示:
插件安装设置管理员账号
当管理员账号设置完成,点击“Save and Finish”,即可开始Jenkins的使用,如下图所示:
开始使用
官方的Jenkins容器有一定的限制,下面我将介绍如何在Jenkins容器中使用docker命令,以及自定义dockerfile。
自定义dockerfile:
为了通过Jenkins实现Docker镜像的build、push,我们需要一个使用Docker命令的环境。因此,我们在Jenkins容器里挂载宿主机的docker.sock和Docker二进制文件,Rancher上的docker-compose文件如下(my_jenkins为自定义的Docker镜像,下面会给出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
相应的Docker运行命令如下:
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用户能够有权限运行Docker命令,可以将Jenkins用户加到主机的Docker组里(这样会由于组gid的不同造成不可移植),或令Jenkins用户可以免密使用sudo命令(在命令行中运行echo jenkins ALL=NOPASSWD: ALL>> /etc/sudoers
,这种方式会使得Jenkins在每次使用docker命令时必须输sudo)。我们现在采取的解决方法是直接使用root权限运行Jenkins容器。
通过如上的方式,我们能够在Jenkins容器里使用Docker命令,但在使用过程中,可能会报如下图的错误:
图片.pnglibltdl.so.7
位于/usr/lib/x86_64-linux-gnu/
文件夹下,我们可以将该文件通过-v挂载到Jenkins容器,或者通过自定义dockerfile
将libltdl.so.7直接复制到容器中。另外,自定义的dockerfile还能够实现定制化的Jenkins配置,令Jenkins容器启动时就能满足我们的需求。例如,可以将Jenkins系统的时区设置为PRC;可以将需要的插件通过plugins.txt在Jenkins镜像构建时安装下载;可以下载Android SDK并配置好环境变量,使得Jenkins容器能够进行Android项目构建。
如下是一个自定义的dockerfile样例:
FROM jenkins/jenkins:lts
MAINTAINER ×××
USER root
### 设置jenkins的时区
RUN cp /usr/share/zoneinfo/PRC /etc/localtime
ENV JAVA_OPTS=-Duser.timezone=Asia/Shanghai
### 自动安装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远程仓库登录认证的config.json
COPY libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
COPY config.json /root/.docker/config.json