CI/CD流程搭建【Docker+jenkins+gitlab+Webhook】01
- 一、环境准备
-
- [1. 安装 Docker 和 Docker Compose](#1. 安装 Docker 和 Docker Compose)
- [2. 检查docker是否能拉取镜像(解决办法)](#2. 检查docker是否能拉取镜像(解决办法))
- [二、Docker Compose 部署 Jenkins 和 GitLab](#二、Docker Compose 部署 Jenkins 和 GitLab)
-
- [1. 部署步骤](#1. 部署步骤)
- [三、Jenkins 初始配置](#三、Jenkins 初始配置)
-
- [1. 安装插件](#1. 安装插件)
- [2. 配置全局工具](#2. 配置全局工具)
- [四、GitLab 初始配置](#四、GitLab 初始配置)
-
- [1. 访问 GitLab](#1. 访问 GitLab)
- [2. 创建项目](#2. 创建项目)
- [五、配置 Webhook](#五、配置 Webhook)
一、环境准备
1. 安装 Docker 和 Docker Compose
powershell
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo systemctl enable docker
sudo systemctl start docker
# 将当前用户加入docker组(避免sudo)# 注销重新登录生效
sudo usermod -aG docker $USER
# 查看版本看是否安装成功
sudo docker version
----------------------------
# 如果需要卸载可参考以下步骤
# docker卸载(删除安装包):
sudo apt-get purge docker-ce
#docker卸载(删除镜像、容器、配置文件等内容)
sudo rm-rf /var/lib/docker

2. 检查docker是否能拉取镜像(解决办法)
- 尝试docker pull hello-world拉取镜像测试,发现无法拉取,检查网络连接,发现网络不通
powershell
#拉取镜像测试
docker pull hello-world
#检查网络连接
ping registry-1.docker.io
#或者
curl -I https://registry-1.docker.io/v2/

- 编辑docker配置文件daemon.json
powershell
# daemon.json在docker下载完成时没有这个文件,通过以下命令创建编辑
sudo vi /etc/docker/daemon.json
配置镜像加速器(如果不够用,可以去网上再找,博主在调试过程中有出现这样的问题,通过增加加速器解决了)
powershell
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://iju9kaj2.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com",
"https://hub.docker.com",
"http://mirrors.ustc.edu.cn"
]
}
- 重启 Docker 服务,使配置生效
powershell
sudo systemctl daemon-reload
sudo systemctl restart docker

- 修改DNS 解析问题
powershell
# 进入DNS配置文件
sudo vi /etc/systemd/resolved.conf
修改如下:

然后重启服务,使修改生效
powershell
sudo systemctl restart systemd-resolved
- 再次尝试下载,可以成功拉取镜像

二、Docker Compose 部署 Jenkins 和 GitLab
1. 部署步骤
- 创建一个名为jenkins-gitlab的目录,cd进入该文件夹

2.创建docker-compose.yml文件
powershell
vi dockercompose.yml

配置如下内容,配置完成按 :wq 保存退出。
docker-compose.yml 文件配置了一个 CI/CD 环境,其中包含 Jenkins(用于自动化构建和发布)、GitLab(用于代码管理和版本控制)和 Portainer(用于容器管理的可视化界面),所有服务共享同一个网络和数据卷,提高服务之间的互操作性和数据的持久性
yaml
# 指定 Docker Compose 文件的版本
version: '3.8'
services:
# Jenkins 服务
jenkins:
# 指定使用的 Docker 镜像
image: jenkins/jenkins:lts
# 容器的名称
container_name: jenkins
#允许容器以特权模式运行,通常用于需要访问宿主机资源的情况
privileged: true
# 指定容器内运行的用户
user: root
# 映射端口
ports:
- "8000:8080"
- "50000:50000"
volumes:
# 持久化 Jenkins 数据,挂载在容器内的 /var/jenkins_home
- /home/jiayin/project/jenkins_gitlab/jenkins/jenkins_home:/var/jenkins_home
# 使 Jenkins 可以与 Docker 引擎通信,以便在 Jenkins 中构建和管理 Docker 容器
- /var/run/docker.sock:/var/run/docker.sock
# 将 Docker CLI 传递给容器
- /usr/bin/docker:/usr/bin/docker
environment:
# 设置环境变量,这里禁用 Jenkins 的初始设置向导
#设置为FALSE: 1.自动创建管理员用户 2.不启用安全设置(无密码访问)
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false
networks:
# 指定服务所在的网络,这里是 cicd-network
- cicd-network
# GitLab 服务
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
# 容器的重启策略,always 表示无论容器退出状态如何都始终重启
restart: always
hostname: '192.168.xxx.xxx' # 修改为你的域名或IP
privileged: true # 授予完整权限
# 映射端口
ports:
- "8001:80"
- "443:443"
- "2222:22"
volumes:
#用于存储 GitLab 配置
- /home/jiayin/project/jenkins_gitlab/gitlab/gitlab_config:/etc/gitlab
#用于存储 GitLab 日志
- /home/jiayin/project/jenkins_gitlab/gitlab/gitlab_logs:/var/log/gitlab
#用于存储 GitLab 的数据
- /home/jiayin/project/jenkins_gitlab/gitlab/gitlab_data:/var/opt/gitlab
networks:
- cicd-network
# Portainer 服务
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
# 容器的重启策略,unless-stopped 表示只在容器未被手动停止时自动重启
restart: unless-stopped
ports:
- "9000:9000"
volumes:
# 让 Portainer 与 Docker 引擎通信,以便管理容器
- /var/run/docker.sock:/var/run/docker.sock
# 用于存储 Portainer 的数据
- /home/jiayin/project/jenkins_gitlab/portainer/portainer_data:/data
networks:
- cicd-network
# 定义了一个名为 cicd-network 的网络,使用 Docker 的 bridge 驱动。这允许容器之间进行私密通信
networks:
cicd-network:
driver: bridge
# 定义了多个 Docker 数据卷,用于持久化各个服务的数据。每个卷都是匿名的,Docker 会自动管理其生命周期。
volumes:
jenkins_home:
gitlab_config:
gitlab_logs:
gitlab_data:
portainer_data:
- 启动服务,没有镜像会自动拉取,等待即可
powershell
# 启动服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看 Jenkins 初始密码
#如果在docker-compose.yml设置- JAVA_OPTS=-Djenkins.install.runSetupWizard=false,则不需要密码登录,不会生成initialAdminPassword
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword


三、Jenkins 初始配置
1. 安装插件
1)基础插件
- 浏览器访问:http://your-server-ip:8080,界面如下:

- 进入 Manage Jenkins → Manage Plugins


- 在 Available 标签页安装以下插件:
GitLab
Docker Pipeline
Blue Ocean
SSH Agent
Publish Over SSH
Chinese (Simplified) # 用于将页面设置为中文

2)设置中文页面插件
- 下载Chinese (Simplified) 插件

安装完成就自动生效了

2. 配置全局工具
1)JDK配置
在 Jenkins 官方镜像中,Java 环境已经预装,因此通常无需在 Jenkins 管理界面中额外配置任何 JDK
验证方式:
powershell
docker exec jenkins java -version
输出类似 openjdk version "21.0.9" 的信息,确认 JDK 存在。所以在 "JDK" 部分,你可以完全忽略或留空。如果 Jenkins 任务(如 Maven 项目)要求关联 JDK,直接选择 "java"(系统默认 Java)即可

2)Git配置
- 进入虚拟机终端jenkins容器,查看git路径
powershell
#进入容器 -u 0 以root用户进入
docker exec -u 0 -it jenkins /bin/bash
# 查看是否有安装git
git --version
#如果未安装,采用下面命令安装
apt-get update && apt-get install -y git
#查找路径
which git

- 在jenkins页面Manage Jenkins → Tools(全局配置工具),点击进入

- Git 配置

3)Docker配置
docker-compose.yml 中已经挂载了宿主的 Docker 守护进程 (/var/run/docker.sock) ,所以容器内的 Docker 客户端能直接控制宿主机的 Docker。现在只需确保容器内安装了 docker 客户端命令。
验证安装:
powershell
docker exec jenkins docker version
能显示 Client 和 Server 版本信息,说明配置成功

全部配置完成,点击SAVE保存

四、GitLab 初始配置
1. 访问 GitLab
1)查找root初始密码登录
- 浏览器访问:http://your-server-ip:8001,(8001是你搭建的端口)界面如下:

- 查找root初始账号密码
powershell
# 查找root初始账号密码
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

- 复制这串密码,登录

2)将页面设置为中文
- 点击页面右上角的你的头像,找到并点击 "Preferences" (偏好设置)

- 点击下拉框,在列表中找到并选择 "简体中文",然后点击Save changes保存

此时界面已经切换为中文版本的了

3)修改root密码
- 点击账户

- 在管理区域中查看用户

- 点击编辑

- 重新设置密码,保存生效

2. 创建项目
1)创建项目
- 点击创建项目

