# 二.使用 Jenkins
前言
Jenkins 这里主要作为自动构建工具案例来使用,传统模式每次发包需要先拉下最新代码 --> 安装依赖 --> 打包 --> 将代码移动到相关目录 --> 运行,这里配置好这些步骤可以自动完成全部过程。
# 1.安装过程
# 1.1 获取镜像
docker pull jenkins/jenkins:latest
# 1.2 获取容器
我们使用 docker run 命令启动一个新的 Gitlab 容器
# 1.3 安装完成
- 云服务器上关闭防火墙
- 访问页面localhost:8080
- 获取密码,登陆页面
docker exec jenkins tail /var/jenkins_home/secrets/initialAdminPassword
# 2.其他问题
# 2.1 安装防火墙
yum install firewalld systemd -y
service firewalld start
firewall-cmd --permanent --add-service=http # pemmanent: 表示永久生效,若不加 --permanent 系统下次启动后就会失效
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.0.0/16" accept" #add-rich-rule:添加一条放行规则。作用是允许 docker 容器之间可以走宿主机互相访问
systemctl reload firewalld
2
3
4
5
- 172.16.0.0 是网段,/16 代表匹配所有网段内的 IP
# 2.2 DockerFile
我们都知道,每个 Docker 容器,都是一个独立的,与外界隔离的操作系统环境。在使用 Jenkins 服务进行构建时,用户写的 Shell 脚本,也只会在容器内执行。 但我们问题来了,我们想让容器部署的 Jenkins 可以构建 Docker 镜像,只有 2 种办法:
- 加一台 Jenkins master 节点,构建机内安装 Docker 环境。这样我们就可以执行远程构建。
- 宿主机的 Docker 环境,移花接木到容器内部,在容器内部执行 Docker 命令构建镜像。
Docker in Docker
- 原理
那什么是 Docker in Docker 呢? Docker 采用的是 C/S(即 Client/Server)架构。我们在执行 docker xxx 等命令时,其实是使用 Client 在和 docker engine 在进行通信。 我们在安装 Docker CE 时,会生成一个 systemd service 服务。这个服务启动时,就是 Docker Engine 服务。默认情况下,Docker 守护进程会生成一个 socket(/var/run/docker.sock)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 *.sock 文件:sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。 因此,只要把宿主机的 Docker 套接字通过 Docker 数据卷挂载到容器内部,就能实现在容器内使用 Docker 命令。
- 使用
下方的命令,就是 Docker in Docker 的使用。
docker run ... -v /var/run/docker.sock:/var/run/docker.sock
所以,我们要实现在 Jenkins 内部访问宿主机 docker,要写一个 DockerFile 进行二次镜像构建。 此 DockerFile 的作用,就是为了安装容器使用宿主机 Docker 缺少的依赖。这里我们在容器内安装 libltdl7 。 如果不写 DockerFile 进行构建也可以,亲测直接挂 Docker 套接字进容器后会有依赖缺失问题,这个方法只针对 Jenkins 镜像
vi Dockerfile
FROM jenkins/jenkins
USER root
# 清除了基础镜像设置的源,切换成阿里云源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
# 更新源并安装缺少的包
RUN apt-get update && apt-get install -y libltdl7
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
2
3
4
5
6
7
8
9
10
11
# 2.3 构建 Jenkins 镜像
这样的话,我们就不能直接使用官方的 Jenkins 镜像进行构建,需要用 DockerFile 先构建一份自己的 Jenkins 镜像。使用 docker build 命令构建镜像
docker build -t local/jenkins .
-t:镜像的名字及 tag,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个 tag 如果提示 Successfully tagged local/jenkins:latest 则构建成功
# 2.4 启动镜像
我们将 Jenkins 用户目录外挂到宿主机内,先新建一个 /home/jenkins 目录,并设置权限:
mkdir /home/jenkins
chown -R 1000 /home/jenkins/
2
接下来我们用镜像创建容器并启动:
docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /home/jenkins:/var/jenkins_home \
--restart always \
--user root local/jenkins
2
3
4
5
6
-itd: 由 -i -t -d 命令组合而成 -i: 开启容器内的交互模式,允许用户可以进入容器进行输入交互 -t: 分配一个虚拟终端 -d: 允许容器以后台运行(不加的话只能前台运行,退出终端容器就停止了) --name: 容器名称 -p: 将容器内的端口映射到宿主机的端口。格式为:宿主机端口:容器端口 -v: 将宿主机内的文件挂载到容器目录下。格式为:宿主机目录:容器目录 --user: 指定用户启动 --restart: 当 Docker 重启时,容器自动启动,否则就需要使用 docker restart 手动启动 启动后,会返回一串 ID 值,这就是 容器 ID 值。 执行 docker ps 命令,查看 Jenkins 容器是否在列表内。如果在列表内,说明启动成功 提示:如果执行 docker ps 后容器没有在列表内,多半是启动失败。可以加-a 参数查看所有已经生成的容器的运行状态。 如果想进一步查看原因,可以使用 docker logs -f <容器 ID> 查看容器内日志输出。
# 2.5 启动 Jenkins
首先我们在防火墙添加 8080 和 50000 端口的放行,并重载防火墙
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=50000/tcp --permanent
systemctl reload firewalld
2
3
容器启动后,访问 宿主机 IP:8080 。如果看到以下界面,代表正在启动。 Jenkins 第一次的启动时间一般比较长(视机器性能而看)
# 2.6 初始化配置
解锁 Jenkins
Jenkins 启动后,会生成一个 初始密码 ,该密码在 Jenkins 容器内存放,可以进入容器后查看密码内容。
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
exit;
2
3
- docker exec: 进入一个已启动的容器内,执行命令
- cat:查看文件内容。如果逐步查看可以用 more 命令
- -it: -i -t 的组合
- -i: 即使没有附加也保持 STDIN 打开
- -t: 分配一个伪终端
- 输入配置文件中的密码,解锁 Jenkins
下载插件
解锁后,来到了插件下载页面。先进入容器配置一下清华大学的 Jenkins 插件源后,再安装插件。所以先不要点。
进入容器,查找 default.json 文件,把镜像源替换进去,替换后退出容器终端
docker exec -it jenkins /bin/bash
find / -name 'default.json'
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/jenkins_home/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/jenkins_home/updates/default.json
exit;
2
3
4
然后重启容器,重新访问界面,解锁后安装推荐插件
docker restart jenkins
# 2.7 完成安装
接下来一路按照提示配置,直到看到以下界面代表安装成功:
# 2.8 测试安装
我们点击 Jenkins 首页 -> 左侧导航 -> 新建任务 -> 构建一个自由风格的软件项目 找到 构建 一项,选择 “增加构建步骤”,选择 执行 Shell ,输入以下命令: 此命令是去拉取一个 nodejs 稳定版镜像
docker -v
docker pull node:latest
2
保存后,我们点击左侧菜单的 “立即构建”,Jenkins 就会开始构建。选择左侧历史记录第一项(最新的一项),点击控制台输出,查看构建日志。 Jenkins 构建任务为蓝色灯,代表构建成功。红色灯代表构建失败
← 桌面版实践 三.使用 Gitlab →