RHEL——CICD持续集成与交付

CICD 是自动化软件开发流水线,通过 GitLab CI、Jenkins 等工具实现代码提交后的自动构建、测试和部署,结合 Docker 和 Kubernetes 可完成从代码到容器化应用上线的全流程自动化,提升交付效率和质量。


一、CI/CD 简介

CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)

1. 持续集成(Continuous Integration)

持续集成是一种软件开发实践,团队中的成员经常把他们完成的工作合并到共用的代码仓库中。

  • 频繁提交代码:开发人员每天可以多次提交代码,保证代码库始终是最新状态。
  • 自动化构建:每次提交代码后,系统自动触发构建过程,包括编译、运行测试、代码分析等操作。
  • 快速反馈:如果构建失败或者测试没通过,系统能迅速通知开发人员,方便他们及时修复问题。

2. 持续部署(Continuous Deployment)

持续部署是在持续集成的基础上,把通过了所有测试的代码自动发布到生产环境中。

  • 全自动流程:从代码提交到上线部署整个过程都自动完成,不需要人工介入。
  • 部署频率高:可以实现频繁的版本发布,新功能可以更快地交付给用户使用。
  • 风险控制:需要有完善的测试和监控体系来保证每次部署的稳定性和可靠性。

3. 持续交付(Continuous Delivery)

持续交付和持续部署类似,但不一定会自动部署到生产环境,而是保证代码随时可以手动触发部署。重点是确保软件始终处于可发布的状态。


4. CI/CD 角色

CI/CD 的作用

  • 提升开发效率:减少手动操作和等待时间,加快开发迭代速度。
  • 提前发现问题:通过经常性的集成和测试,问题可以在早期被发现和修复。
  • 降低上线风险:避免大规模部署可能引发的问题,提高软件的质量和稳定性。
  • 改善团队协作:促进团队成员之间的沟通和配合,提升整体工作效率。

常见的 CI/CD 工具包括 Jenkins、GitLab CI/CD、Travis CI 等。这些工具可以帮助团队搭建自动化的构建、测试和部署流程。


二、git 工具使用

Git 是版本控制工具,用于在本地记录代码的每一次修改历史,支持多人协作时不冲突。开发人员在本地用 Git 提交代码变更。

1. git 简介

Git 是一个分布式的版本控制系统,主要用来管理软件开发过程中的代码版本和变更记录。

分布式

  • 每个开发者的电脑上都有一份完整的代码仓库副本,即使没有网络也能正常干活,网络出问题也不影响开发进度。
  • 就算中央服务器坏了,开发者照样能在本地继续开发和查看项目历史。

高效的分支管理

  • Git 里创建和切换分支非常快,操作也很简单。开发人员可以随时开一个新分支来开发功能或修复 bug,不会干扰主分支的正常运行。
  • 合并分支同样比较方便,提供了多种合并策略,可以按不同场景选择合适的方式。

快速的版本回退

  • 如果某个版本出了问题,可以很快地回退到之前的正常版本。
  • 每个版本的变更记录都能查看到,方便了解代码一步步是怎么改过来的。

强大的提交管理

  • 每次提交都有一个唯一的编号,可以方便地查找和引用某次具体的提交。
  • 提交时可以写上详细的说明,描述这次改了什么东西。

支持协作开发

  • 开发者可以把本地改动推送到远程仓库,让别人拉取和合并。
  • 多个开发者同时修改同一个文件时,Git 有合并冲突的处理机制,能保证代码最终是完整的。

Git必看秘籍:


2. git 工作流程

Git 中有三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。

  • 已修改:改了文件的内容,但还没有把改动保存到本地数据库中。
  • 已暂存:对某个已修改的文件做了标记,表示这个版本要放到下次提交的快照里去。
  • 已提交:数据已经安全地存到了本地的数据库中。

这三种状态对应了 Git 项目的三个阶段:工作区、暂存区和 Git 目录(版本库)。


3. 部署 git