- 配置基础信息(根据项目情况自行填写)

2)设置SSH密钥
作用:
- 使用 SSH 密钥可以替代输入用户名和密码进行身份验证,提供更高的安全性。因为密钥是计算机生成的一对公私钥,私钥保留在本地,而公钥上传到 GitLab
- 可以在自动化脚本(如 CI/CD 任务)中安全地连接到 GitLab,而不需要在脚本中暴露密码,降低安全风险
- 可以在多台计算机上生成 SSH 密钥对,并将公钥添加到 GitLab,从而在不同的设备上使用 GitLab 而无需每次都输入密码
- 在 GitLab 中,可以为每个用户分配独立的公钥,这样每个用户都有自己独特的身份认证方式。如果需要撤销某个用户的访问权限,只需删除其公钥即可,而无需更改其他用户的访问权限
- 在本机通过cmd打开命令行,执行命令如下:
powershell
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

- 添加SSH密钥到GitLab
打开id_rsa.pub,复制文本内容

粘贴到gitlab中,位置:用户设置------SSH Keys

- 测试SSH连接
打开cmd测试
powershell
#-p 2222是你自己配置的gitlab远程端口
ssh -T -p 2222 git@域名或ip

五、配置 Webhook
1. 在Jenkins中创建任务
- 新建项目

