GitLab与Jenkins结合构建持续集成环境
1.持续集成概述及运行流程
1.1 CI/CD介绍
编码 → 构建 → 集成 → 测试 → 交付 → 部署
1.1.1 持续集成(CI)
持续集成(Continuous integration)是指开发者在代码的开发过程中,可以**频繁的(一天多次)将代码合并到主干源码仓库,并立刻进行构建、(单元)测试。**根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

持续集成的优点:
- 快速发现错误。每完成一点开发,就集成到主干,可以快速发现错误,定位错误也比较容易;
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
**持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。**它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。持续集成并不能消除Bug,而是让它们非常容易发现和改正。
1.1.2 持续交付(CD)需要人工审批
持续交付(Continuous delivery)指的是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中 。 比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中,做更多的测试。**如果代码没有问题,就可以部署到生产环境。**持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
Staging:临时工作台

1.1.3 持续部署(CD)完全自动化
持续部署(continuous deployment)**是持续交付的下一步,指的是代码通过评审以后,部署到生产环境。持续部署的目标是:代码在任何时刻都是可部署的,可以进入生产阶段。**持续部署的前提是能自动化完成测试、构建、部署等步骤。
总的来说,CI/CD提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。
1.1.4 持续交付/持续部署区别
总结来说,
- 持续交付是"箭在弦上,引而不发",随时能发,但扣动扳机需要人来决定;
- 持续部署是"全自动发射系统",只要检测合格,自动出膛。
对运维工作而言,**前者更强调变更可控、审计合规与业务协同;后者更考验自动化测试的严密性、监控的敏锐度以及系统的自我修复能力。**绝大多数企业会先做到持续交付,等流水线足够稳定、监控回滚机制足够成熟后,再挑选非核心业务逐步尝试持续部署。
| 维度 | 持续交付 | 持续部署 |
|---|---|---|
| 人工干预 | 生产部署前需人工审批(如产品、运维或业务负责人确认) | 全流程无人工干预,完全自动化 |
| 部署触发 | 人工决策何时部署到生产环境 | 代码通过测试后自动部署到生产环境 |
| 风险控制 | 人工把关,提供安全网和控制权 | 依赖完善的自动化测试和监控回滚机制 |
| 交付频率 | 灵活可控,根据业务需求决定 | 高频迭代,可能每天多次部署 |
| 适用场景 | 对稳定性要求高的核心业务系统 | 追求高速迭代、快速响应的互联网产品 |
2.项目部署方式介绍
2.1 手动部署

完整展示了从版本控制服务器 (含钩子程序)触发,经由 Jenkins 调度,通过 Git/SVN 插件 获取源码,再由 Maven 插件 打包为 War 包,最终通过 Deploy 插件 部署至 Tomcat 应用服务器的全流程。
2.2 自动部署

3.实验环境准备
bash
]# systemctl disable --now firewalld
]# sed -i '/^SELINUX=/ c SELINUX=disabled' /etc/selinux/config
172.25.254.44 GitLab
172.25.254.45 Jenkins
172.25.254.46 Apache
3.1 部署GitLab
3.1.1 GitLab概述
国区官网:https://gitlab.cn/