创建一个虚拟机(192.168.153.10),至少2C4G

(1)安装 git

安装 git,配置并加载自动补全。

复制代码
[root@gitlab ~]# dnf install git -y
[root@gitlab ~]# echo  "source /usr/share/bash-completion/completions/git" >> ~/.bash_profile
[root@gitlab ~]# source ~/.bash_profile

(2)初始化

获取 Git 仓库通常有两种方式:

  • 把一个尚未进行版本控制的本地目录变成 Git 仓库。
  • 从其他服务器克隆一个已经存在的 Git 仓库,例如执行 `git clone`。

".git"目录是 Git 用于跟踪和管理版本库的核心目录,不建议随意操作其中的文件。

初始化 git 仓库

  1. 创建目录并初始化为 Git 仓库,查看 .git 目录结构。

  2. 配置全局用户名和邮箱,查看仓库状态确认空仓库。

    [root@gitlab ~]# mkdir gitlab
    [root@gitlab ~]# cd gitlab/
    [root@gitlab gitlab]# git init
    [root@gitlab gitlab]# ls -a
    [root@gitlab gitlab]# ls .git/
    [root@gitlab gitlab]# git config --global user.name "timinglee"
    [root@gitlab gitlab]# git config --global user.email "admin@timinglee.org"
    [root@gitlab gitlab]# git status
    [root@gitlab gitlab]# git status -s


4. git 常用命令

(1)创建未跟踪文件

创建文件,查看文件的状态(格式:"'xx' 文件")

  • '??' README.md------表示 README.md 未跟踪,只存在工作区

  • 'R ' README.md------表示 README.md 已重命名并添加到暂存区

    [root@gitlab gitlab]# echo timinglee > README.md
    [root@gitlab gitlab]# git status
    [root@gitlab gitlab]# git status -s


(2)添加到暂存区和版本库

将文件从工作区添加到暂存区,再从暂存区提交到版本库

  • 'A ' README.md------表示 README.md 已添加到暂存区

  • 'AM' README.md------表示 README.md 原先存在版本库中,添加到暂存区,暂存后又修改了工作区(未再次暂存),当前存在工作区

    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# git add README.md
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# git commit -m "gitlab-test v1"
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# ls .git/
    [root@gitlab gitlab]# git ls-tree HEAD


(3)撤销文件修改

修改文件后再撤销修改

  • 'M ' README.md------表示 README.md 原先存在版本库中,且修改并添加到暂存区,当前存在暂存区

    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# sed -i 's/timinglee/timinglee111/g' README.md
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# git checkout -- README.md
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# git status -s


(4)撤销暂存区文件

修改版本库中的文件,在添加到暂存区

  • ' M' README.md------表示 README.md 原先存在版本库中,修改但未添加到暂存区,当前存在工作区

    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# sed -i 's/timinglee/timinglee111/g' README.md
    [root@gitlab gitlab]# git add README.md
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# ls .git/


从暂存区撤销文件

复制代码
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git restore --staged README.md
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git add README.md
[root@gitlab gitlab]# git status -s

(5)更新提交版本库

提交到版本库,修改工作区文件后,查看工作区与版本库的差异

复制代码
[root@gitlab gitlab]# cat README.md
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git diff
[root@gitlab gitlab]# git commit -m "gitlab-test v2"
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# sed -i "s/timinglee111/timinglee222/g" README.md
[root@gitlab gitlab]# git diff

将文件添加到暂存区后再修改,然后直接一步提交到版本库

复制代码
[root@gitlab gitlab]# cat README.md
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git add README.md
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# echo timinglee333 > README.md
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git diff
[root@gitlab gitlab]# git commit -a -m "gitlab-test v3"
[root@gitlab gitlab]# git show HEAD:README.md

(6)查看版本库历史

查看版本库的提交历史和文件内容