输入任务名称,点击Freestyle project,点击确定

创建完成页面如下:

2. 在Jenkins任务中配置源码管理
- 打开我们创建的git项目,复制HTTP链接,注意这个链接是不带端口的,因为默认是80端口,可以不写,但是我们创建Gitlab时自己定义了端口为8001,后续使用时,需要把8001端口加上

- 回到jenkins创建的项目:点击配置------源码管理------选择Git,将我们刚刚复制的git链接添加8001端口复制进去,此时报错。因为我们还没有配置Gitlab的登录凭证,下面介绍两种解决方法,可自行选择。

- 配置Gitlab的登录凭证
- 方法一:设置访问token
进入到Gitllab管理区------用户------Administrator------身份模拟令牌------添加新令牌

配置基础信息,点击创建

保存好这一串token,后续无法查看

- 回到jenkins配置页面,将token增加到url里,此时可以看到不提示报错了,点击保存
powershell
#格式:
http://<username>:<token>@Your_IP:8001/root/work_report.git

- 方法二:设置Credentials
找到Credentials------添加

类型选择Username with password,填写Gitlab的用户名和密码保存

选择我们配置的信息,此时可以看到不报错了

3. 在Jenkins任务中配置触发器
-
找到Triggers触发器,勾选Build when a change is pushed to GitLab

-
往下翻,找到高级------Secret token------点击Generate,这个后续用于 GitLab 进行 Webhook 配置

4. 在GitLab中配置Webhook
1)配置和问题排查
配置
- 打开在gitlab创建的项目work_report------设置------Webhooks------添加新的webhook

- 配置基础信息
配置如下,根据需求自行选择触发事件,比如推送、合并请求等等,然后点击添加webhook

发现未添加成功

问题解决
点击管理员------设置------网络------出站请求------勾选允许来自 webhooks 和集成对本地网络的请求------保存

然后再次尝试添加,可以发现添加成功

- 测试
点击测试,选择事件进行测试,输出200,说明测试成功

5. 在 Jenkins 中配置 GitLab 连接
- Manage Jenkins → Configure System(系统配置)

- 找到 GitLab 部分,添加 GitLab 连接,保存

以上基础配置使用基本讲解清楚了,本篇文章先分享到这里,下面文章接着介绍后端Django项目CI/CD完整配置(使用Jenkins+pipeline+gitlab)