实现一个自托管的 Git 项目仓库,可通过 Web界面进行访问公开的或者私人项目。GitLab 拥有与Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
注: gitlab-ce 社区版,gitlab-ee 是企业版(收费)
3.1.2 部署过程
主机内存需要大于4G
3.1.2.1 安装gitlab需要组件
bash
[root@GitLab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix cronie
3.1.2.2 安装gitlab-ce
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/
bash
[root@GitLab ~]# yum install -y curl policycoreutils-python-utils openssh-server perl
[root@GitLab ~]# rpm -ivh gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm
注: GitLab分为社区版(GitLab Community Edition)和企业版(GitLab Enterprise Edition)。社区版免费,企业版收费,但是功能比社区版多。根据目前的需求,选择安装社区版(GitLab-CE)。
GitLab官网上有详细的安装说明,根据自己的操作系统选择相应的版本,按步骤操作即可。

3.1.2.3 配置GitLab访问地址
bash
# 修改gitlab外部访问地址
[root@GitLab ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://172.25.254.44'
可以修改为IP地址,也可以修改为自定义的gitlab域名。
3.1.2.4 重置GitLab
简而言之,修改了 gitlab.rb 后,必须运行此命令才能让修改真正起效。
bash
[root@cong11 ~]# gitlab-ctl reconfigure
它的主要作用是读取主配置文件 /etc/gitlab/gitlab.rb 中的设置,并在后台调用 Chef Solo(自动化配置管理工具)对系统状态进行收敛。具体流程包括:
- 生成配置 :根据
gitlab.rb中的参数,自动生成各子组件(如 Nginx、PostgreSQL、Redis、Puma/Unicorn 等)所需的底层详细配置文件。 - 重启/重载服务:如果检测到配置变动或文件更新,会自动重启或平滑重载相关服务,确保新配置生效。
3.1.2.5 查看端口并登录至GitLab
gitlab默认使用内置的nginx做为web界面。
bash
[root@GitLab ~]# ss -antlupe | grep nginx
# 浏览器访问:http://172.25.254.44

bash
[root@GitLab ~]# cat /etc/gitlab/initial_root_password
Password: vCuJyM8aVkvP5ZqkObaAdxmiielF2jVLnBbbua4WIV8=
# http://172.25.254.44
- root
- vCuJyM8aVkvP5ZqkObaAdxmiielF2jVLnBbbua4WIV8=

3.1.2.6 更改界面语言


如果语言没有更改过来的话,可以进行刷新网页即可。
3.1.2.6 修改密码
bash
root
Kaser@123




注意:
- GitLab 的相关参数配置都存在
/etc/gitlab/gitlab.rb文件里。- GitLab 默认使用 80 端口对外提供服务,如安装前服务器有启用80,安装完访问会报错。需更改gitlab的默认端口
bash# vim /etc/gitlab/gitlab.rb这时候就可以通更改后的 IP + 端口号码进行访问了。
每次重新配置,都需要执行
gitlab-ctl reconfigure使之生效。日志位置:
/var/log/gitlab可以进去查看访问日志以及报错日志等,供访问查看以及异常排查。
gitlab-ctl tail#查看所有日志gitlab-ctl tail nginx/gitlab_access.log#查看nginx访问日志
3.1.2.7 关闭GitLab注册功能并重启

记得进行保存更改!!!
bash
[root@GitLab ~]# gitlab-ctl restart
# 可以稍微等待一会加载,不然就会返回502

3.1.2.8 GitLab常用命令的使用
- 关闭 gitlab:
# gitlab-ctl stop - 启动 gitlab:
# gitlab-ctl start - 重启 gitlab:
# gitlab-ctl restart - gitlab 主配置文件:
/etc/gitlab/gitlab.rb - 日志地址:
/var/log/gitlab/ - 服务地址:
/var/opt/gitlab/ - 仓库地址:
/var/opt/gitlab/git-data - 重置配置:
gitlab-ctl reconfigure - 重启服务:
gitlab-ctl stop/start/restart
3.2 配置邮箱报警
官网各种邮箱配置实例:https://docs.gitlab.com/omnibus/settings/smtp.html
3.2.1 修改配置文件

bash
[root@cong11 ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com" # SMTP服务器
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxxxxxxxx@xxxx.com" # 邮箱账号
gitlab_rails['smtp_password'] = "xxxxxxxx" # 设备授权码
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'xxxxxxxxx@xxx.com
# 重载
[root@GitLab ~]# gitlab-ctl reconfigure
3.2.2 登陆控制台发送测试邮件
bash
# 登录控制台(要等一段时间)
[root@GitLab ~]# gitlab-rails console
irb(main):001:0> Notify.test_email('xxxx@163.com','test','hello world').deliver_now
Delivered mail 69e77ca5448de_e3cf2f6c158b4@GitLab.mail (759.9ms)
irb(main):002:0> Notify.test_email('xxxx@qq.com','test','hello world').deliver_now



3.3 创建群组与账号
3.3.1 创建群组




3.3.2 创建账号













3.3.3 创建项目
可以在群组里创建项目,也可以创建私有的项目,然后使用,使用方法跟github一样。
点击创建项目
创建一个test测试仓库







3.4 搭建Jenkins

官方官网:https://jenkins.io/
**Jenkins 概述:**是一个开源软件项目,是基于Java开发的一种持续集成、交付、部署的基于web界面的平台,用于自动化各种任务,包括构建、测试和部署软件。
3.4.1 部署Jenkins
bash
[root@Jenkins ~]# yum install -y fontconfig java-21-openjdk
# 上传rpm包
[root@Jenkins ~]# yum install -y jenkins-2.516.2-1.1.noarch.rpm
[root@Jenkins ~]# systemctl enable --now jenkins.service
[root@Jenkins ~]# systemctl status jenkins.service
# 浏览器访问:http://172.25.254.45:8080

bash
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
80561469586f480abb1a6a9a38745911
3.4.2 安装插件(在线|离线)并创建管理员账户
安装推荐的插件,需要魔法(也有可能爆红。就需要重新再次安装),如果安装完发现全部爆红。没有关系,直接离线手动安装即可。



一般来说都是再次安装就是可以的,如果不行的话就需要使用Plugins离线安装。
bash# 如果网络环境不对; # 此时会发现,很慢而且过不去,上传资源包里面的文件即可 [root@jenkins ~]# cd /var/lib/jenkins/ [root@jenkins jenkins]# systemctl stop jenkins.service [root@jenkins jenkins]# rm -fr plugins [root@jenkins ~]# ls jenkins-2.516.2-1.1.noarch.rpm plugins.tar.gz [root@jenkins ~]# tar zxf /root/plugins.tar.gz -C /var/lib/jenkins/ [root@jenkins ~]# systemctl enable --now jenkins.service [root@jenkins ~]# systemctl restart jenkins.service # 一定要进行重启!!! [root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword f0d8f8bb85ff4b81aa65db1aff88d0ac # 再次去测试即可 # 出现满屏红,后退之后进行安装即可

admin
admin



3.5 配置Jenkins使用GitLab更新代码
3.5.1 安装相关补充插件
bash
Credentials Plugin(默认已经安装)
Gitlab Plugin
Git Plugin 和 Git Client Plugin
GitLab Hook
Gitlab Authentication
SSH Plugin
Publish Over SSH
Credentials Plugin
Git plugin
Git client plugin
Git Authentication
GitLab
GitlabHook
Publish Over SSH
SSH


3.5.2 配置Jenkins免密拉取GitLab代码
bash
# 生成密钥对
[root@Jenkins ~]# ssh-keygen
# 查看公钥
[root@Jenkins ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCr3TDlySD1FrvnOrv8ae1vkqlp/o44ReEFKT7A19tN7/G4MW2jNxhjDHlszVW8mIJWKyKdo5l2Ed5I4Ieteeq3JsqPMKkf36y15o8QgfjbGJdd+9lp21Lh5j2AVEVlgZ7zO1ydZ5tTYkfyLSkQ3xz4dQOVSGwuw664BpMGnmxp7LxvU5kHm5s9ncg4iHvE2vNUrf8cVTkO/vtB2obvVXRjOVMqO8eQbhNkRgBF+hqKKg5K0DeGcee6Y3kn9lzJsw2zdivgmQMzbx1WxCWIlRQi7B3y5aodGTvaKY79Fdrj0wIC5wP3+X/tM+XFZTB+9iuJjRBpdx/HcR44Rkjm4W6Z8jyHirKn2Czd33InAXek/8WhQrKBaLHoBBvks8AAnH8VUCoHFmnd8pH2KbnUPAXfUDNYDNLqcBLGKeOip2FFcvDxQdlXSxugePOnyxhH+pTHMdsEQsvNbqRPAs6u2dOhoFdmi9zmFbtuzDxC5suQnqkx2N7fK1tb+idhFwabp2k= root@Jenkins



bash
[root@Jenkins ~]# yum install -y git

bash
[root@Jenkins ~]# git clone git@172.25.254.44:dev/test.git
[root@Jenkins ~]# cd test/
[root@Jenkins test]# ls
README.md
[root@Jenkins test]# cat README.md
This is Version1.
此时实现了免密克隆
3.5.3 将id_rsa私钥配置至Jenkins
bash
# 查看自己私钥
[root@Jenkins ~]# cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
xxxx省略省略省略xxxx
xxxx省略省略省略xxxx
xxxx省略省略省略xxxx
xxxx省略省略省略xxxx
xxxx省略省略省略xxxx
-----END OPENSSH PRIVATE KEY-----