复制代码
[root@gitlab gitlab]# git log --oneline
[root@gitlab gitlab]# git ls-tree 077add5
[root@gitlab gitlab]# git show 077add5:README.md
[root@gitlab gitlab]# git ls-tree 78bd9f9
[root@gitlab gitlab]# git show 78bd9f9:README.md
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git show HEAD:README.md
[root@gitlab gitlab]# git show 8c45f54:README.md

(7)撤销工作区的删除

普通删除工作区文件后,再撤销工作区的删除

  • ' D' README.md------表示 README.md 已删除但暂存区未记录删除操作

    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# rm -rf README.md
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# git checkout -- README.md
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# cat README.md
    [root@gitlab gitlab]# git status -s


git 删除工作区文件后,先从暂存区撤销删除操作,然后将文件撤回工作区

  • 'D ' README.md------表示 README.md 已删除且暂存区记录删除操作

    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# git rm README.md
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# git status -s
    [root@gitlab gitlab]# git restore --staged README.md
    [root@gitlab gitlab]# git checkout -- README.md
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# cat README.md


git 删除工作区文件后,直接从版本库覆盖文件到工作区和暂存区

  • git restore README.md:仅覆盖工作区(用暂存区内容)

  • git restore --staged README.md:仅覆盖暂存区(用 HEAD 内容)

  • git restore --source=HEAD --staged --worktree README.md:同时覆盖暂存区和工作区(都用 HEAD 内容)

    [root@gitlab gitlab]# git rm README.md
    [root@gitlab gitlab]# git ls-tree HEAD
    [root@gitlab gitlab]# git show HEAD:README.md
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# git restore --source=HEAD --staged --worktree README.md
    [root@gitlab gitlab]# ls
    [root@gitlab gitlab]# cat README.md


(8)恢复版本库的数据

删除版本库的文件

复制代码
[root@gitlab gitlab]# git rm README.md
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git commit -m "delete README.md"
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git log

恢复版本库

复制代码
[root@gitlab gitlab]# git reflog
[root@gitlab gitlab]# ls
[root@gitlab gitlab]# git ls-tree 8c45f54
[root@gitlab gitlab]# git show 8c45f54:README.md
[root@gitlab gitlab]# git reset --hard 8c45f54
[root@gitlab gitlab]# ls
[root@gitlab gitlab]# cat README.md

(9)git 忽略文件

指定文件写入到".gitignore"中,是该文件被忽略

复制代码
[root@gitlab gitlab]# mkdir test
[root@gitlab gitlab]# echo file111 > test/.file1
[root@gitlab gitlab]# echo file222 > .file2
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# echo .file1 > .gitignore
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git add test/
[root@gitlab gitlab]# git add .file2
[root@gitlab gitlab]# git commit -m "gitlab-test v4"
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git show HEAD:.file2

指定选中的文件写入到".gitig"

复制代码
[root@gitlab gitlab]# git reflog
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git reset --hard 8c45f54
[root@gitlab gitlab]# git ls-tree HEAD
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# ls -a
[root@gitlab gitlab]# echo file222 > .file2
[root@gitlab gitlab]# cat .gitignore
[root@gitlab gitlab]# sed -i 's/.file1//g' .gitignore
[root@gitlab gitlab]# cat .gitignore
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# echo ".*" > .gitignore
[root@gitlab gitlab]# cat .gitignore
[root@gitlab gitlab]# git status -s
[root@gitlab gitlab]# git add test/.file1

三、GitLab 代码仓库

当开发团队需要多人协作开发同一个项目时,仅靠 Git 命令行和本地仓库无法实现权限管理、代码审查、问题追踪和持续集成等协作功能。

所以需要使用 GitLab 这类代码仓库平台,提供 Web 界面管理代码、控制访问权限、支持合并请求和 CI/CD 流水线,帮助团队规范开发流程并提升协作效率。

1. GitLab 简介

  • GitLab 是一个开源的仓库管理系统项目,以 Git 作为代码管理工具,并在此基础之上构建了 Web 服务。
  • GitLab 具备代码托管、持续集成与持续部署(CI/CD)、问题跟踪、合并请求管理等多种功能。它能够协助开发团队更高效地进行软件项目的协作开发,提升开发效率和代码质量。

