目录
[1、Jenkins 结合 Gitlab 构建 CI/CD 环境](#1、Jenkins 结合 Gitlab 构建 CI/CD 环境)
[CI/CD 介绍](#CI/CD 介绍)
[CI/CD 流程](#CI/CD 流程)
[Jenkins 简介](#Jenkins 简介)
[GitLab 简介](#GitLab 简介)
[2、搭建 GitLab](#2、搭建 GitLab)
[安装 GitLab](#安装 GitLab)
[配置 GitLab](#配置 GitLab)
[访问 GitLab](#访问 GitLab)
[3、使用 GitLab](#3、使用 GitLab)
[管理 GitLab](#管理 GitLab)
[关闭 GitLab 注册功能](#关闭 GitLab 注册功能)
[设置 邮箱报警](#设置 邮箱报警)
1、Jenkins 结合 Gitlab 构建 CI/CD 环境
常用的构建工具如 Jenkins、Travis、Codeship、Bamboo、gitlab、GitHub、Bitbucket。
CI/CD 介绍
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。
CI/CD 的核心概念是持续集成、持续交付和持续部署。
CI/CD 主要针对在集成新代码时所引发的问题,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。这些关联的事务通常被统称为"CI/CD 管道",由开发和运维团队以敏捷方式协同支持。
|---------|------------------------------------------------------------------------------------------------------------------------------------------|
| 持续集成 CI | CI (CI-Continuous integration)是指持续集成,开发者在代码的开发过程中,可以频繁的(一天多次)将代码合并到主干源码仓库,并进行自动化测试。 |
| 持续交付 CD | CD (Continuous Delivery)持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到测试环境或生产环境中。目的就是确保尽可能减少部署新代码时所需的工作量。 |
| 持续部署 CD | CD-continuous deployment,持续部署(另一种"CD")是指自动将开发人员更改的代码从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。 |
CI/CD 流程
① **提交代码到仓库:**开发者提交代码到仓库(commit)
② 代码测试
对代码仓库 commit 操作配置了钩子(hook),只要提交代码或者合并进主干,开始拉取代码进行代码测试。
1、代码质量测试(SonarQube)
2、代码单元测试:针对函数或模块的测试
3、集成测试:针对整体产品的某个功能的测试,又称功能测试
4、端对端测试:从用户界面直达数据库的全链路测试
③ 构建(编译)
通过第一轮测试,代码可以交付了。交付后,就先进行构建(build)。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS 脚本、图片)等等。
④ **部署代码到测试环境:**构建完成把产品部署到测试环境进行
⑤ 测试(第二轮)
构建完成,就要进行第二轮测试。第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。 需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高, 进入后面的部署阶段后,很可能会出现严重的问题。
⑥ 部署代码到生产环境
通过了第二轮测试,当前代码就是一个可以直接部署的版本了。将这个版本的所有文件发布到生产服务器。 部署工具有 shell 脚本,Ansible,Chef,Puppet 等。
⑦ 回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。
Jenkins 简介
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成、交付、部署的基于 web 界面的平台,用于自动化各种任务,包括构建、测试和部署软件。
GitLab 简介
gitlab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。
GitLab 拥有与 Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管 理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
项目部署方式
①手动部署

②自动部署

搭建上述持续集成环境可以把整个构建、部署过程自动化,很大程度上减轻工作量。对于程序员的日常开发来说不会造成任何额外负担,自己把代码提交上去之后,服务器上运行的马上就是最新版本。
CI系统的工作流程

系统的工作流程大概分为以下几步:
①开发者将新版本 push 到 git server (Gitlab)。
②Gitlab 随后触发 jenkins master 结点进行一次 build。(通过 web hook 或者定时检测)
③jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个 slave 结点根据一个事先设置好的脚本进行 build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给 jenkins 来做。
④我们在 build 中要进行编译,这里使用了分布式编译器 distcc 来加快编译速度。
注: jenkins 的工作原理是先将源代码从 gitlab 中拷贝一份到本地,然后根据设置的脚本进行 build。我们可以看出,整个系统的关键就是那个 build 脚本,用来告诉 jenkins 在一次集成中需要执行的任务。
2、搭建 GitLab
|---------|-----------------|---------|----------------|
| 主机 | IP | 角色 | 安装软件 |
| node-15 | 192.168.137.115 | GitLab | GitLab |
| node-16 | 192.168.137.116 | Jenkins | Jenkins、Apache |
| node-17 | 192.168.137.117 | Apache | Apache |
注意:gitlab 主机内存给大一点,最好是 4G,不然后面会报错关闭所有主机的防火墙和 selinux
安装 GitLab
# 安装依赖环境
yum install -y curl policycoreutils \
openssh-server openssh-clients postfix policycoreutils-python cronie
# 启动 Postfix
systemctl enable postfix
systemctl start postfix
# 下载GitLab
wget \
http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.3.2-ce.0.el7.x86_64.rpm
# 安装GitLab
rpm -ivh gitlab-ce-15.3.2-ce.0.el7.x86_64.rpm

配置 GitLab
# 配置 gitlab 访问地址:修改 gitlab 外部访问地址
vim /etc/gitlab/gitlab.rb

# 重置 GitLab
# 重新配置应用程序。修改了 gitlab 服务配置文件后,都需要执行一下这个命令。
# 让各个服务的配置文件,重新加载一下配置文件。这里等个 4 分钟左右。
gitlab-ctl reconfigure

# 查看服务器状态
gitlab-ctl status

查看登陆密码
# 查看登陆密码
cat /etc/gitlab/initial_root_password
Password: e2pmqEAMFfiptvpfE6W8iZr98Kgn7nJ+UUUM6DauQ04=

修改root密码
默认密码有效期 24 小时, 修改 root 密码为 12345678
gitlab-rake "gitlab:password:reset"

访问 GitLab
# 查看端口: 默认使用 nginx 做为 web 界面。
netstat -antup | grep 80
注意:如果后期 web 界面访问时,总报 502,要把防火墙清空规则,另外内存要大于 4G,不然以后内存不足,也报 502

开机自启
systemctl enable gitlab-runsvdir
systemctl status gitlab-runsvdir
3、使用 GitLab
管理 GitLab
主配置文件: /etc/gitlab/gitlab.rb #可以自定义一些邮件服务等
日志地址: /var/log/gitlab/ #对应各服务
服务地址: /var/opt/gitlab/ #对应各服务的主目录
仓库地址: /var/opt/gitlab/git-data #记录项目仓库等提交信息
|-----------------------------------------|----------------|
| gitlab-ctl stop | 关闭 gitlab |
| gitlab-ctl start | 启动 gitlab |
| gitlab-ctl restart | 重启 gitlab |
| gitlab-ctl reconfigure | 重置配置,#不要乱用 |
| gitlab-ctl tail | 查看所有日志 |
| gitlab-ctl tail nginx/gitlab_access.log | 查看 nginx 访问日志 |
关闭 GitLab 注册功能




设置 邮箱报警
linux 运维最注重的一点就是告警邮件,所以 Gitlab 一样提供了邮件发送的功能。 使用默认设置可能收不到邮件,这里使用第三方 SMTP 服务器。
官网各种邮箱配置实例: https://docs.gitlab.com/omnibus/settings/smtp.html
修改配置文件:
# 这里我配置的是新浪邮箱 SMTP: c8a8ec186ad388cb
vim /etc/gitlab/gitlab.rb #在第 108 行后添加以下内容
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.sina.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "codelemon@sina.com"
gitlab_rails['smtp_password'] = "c8a8ec186ad388cb" # 授权码(8e0dc7bd66fba002)
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['gitlab_email_from'] = 'codelemon@sina.com'
gitlab_rails['gitlab_email_reply_to'] = 'codelemon@sina.com'
# 重载 gitlab
gitlab-ctl reconfigure
# 登陆控制台发送测试邮件
gitlab-rails console #登陆控制台,注意写你自己的邮箱
irb(main):002:0> Notify.test_email('codelemon@sina.com','test','test').deliver_now

创建一个群组



创建一个账号


在组里添加用户







4、新建仓库
创建一个项目
可以在群组里创建项目,也可以创建私有的项目,然后使用,使用方法跟 github 一样。



仓库使用说明
跟使用 github 方法一样。需要注意没有在账号中新建 SSH 公钥之前将无法通过 SSH 拉取或推送代码。Gitlab 自己也支持 CI/CD,这里我们采用 jenkins 来做 CI/CD。


新建一个文件


生成公钥导入GitLab(测试失败)
在本地打开Git Bash

TortoiseGit 使用扩展名为 ppk 的密钥,而不是 ssh-keygen 生成的 rsa 密钥。使用命令 ssh-keygen -C "邮箱地址" -t rsa 产生的密钥在 TortoiseGit 中不能用。
而基于 git 的开发必须要用到 rsa 密钥,因此需要用到 TortoiseGit 的 putty key generator 工具来生成既适用于 git 的 rsa 密钥也适用于 TortoiseGit 的 ppk 密钥。
①运行 TortoiseGit 开始菜单中的 puttygen 程序
②点击"Generate"按钮,鼠标在上图的空白地方来回移动直到进度条完毕,就会自动生一个随机的 key

③保存公钥
④保存私钥:点击上图中的"Save private key"按钮,将生成的 key 保存为适用于 TortoiseGit 的私钥(扩展名为.ppk)

⑤把私钥加入 TortoiseGit,在开始菜单打开Pageant

⑥ 把公钥导入Gitlab

