Jenkins 参考文档
使用 docker 安装 jenkins
shell
# 拉取镜像
docker pull jenkins/jenkins:2.376
# 查看镜像
docker images
docker image ls
# 创建挂载文件夹,并且进行文件权限授予
#创建文件夹
mkdir -p /home/jenkins_home
#权限
chmod 777 /home/jenkins_home
# 启动Jenkins
docker run -d -uroot -p 9526:8080 -p 50000:50000 --name jenkins --restart=always -v /home/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /etc/docker:/etc/docker jenkins/jenkins
# 如果刚开始忘记加是否自动重启,使用下面的命令作为补充
docker container update --restart=always 容器的名字
Jenkins 启动命令的具体说明如下
命令 | 描述 |
---|---|
-d | 后台运行容器,并返回容器 ID |
-uroot | 使用 root 身份进入容器,推荐加上,避免容器内执行某些命令时报权限错误 |
-p 9524:8080 | 将容器内 8080 端口映射至宿主机 9524 端口,这个是访问 jenkins 的端口 |
-p 50000:50000 | 将容器内 50000 端口映射至宿主机 50000 端口 |
--name jenkins | 设置容器名称为 jenkins |
-v /home/jenkins_home:/var/jenkins_home | :/var/jenkins_home 目录为容器 jenkins 工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录 |
-v /etc/localtime:/etc/localtime | 让容器使用和服务器同样的时间设置 |
jenkins/jenkins | 镜像的名称,这里也可以写镜像 ID |
使用 docker-compose 安装 Jenkins
1.在服务器内创建文件夹 jenkins,进入 jenkins 目录
2.创建 docker-compose.yaml,将下面的内容拷贝到 docker-compose.yaml 中
3.运行 docker-compose up -d,默认端口对外是 9526,也可以自定义修改
yaml
# 指定 docker-compose.yml 文件的写法格式
version: "3"
# 多个容器集合
services:
docker_jenkins:
# 为了避免一些权限问题 在这我使用了root
user: root
# 重启方式
restart: always
# 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
image: jenkins/jenkins:2.376
# 容器名称
container_name: jenkins
# 对外暴露的端口定义
ports:
- "9526:8080"
- "50000:50000"
# 卷挂载路径
volumes:
# 这是我们一开始创建的目录挂载到容器内的jenkins_home目录
- /home/jenkins/jenkins_home/:/var/jenkins_home
# 这是为了我们可以在容器内使用docker命令
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
# 同样的这是为了使用docker-compose命令
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
查看 Jenkins 的密码
# 进入到容器的内部
docker exec -it 容器的ID /bin/bash
# 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword
# 查看指定容器的运行日志,在Jenkins初始化的时候,也可以通过此命令查看初始化密码,如下图所示
docker logs -f 容器的ID或者容器的名称
Jenkins 的常见问题
插件源设置
因为网络原因,需要将插件源设置为国内的,这样才可以安装插件。
shell
# 进入宿主机目录 /home/jenkins_home/,
cd /home/jenkins_home/
# 编辑文件 hudson.model.UpdateCenter.xml
cat hudson.model.UpdateCenter.xml
# 将下面的url地址切换成清华大学官方镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
# 重启容器
docker restart jenkins
xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
Jenkins 时间显示不正确的问题
进入到 jenkins 的用户设置,找到时区设置即可,设置为当前上海的时区。

shell
# 查看宿主机的时区
timedatectl
# 输出的内容摘录如下
Time zone: Asia/Shanghai (CST, +0800)
Jenkins 配置 https 访问
nginx
# 此处可以使用docker启动多个jenkins,但是数据盘挂载同一个的方式实现负载均衡
upstream jenkins {
server 127.0.0.1:9524 fail_timeout=0;
}
server {
listen 80;
server_name jenkins.cghbh.com;
# 如果请求的是http协议的地址,重定向到https
return 301 https://$host$request_uri;
}
server {
# 使用http2加快资源的请求速度
listen 443 ssl http2;
server_name jenkins.cghbh.com;
ssl_certificate /root/jenkins.cghbh.com_nginx/jenkins.cghbh.com_bundle.crt;
ssl_certificate_key /root/jenkins.cghbh.com_nginx/jenkins.cghbh.com.key;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect http:// https://;
proxy_pass http://jenkins;
# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off; # Required for HTTP-based CLI to work over SSL
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header 'X-SSH-Endpoint' 'jenkins.cghbh.com:9524' always;
}
}
Jenkins 触发 GitLab 的 webhook
当我们推送代码或者 merge request 操作的时候,可以触发 Jenkins 拉取代码并构建,实现持续构建的操作。
1.打开 Jenkins 项目的配置,选择构建触发器

2.点击高级选项,生产 GitLab 触发 Jenkins 的密钥

3.生成触发 Jenkins 的密钥

4.到 Jenkins 配置 webhooks

5.测试 GitLab 的 webhooks 到 Jenkins 的连通性,到此即已完成 GitLab+Jenkins 的自动化构建

6.前端自动化部署构建脚本的简单案例,本案例以 docker 为构建镜像
shell
#!/bin/bash
# 定义应用组名
group_name='main'
# 定义应用名称
app_name='main-web'
# 定义应用版本
app_version='1.0-SNAPSHOT'
echo '----停止消息服务 ----'
docker stop ${app_name}
echo '----删除实例----'
docker rm ${app_name}
echo '----删除旧镜像----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----打包镜像----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----启动镜像----'
docker run -itd -p 9333:3000 --restart=always --name ${app_name} ${group_name}/${app_name}:${app_version}
echo '----启动完成----'