CI/CD流程搭建【Docker+jenkins+gitlab+Webhook】01

CI/CD流程搭建【Docker+jenkins+gitlab+Webhook】01

一、环境准备

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是否能拉取镜像(解决办法)

  1. 尝试docker pull hello-world拉取镜像测试,发现无法拉取,检查网络连接,发现网络不通
powershell 复制代码
#拉取镜像测试
docker pull hello-world
#检查网络连接
ping registry-1.docker.io
#或者
curl -I https://registry-1.docker.io/v2/
  1. 编辑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"
    ]
}
  1. 重启 Docker 服务,使配置生效
powershell 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 修改DNS 解析问题
powershell 复制代码
# 进入DNS配置文件
sudo vi /etc/systemd/resolved.conf

修改如下:

然后重启服务,使修改生效

powershell 复制代码
sudo systemctl restart systemd-resolved
  1. 再次尝试下载,可以成功拉取镜像

二、Docker Compose 部署 Jenkins 和 GitLab

1. 部署步骤

  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:
  1. 启动服务,没有镜像会自动拉取,等待即可
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)基础插件

  1. 浏览器访问:http://your-server-ip:8080,界面如下:
  2. 进入 Manage Jenkins → Manage Plugins

  3. 在 Available 标签页安装以下插件:

GitLab

Docker Pipeline

Blue Ocean

SSH Agent

Publish Over SSH

Chinese (Simplified) # 用于将页面设置为中文

2)设置中文页面插件

  1. 下载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配置

  1. 进入虚拟机终端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
  1. 在jenkins页面Manage Jenkins → Tools(全局配置工具),点击进入
  2. 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初始密码登录

  1. 浏览器访问:http://your-server-ip:8001,(8001是你搭建的端口)界面如下:
  2. 查找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 中,可以为每个用户分配独立的公钥,这样每个用户都有自己独特的身份认证方式。如果需要撤销某个用户的访问权限,只需删除其公钥即可,而无需更改其他用户的访问权限
  1. 在本机通过cmd打开命令行,执行命令如下:
powershell 复制代码
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  1. 添加SSH密钥到GitLab
    打开id_rsa.pub,复制文本内容

    粘贴到gitlab中,位置:用户设置------SSH Keys
  2. 测试SSH连接
    打开cmd测试
powershell 复制代码
#-p 2222是你自己配置的gitlab远程端口
ssh -T -p 2222 git@域名或ip

五、配置 Webhook

1. 在Jenkins中创建任务

  1. 新建项目

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

    创建完成页面如下:

2. 在Jenkins任务中配置源码管理

  1. 打开我们创建的git项目,复制HTTP链接,注意这个链接是不带端口的,因为默认是80端口,可以不写,但是我们创建Gitlab时自己定义了端口为8001,后续使用时,需要把8001端口加上
  2. 回到jenkins创建的项目:点击配置------源码管理------选择Git,将我们刚刚复制的git链接添加8001端口复制进去,此时报错。因为我们还没有配置Gitlab的登录凭证,下面介绍两种解决方法,可自行选择。
  1. 配置Gitlab的登录凭证
  • 方法一:设置访问token
    进入到Gitllab管理区------用户------Administrator------身份模拟令牌------添加新令牌

    配置基础信息,点击创建

    保存好这一串token,后续无法查看
  1. 回到jenkins配置页面,将token增加到url里,此时可以看到不提示报错了,点击保存
powershell 复制代码
#格式:
http://<username>:<token>@Your_IP:8001/root/work_report.git
  • 方法二:设置Credentials
    找到Credentials------添加

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

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

3. 在Jenkins任务中配置触发器

  1. 找到Triggers触发器,勾选Build when a change is pushed to GitLab

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

4. 在GitLab中配置Webhook

1)配置和问题排查

配置
  1. 打开在gitlab创建的项目work_report------设置------Webhooks------添加新的webhook
  2. 配置基础信息
    配置如下,根据需求自行选择触发事件,比如推送、合并请求等等,然后点击添加webhook

    发现未添加成功
问题解决

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

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

  1. 测试

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

5. 在 Jenkins 中配置 GitLab 连接

  1. Manage Jenkins → Configure System(系统配置)
  2. 找到 GitLab 部分,添加 GitLab 连接,保存

    以上基础配置使用基本讲解清楚了,本篇文章先分享到这里,下面文章接着介绍后端Django项目CI/CD完整配置(使用Jenkins+pipeline+gitlab)
相关推荐
sim20202 小时前
Jenkins Linux+pipeline部署业务系统
jenkins
成为你的宁宁2 小时前
【Jenkins 与 Ansible 集成指南:从优势解析到实战落地(含本机配置、插件安装、工具配置及命令 / 剧本两种 Jenkins 调用方式全流程】
ansible·jenkins
2301_787328492 小时前
36.docker swarm
运维·docker·容器
甜甜不吃芥末2 小时前
GitLab 配置 SSH 密钥完整教程
运维·ssh·gitlab
xujiangyan_2 小时前
K8s控制器:管理Pod副本的智能管家
docker·容器·kubernetes
lbb 小魔仙3 小时前
Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)
linux·ubuntu·docker
yBmZlQzJ11 小时前
财运到内网穿透域名解析技术机制与中立评估
运维·经验分享·docker·容器·1024程序员节
一点晖光11 小时前
jenkins优化记录
运维·jenkins
yBmZlQzJ12 小时前
内网穿透工具通过端口转发实现内外网通信
运维·经验分享·docker·容器·1024程序员节