官网:https://about.gitlab.com/install/

中文站点:https://gitlab.cn/install/


2. 部署 GitLab 代码仓库

部署 gitlab 仓库的主机需要至少4G内存

(1)安装 GitLab

gitlab 官方包地址:https://packages.gitlab.com/gitlab/gitlab-ce

gitlab 下载链接:

https://packages.gitlab.com/gitlab/gitlab-ce/el/9/x86_64/Packages/g/gitlab-ce-18.11.2-ce.0.el9.x86_64.rpm


安装 GitLab RPM 包及其依赖软件。

  • policycoreutils-python-utils:SELinux 管理工具,用于配置安全策略

  • openssh-server:SSH 服务,用于 Git 远程访问

  • perl:Perl 语言解释器,部分脚本依赖

    [root@gitlab ~]# ls
    [root@gitlab ~]# dnf install gitlab-ce-18.11.2-ce.0.el9.x86_64.rpm -y
    [root@gitlab ~]# dnf install -y curl policycoreutils-python-utils openssh-server perl


配置启动 gitlab

  • 配置 Git 全局用户信息,修改 GitLab 外部访问地址,执行重新配置使生效。

    [root@gitlab ~]# git config --global user.name "timinglee"
    [root@gitlab ~]# git config --global user.email "admin@timinglee.org"
    [root@gitlab ~]# ls /etc/gitlab/
    [root@gitlab ~]# vim /etc/gitlab/gitlab.rb
    32 external_url 'http://192.168.153.10'
    [root@gitlab ~]# grep -w external_url /etc/gitlab/gitlab.rb
    [root@gitlab ~]# gitlab-ctl reconfigure


(2)登录 GitLab

登录 gitlab 账户

  • 默认用户名为 root。
  • 若安装时已设置初始密码,则使用该密码登录。
  • 若未设置,系统会随机生成一个密码并保存在 /etc/gitlab/initial_root_password 文件中,可用此文件中的随机密码配合 root 用户名登录。
  • 注意:出于安全考虑,/etc/gitlab/initial_root_password 文件会在首次执行 gitlab-ctl reconfigure 后的 24 小时内被自动删除。因此,如果使用随机密码登录,建议在安装成功后第一时间登录并修改密码。

查看初始密码

复制代码
[root@gitlab ~]# grep Password /etc/gitlab/initial_root_password

登录 gitlab


设置语言


修改密码(123456git.)


3. 创建 GitLab 项目

(1)创建项目

登录 GitLab Web 界面后,点击"创建项目"按钮,选择"创建空白项目",填写项目名称、描述,设置可见性级别(私有、内部、公开),点击"创建项目"即可。


(2)主机克隆项目

① 克隆项目
复制代码
[root@gitlab ~]# git clone git@192.168.153.10:root/timinglee.git

② 创建 ssh 秘钥
  1. 生成 GitLab 专用的 SSH 密钥对,将公钥添加到 GitLab 账号。

  2. 配置 SSH 客户端,指定连接 GitLab 时使用专用私钥和远程用户。

    [root@gitlab ~]# cd .ssh/
    [root@gitlab .ssh]# ls
    [root@gitlab .ssh]# ssh-keygen -t rsa -b 4096 -C "gitlab" -f gitlab_key
    Enter passphrase (empty for no passphrase): #回车
    Enter same passphrase again: #回车
    [root@gitlab .ssh]# ls
    [root@gitlab .ssh]# cat gitlab_key.pub
    [root@gitlab .ssh]# cat >> ~/.ssh/config << EOF
    Host 192.168.153.10
    IdentityFile ~/.ssh/gitlab_key
    User git
    EOF


③ 上传公钥

(3)测试项目

克隆项目


克隆项目

  • 克隆 GitLab 项目到本地,创建并提交新文件,推送到远程仓库。
复制代码
[root@gitlab ~]# git clone git@192.168.153.10:root/timinglee.git
[root@gitlab ~]# ls
[root@gitlab ~]# cd timinglee/
[root@gitlab timinglee]# ls -a
[root@gitlab timinglee]# echo "Hello World!!!" > test
[root@gitlab timinglee]# git add test
[root@gitlab timinglee]# git commit -m "timinglee-test V1"
[root@gitlab timinglee]# git push -u origin main

更新项目

  • 修改 test 文件内容,提交变更并推送到远程仓库。

    [root@gitlab timinglee]# git ls-tree HEAD
    [root@gitlab timinglee]# git show HEAD:test
    [root@gitlab timinglee]# echo "How are you?" > test
    [root@gitlab timinglee]# git reflog
    [root@gitlab timinglee]# git commit -am "timinglee-test v2"
    [root@gitlab timinglee]# git push -u origin main


四、Jenkins

当开发人员频繁提交代码时,每次都需要手动进行编译、测试、打包和部署,效率低下且容易出错。

所以需要使用 Jenkins 这类 CI/CD 工具,自动监听代码仓库的变化,触发构建流水线完成自动化编译、测试和部署,提升交付效率和质量。

1. Jenkins 简介

  • Jenkins 是开源 CI&CD 软件领域的领导者,提供超过 1000 个插件来支持构建、部署、自动化等操作,能够满足各类项目的需求。
  • Jenkins 使用 Java 语言编写,可以在 Tomcat 等常用 Servlet 容器中运行,也可以独立运行。

CI(持续集成)强调开发人员在提交新代码后,立即进行构建和(单元)测试。

CD(持续交付)是在持续集成的基础上,将集成后的代码部署到更接近真实运行环境(如类生产环境)中。


2. 部署 Jenkins

创建一个虚拟机(192.168.153.20),至少4C4G

(1)安装 Jenkins

Jenkins 下载链接:https://www.jenkins.io/download/

安装 jenkins

  • 下载 Jenkins 仓库配置,安装 Jenkins 及依赖,启动服务并设置开机自启,查看初始管理员密码。

    [root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/rpm-stable/jenkins.repo
    [root@jenkins ~]# yum install fontconfig java-21-openjdk jenkins -y
    [root@jenkins ~]# systemctl daemon-reload
    [root@jenkins ~]# systemctl enable --now jenkins.service


(2)安装 Jenkins 插件

登录 jenkins(默认8080端口)

复制代码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword


安装插件(建议有 http 代理)

复制代码
[root@jenkins ~]# cd /var/lib/jenkins/
[root@jenkins jenkins]# ls
[root@jenkins jenkins]# ls plugins/

(3)登录设置 Jenkins

使用默认 Jenkins


设置时区和修改密码(123jenkins.)


3. Jenkins 与 GitLab 整合

当开发人员将代码推送到 GitLab 后,如果每次都需要手动登录 Jenkins 触发构建,效率低且容易遗漏。

所以需要将 Jenkins 和 GitLab 整合,让 Jenkins 自动监听 GitLab 中的代码推送事件,一旦有代码变更就自动触发构建、测试和部署流水线,实现从代码提交到应用交付的全自动化。

(1)生成 ssh 密钥

生成 jenkins 的密钥

  • 安装 Git 并配置自动补全,生成 Jenkins 专用 SSH 密钥对,查看公钥和私钥内容。

    [root@jenkins ~]# dnf install git -y
    [root@jenkins ~]# echo "source /usr/share/bash-completion/completions/git" >> ~/.bash_profile
    [root@jenkins ~]# source ~/.bash_profile
    [root@jenkins ~]# ssh-keygen -t rsa -b 4096 -C "jenkins" -f ~/.ssh/jenkins_key
    Enter passphrase (empty for no passphrase): # 回车
    Enter same passphrase again: # 回车
    [root@jenkins ~]# ls .ssh/
    [root@jenkins ~]# cat .ssh/jenkins_key.pub
    [root@jenkins ~]# cat .ssh/jenkins_key
    [root@jenkins ~]# vim /etc/ssh/ssh_config
    20 Host *
    21 StrictHostKeyChecking no


(2)创建 Jenkins 项目

① 给 GitLab 仓库添加 Jenkins 的公钥

② 创建 Jenkins 项目

创建项目


③ 指定 jenkins 从 gitlab 的项目拉取

④ 给 jenkins 自身添加私钥

⑤ 给 jenkins 选择 gitlab 的分支

⑥ 添加测试效果

⑦ 查看构建信息

4. Jenkins 中的 GitLab 触发器

当开发人员将代码推送到 GitLab 时,如果每次都需要手动登录 Jenkins 点击构建,效率低且容易遗漏。

所以需要部署 GitLab 触发器,让 Jenkins 自动监听 GitLab 中的代码推送或合并请求事件,一旦有变更就自动触发构建流水线,实现从代码提交到自动化构建的无缝衔接。

(1)安装 GitLab 插件

要使用 gitlab 触发器,需要先在 jenkins 安装 gitlab 插件。


(2)部署 Jenkins 自动触发

① 配置 Jenkins 的 URL 和令牌

② GitLab 设置 Webhook

设置 gitlab 允许 webhook 请求


添加 jenkins 的 url 和令牌


测试


(3)测试自动触发

修改文件推送到 gitlab 仓库

复制代码
[root@gitlab ~]# ls
[root@gitlab ~]# cd timinglee/
[root@gitlab timinglee]# ls
[root@gitlab timinglee]# echo "hahaha" >> test
[root@gitlab timinglee]# git reflog
[root@gitlab timinglee]# git commit -am "timinglee-test v3"
[root@gitlab timinglee]# git push -u origin main

查看 gitlab 仓库


查看 jenkins 构建


五、持续集成与交付企业示例

1. CI/CD 架构与主机分工

为了让容器构建镜像可以持续集成并自动上传到harbor仓库,业务主机通过持续交付自动从仓库中下载镜像最近版本并实现业务更新

工作流程

  • 开发人员推送代码到 GitLab
  • Jenkins 拉取代码
  • Jenkins 通过 SSH 连接 Harbor 主机,执行 docker build 构建镜像
  • 镜像直接存储在 Harbor 主机本地
  • Jenkins 通知 Docker 业务节点从 Harbor 拉取镜像并运行容器

2. 准备环境

实现基本的持续集成和持续交付,需要4台主机

|-----------------|-------------------|---------------------------------------|
| 主机 | 角色 | 工作 |
| 192.168.153.10 | GitLab 代码仓库 | - 存放代码仓库,管理版本和分支 |
| 192.168.153.20 | Jenkins CI/CD 服务器 | - 调度构建任务、拉取代码、触发镜像构建、触发部署 |
| 192.168.153.30 | Docker 业务节点 | - 既作为镜像仓库存储镜像 - 也作为构建节点执行 Docker 构建命令 |
| 192.168.153.254 | Harbor 镜像仓库 | - 从 Harbor 拉取镜像,启动应用容器 |

(1)准备 Harbor 主机

构建 harbor 仓库:https://blog.csdn.net/Forget_8/article/details/159584749?spm=1001.2014.3001.5502#t11

① 安装 docker
复制代码
[root@harbor ~]# cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF
[root@harbor ~]# dnf install docker-ce-3:28.5.2-1.el9 -y
[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# cat > /etc/sysctl.d/docker.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
[root@harbor ~]# sysctl --system
[root@harbor ~]# vim /lib/systemd/system/docker.service
 15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker.service

② 生成证书
复制代码
[root@harbor ~]# mkdir -p /data/certs
[root@harbor ~]# openssl req -newkey  rsa:4096 \
-nodes -sha256 -keyout /data/certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \
-x509 -days 365 -out /data/certs/timinglee.org.crt
······
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:guangxi
Locality Name (eg, city) [Default City]:guilin
Organization Name (eg, company) [Default Company Ltd]:kubernetes
Organizational Unit Name (eg, section) []:harbor
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:admin@timinglee.org

[root@harbor harbor]# mkdir -p /etc/docker/certs.d/reg.timinglee.org/
[root@harbor harbor]# cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@harbor harbor]# cp /data/certs/timinglee.org.crt /etc/pki/ca-trust/source/anchors/
[root@harbor harbor]# update-ca-trust
[root@harbor harbor]# vim /etc/hosts
  3 192.168.153.254     harbor reg.timinglee.org
[root@harbor harbor]# systemctl restart docker.service

③ 安装 harbor

harbor 下载链接:https://github.com/goharbor/harbor/releases/download/v2.5.6/harbor-offline-installer-v2.5.6.tgz

复制代码
[root@harbor ~]# ls
[root@harbor ~]# tar zxf harbor-offline-installer-v2.5.6.tgz -C /opt/
[root@harbor ~]# cd /opt/harbor/
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# find $pwd /data/certs/
[root@harbor harbor]# vim harbor.yml
  5 hostname: reg.timinglee.org
 17   certificate: /data/certs/timinglee.org.crt
 18   private_key: /data/certs/timinglee.org.key
 34 harbor_admin_password: lee
[root@harbor harbor]# ./install.sh --with-chartmuseum
[root@harbor harbor]# sed -i 's/127.0.0.1:1514:10514/1514:10514/g' docker-compose.yml
[root@harbor harbor]# docker compose down
[root@harbor harbor]# docker compose up -d
[root@harbor harbor]# docker login reg.timinglee.org -u admin

(2)准备 docker 主机

① 安装 docker

部署 docker:https://blog.csdn.net/Forget_8/article/details/159289954?spm=1001.2014.3001.5502#t4

复制代码
[root@harbor ~]# cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF
[root@harbor ~]# dnf install docker-ce-3:28.5.2-1.el9 -y
[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# cat > /etc/sysctl.d/docker.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
[root@harbor ~]# sysctl --system
[root@harbor ~]# vim /lib/systemd/system/docker.service
 15 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker.service

② 上传镜像
复制代码
[root@docker ~]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p
[root@docker ~]# scp root@192.168.153.254:/data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker ~]# cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://reg.timinglee.org"]
}
EOF
[root@docker ~]# vim /etc/hosts
  3 192.168.153.30      docker
  4 192.168.153.254     reg.timinglee.org
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker login reg.timinglee.org -uadmin -plee
[root@docker ~]# docker pull nginx
[root@docker ~]# docker tag nginx:latest reg.timinglee.org/library/nginx:latest
[root@docker ~]# docker push reg.timinglee.org/library/nginx:latest
[root@docker ~]# docker rmi nginx:latest

3. 添加 Harbor 构建节点

(1)安装 java 环境

在 docker 业务节点和 harbor 镜像仓库上安装 java 环境

复制代码
[root@docker ~]# dnf install fontconfig java-21-openjdk git -y
[root@docker ~]# systemctl restart docker.service

[root@harbor ~]# dnf install fontconfig java-21-openjdk git -y
[root@harbor ~]# systemctl restart docker.service
[root@harbor ~]# ssh-keyscan -H 192.168.153.10 >> ~/.ssh/known_hosts

(2)添加 node

  1. 进入 Jenkins 系统管理 → 节点和云管理 → New Node。
  2. 填写节点名称(如 registry-node),类型选择固定节点,设置执行器数量和远程工作目录。
  3. 启动方式选择"通过 SSH 启动代理",填写 Harbor 主机 IP 和 SSH 认证凭证,主机密钥验证选择"Non verifying...",保存。

(3)配置 jenkins 自身构建节点

  • 进入 Jenkins 系统管理,点击节点和云管理,找到 master 节点,点击配置从节点,将"Number of executors"修改为 0,保存即可。

(4) 安装插件

安装 docker 插件

  • CloudBees Docker Build and Publish:核心插件,提供构建和推送 Docker 镜像的功能
  • Docker Commons:提供 Docker 相关的通用共享功能
  • Authentication Tokens API:处理 Docker 仓库的认证令牌
  • JavaMail API:发送邮件通知
  • SSH server:支持通过 SSH 执行远程命令

安装 ssh 插件

  • JSch dependency:提供 SSH 通信的 Java 库,用于 Jenkins 通过 SSH 连接远程主机
  • SSH:让 Jenkins 能够通过 SSH 协议执行远程命令

(5)配置构建

① 删除"执行 shell"操作

② 添加构建推送镜像操作

查看 docker 套接字

复制代码
[root@docker ~]# ll /var/run/docker.sock

(6)测试构建镜像

查看 harbor 镜像仓库


在 gitlab 仓库中提交 Dockerfile 和应用代码

  1. 编辑 Dockerfile 指定基础镜像为 Harbor 仓库的 nginx,创建 index.html 文件并写入内容。

  2. 将 Dockerfile 和 index.html 添加到暂存区,提交变更并推送到远程仓库。

    [root@gitlab ~]# cd timinglee/
    [root@gitlab timinglee]# vim Dockerfile
    1 FROM reg.timinglee.org/library/nginx:latest
    2 COPY index.html /usr/share/nginx/html
    [root@gitlab timinglee]# echo "Hello world!" > index.html
    [root@gitlab timinglee]# git add Dockerfile index.html
    [root@gitlab timinglee]# git commit -m "webserver v1"
    [root@gitlab timinglee]# git push -u origin main


查看 gitlab 仓库


查看 jenkins


查看 harbor 仓库


4. 自动部署业务

(1)配置 Jenkins 远程部署节点

  • 进入 Jenkins 系统管理 → 系统配置,找到 SSH remote hosts 部分,添加 Docker 业务节点的 IP 地址和 SSH 认证凭证。

(2)创建 Jenkins 部署任务

禁止验证远程主机公钥


新建部署镜像任务

  1. 填写任务描述为 docker webserver。
  2. 勾选 GitLab 触发器并关注 timinglee 项目。
  3. 添加 SSH 步骤,连接 Docker 节点执行部署命令。

(3)测试自动部署业务

复制代码
[root@gitlab timinglee]# echo "How are you?" > index.html
[root@gitlab timinglee]# git reflog
[root@gitlab timinglee]# git commit -am "webserver v2"
[root@gitlab timinglee]# git push -u origin main
复制代码
[root@docker ~]# docker ps

相关推荐
惜年_night2 小时前
Docker部署05-GitLab的CI-CD发布
ci/cd·docker·gitlab
咖啡星人k6 小时前
MonkeyCode 的 CI/CD 实践:开源项目如何做到每2周稳定发布
ci/cd·开源
mnasd1 天前
RockyLinux 部署 Gitlab
ci/cd
*_潇_*1 天前
0095__日常--记一次gitlab Runner配置与CI/CD环境搭建流程
ci/cd·gitlab
无心水1 天前
【Harness:落地实战】24、Harness CI/CD+GitOps深度实战:智能交付与渐进发布——企业级云原生DevOps全解析
人工智能·ci/cd·云原生·openclaw·harness·hermes·honcho
qq_452396231 天前
第十九篇:《Docker 在生产环境中的 CI/CD 实践》
ci/cd·docker·容器
smartpi_ai1 天前
CI-73T1 低功耗选型误区:不支持休眠模式的替代方案指南
人工智能·ci/cd·语音识别
codeejun1 天前
每日一Go-75、CI/CD 到 K8s:云原生ArgoCD / GitOps 全流程实战(Go + Gin)
ci/cd·云原生·golang
ok406lhq2 天前
用 MonkeyCode 8 小时搭建自动化内容站:AI Coding 平台实战复盘
ci/cd·vue·ai编程·自动化部署·monkeycode