CICD 持续集成与持续交付

发布于:2024-10-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

CICD 介绍

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

持续集成(Continuous Integration)

持续集成是一种软件开发实践,团队成员频繁地将他们的工作集成到共享的代码仓库中

特点:

  • 频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态

  • 自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等

  • 快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题

持续部署(Continuous Deployment)

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

特点:

  • 自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预

  • 高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户

  • 风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性

持续交付(Continuous Delivery)

持续交付与持续部署类似,但不一定自动部署到生产环境,而是随时可以部署

其重点在于确保软件随时处于可发布状态

CI/CD 好处:

  • 提高开发效率:减少手动操作和等待时间,加快开发周期

  • 尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决

  • 降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性

  • 增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率

常见的 CI/CD 工具包括 Jenkins、GitLab CI/CD、Travis CI 等

这些工具可以帮助团队实现自动化的构建、测试和部署流程

Git 工具使用

Git 简介

Git 是一个分布式版本控制系统,被广泛用于软件开发中,以管理代码的版本和变更
特点:

  • 分布式
    • 每个开发者都有完整的代码仓库副本,这使得开发者可以在离线状态下进行工作,并且在网络出现问题时也不会影响开发
    • 即使中央服务器出现故障,开发者仍然可以在本地进行开发和查看项目历史
  • 高效的分支管理
    • Git 中的分支创建和切换非常快速和简单。开发人员可以轻松地创建新的分支来进行新功能的开发或修复 bug,而不会影响主分支
    • 合并分支也相对容易,可以使用多种合并策略来满足不同的需求
  • 快速的版本回退
    • 如果发现某个版本存在问题,可以快速回退到之前的版本
    • 可以查看每个版本的详细变更记录,方便了解代码的演进过程
  • 强大的提交管理
    • 每个提交都有一个唯一的标识符,可以方便地引用和查看特定的提交
    • 提交可以包含详细的提交信息,描述本次提交的更改内容
  • 支持协作开发
    • 开发者可以将自己的更改推送到远程仓库,供其他开发者拉取和合并
    • 可以处理多个开发者同时对同一文件进行修改的情况,通过合并冲突解决机制来确保代码的完整性

Git 相关书籍https://git-scm.com/book/zh/v2

Git 工作流程

在这里插入图片描述

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

  • 已修改:修改了文件,但还没保存到数据库中
  • 已暂存:对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
  • 已提交:数据已经安全地保存在本地数据库中

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录


Git 部署

Git 安装

# RHEL9 系统自带 Git
[root@git-lab ~]# dnf install git -y
# 命令补全功能
[root@git-lab ~]# echo "source  /usr/share/bash-completion/completions/git" >> ~/.bashrc
[root@git-lab ~]# source  ~/.bashrc

初始化

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

  • 将尚未进行版本控制的本地目录转换为 Git 仓库(创建)
  • 从其它服务器克隆 一个已存在的 Git 仓库(复制)

初始化版本库

[root@git-lab ~]# mkdir moon
[root@git-lab ~]# cd moon/
[root@git-lab moon]# git init
# hint: 使用 “master” 作为初始分支的名称。此默认分支名称可能会更改.
# hint: 在您的新存储库中配置初始分支名称,消除这条警告,执行:
# hint:
# hint:   git config --global init.defaultBranch <name>
# hint:
# hint: 除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'
# hint: 可以通过以下命令重命名刚创建的分支:
# hint:
# hint:   git branch -m <name>
# 已初始化空的 Git 仓库在 /root/moon/.git/

[root@git-lab moon]# ls -a
.  ..  .git
[root@git-lab moon]# ls .git/
branches  config  description  HEAD  hooks  info  objects  refs

# 设定用户信息
[root@git-lab moon]# git config --global user.name "moon"
[root@git-lab moon]# git config --global user.email "moon@sun.org"
[root@git-lab moon]# git status
On branch master	# 位于分支 master
No commits yet	# 尚无提交
# 没有文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
nothing to commit (create/copy files and use "git add" to track)
# 简化输出
[root@git-lab moon]# git status -s

[!warning]

.git 目录是 git 跟踪管理版本库的,不要进去随便操作

Git 使用方法

在这里插入图片描述

常用方法

[root@git-lab moon]# echo moon > README.md
[root@git-lab moon]# git status
On branch master
No commits yet
Untracked files:
# 未跟踪的文件:
  (use "git add <file>..." to include in what will be committed)
  # 使用 "git add <文件>..." 以包含要提交的内容
        README.md
nothing added to commit but untracked files present (use "git add" to track)
# 提交为空,但存在尚未跟踪的文件(使用 "git add" 建立跟踪)

[root@git-lab moon]# git status -s
?? README.md
# ?? :新建文件但未添加到版本库
[root@git-lab moon]# git add README.md
[root@git-lab moon]# git status -s
A  README.md
# A :已添加到暂存区
[root@git-lab moon]# git commit -m "add README.md"
[master (root-commit) 12f579c] add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
[root@git-lab moon]# git status -s
# 无任何显示,标志文件已经提交到版本库中
-----------------------------------
# 再次修改
[root@git-lab moon]# vim README.md
zhang3
wang5
[root@git-lab moon]# git status -s
# 右M 表示文件在工作区被修改
 M README.md
# 撤销修改
[root@git-lab moon]# git checkout -- README.md
[root@git-lab moon]# cat README.md
zhang3
# 重新修改
[root@git-lab moon]# echo li4 > README.md
[root@git-lab moon]# git add README.md
[root@git-lab moon]# git status -s
# 左M 表示文件已经在版本库中并被跟踪
M  README.md
# 从暂存区撤销
[root@git-lab moon]# git restore --staged README.md
[root@git-lab moon]# git status -s
 M README.md
# 重新提交
[root@git-lab moon]# git status -s
M  README.md
# 更新
[root@git-lab moon]# git commit -m "update v1"
[master fee15e2] update v1
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@git-lab moon]# git status -s
# 更新文件
[root@git-lab moon]# echo zhao2 >> README.md
[root@git-lab moon]# git add README.md
[root@git-lab moon]# echo zhang3 >> README.md
[root@git-lab moon]# git status -s
# MM 表示有一部分在暂存区,还有一部分没有提交
MM README.md
# 如果现在提交只能提交在暂存区中的部分
[root@git-lab moon]# git commit -m "update v2"
[master d2b9dc1] update v2
 1 file changed, 1 insertion(+)
[root@git-lab moon]# git status -s
 M README.md

# 查看已暂存和未暂存的修改变化
[root@git-lab moon]# echo hello >> README.md
[root@git-lab moon]# git diff
diff --git a/README.md b/README.md
index b6145df..839d1cb 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 li4
 zhao2
+zhang3
+hello

# 跳过使用暂存区,直接提交到版本库中(仅适用 提交过的在版本库中存在的文件,当文件状态是??时,不能用此方法)
[root@git-lab moon]# git commit -a -m "update v3"
[master 549fd70] update v3
 1 file changed, 2 insertions(+)

# 撤销工作区中的删除动作
[root@git-lab moon]# touch xixi.txt
[root@git-lab moon]# git add xixi.txt
[root@git-lab moon]# git commit -m "add xixi.txt"
[master b1a6ad5] add xixi.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 xixi.txt
[root@git-lab moon]# rm -f xixi.txt
[root@git-lab moon]# git status -s
# 右D 表示文件在工作区被删除
 D xixi.txt
[root@git-lab moon]# git checkout -- xixi.txt
[root@git-lab moon]# ls
README.md  xixi.txt

# 从版本库中删除文件
[root@git-lab moon]# git rm xixi.txt
rm 'xixi.txt'
[root@git-lab moon]# git status -s
# 左D 表示文件删除动作被提交到暂存区
D  xixi.txt
[root@git-lab moon]# git commit -m "delete xixi.txt"
[master 0d43c04] delete xixi.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 xixi.txt
[root@git-lab moon]# git status -s

# 恢复从版本库中被删除的文件
[root@git-lab moon]# ls
README.md

# 查看操作日志
[root@git-lab moon]# git log
commit 0d43c0499cbc7dad760cded2f7e8708763959e10 (HEAD -> master)
Author: moon <moon@sun.org>
Date:   Thu Oct 17 22:47:46 2024 +0800

    delete xixi.txt

commit b1a6ad57391d08a2b62ed225a600ebc339918b3c
Author: moon <moon@sun.org>
Date:   Thu Oct 17 22:45:52 2024 +0800

    add xixi.txt

# 查看提交动作
[root@git-lab moon]# git reflog
0d43c04 (HEAD -> master) HEAD@{0}: commit: delete xixi.txt
b1a6ad5 HEAD@{1}: commit: add xixi.txt

# 版本回退到删除之前
[root@git-lab moon]# git reset --hard b1a6ad5
HEAD is now at b1a6ad5 add xixi.txt
[root@git-lab moon]# ls
README.md  xixi.txt

Git 对文件的忽略

# 制造临时文件
[root@git-lab moon]# mkdir dir1/
[root@git-lab moon]# touch dir1/.file1
[root@git-lab moon]# git status -s
?? dir1/
[root@git-lab moon]# touch .file2
[root@git-lab moon]# git status -s
?? .file2
?? dir1/

# 忽略临时文件
[root@git-lab moon]# echo .file2 > .gitignore
[root@git-lab moon]# git status -s
?? .gitignore
?? dir1/

# 忽略所有临时文件
[root@git-lab moon]# echo ".*" > .gitignore
[root@git-lab moon]# git status -s

GitLab 代码仓库

GitLab 简介

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

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

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

GitLab 部署

GitLab 安装
# 需要配置好软件仓库来解决依赖性
[root@git-lab ~]# dnf install gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm -y
GitLab 配置
# 修改配置文件
[root@git-lab gitlab]# cd /etc/gitlab/
[root@git-lab gitlab]# vim gitlab.rb
32 external_url 'http://172.25.254.30'

# 使配置文件生效,执行命令后,所有组件会全部启动
[root@git-lab gitlab]# gitlab-ctl reconfigure
[root@git-lab gitlab]# gitlab-ctl start
登录 GitLab
# 查看原始密码
[root@git-lab gitlab]# cat /etc/gitlab/initial_root_password
...
Password: kYTGDR87E7M8huI8XlP5iCvS/E1Js9fxflynEAbswB8=
...

全部启动完后,浏览器访问 172.25.254.30

在这里插入图片描述

修改语言

在这里插入图片描述

设置密码

在这里插入图片描述

GitLab 新建项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

GitLab 免密

# 生成 sshd 密钥
[root@git-lab gitlab]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:ZKB0yDh129j0P31nyY6PFT3Zbg6kzhsc7CgiXAhY9xg root@git-lab.org

[root@git-lab ~]# cat .ssh/id_rsa.pub
  • 上传公钥到 GitLab 中

在这里插入图片描述

在这里插入图片描述

  • 下载项目
[root@git-lab ~]# git clone git@172.25.254.30:root/moon.git
Cloning into 'moon'...
The authenticity of host '172.25.254.30 (172.25.254.30)' can't be established.
ED25519 key fingerprint is SHA256:U0hFIgXLqPoe7AieCnzozWPXLhV28DipqCl96AIsIl0.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.25.254.30' (ED25519) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (3/3), done.

[root@git-lab moon]# ls
README.md
[root@git-lab moon]# git remote -v
# 列出当前仓库中已配置的远程仓库,并显示它们的 URL
origin  git@172.25.254.30:root/moon.git (fetch)
origin  git@172.25.254.30:root/moon.git (push)

GitLab 文件提交

# 文件提交
[root@git-lab moon]# echo "hello world!" > sun
[root@git-lab moon]# git add sun
[root@git-lab moon]# git commit -m "add sun"
[main aaca196] add sun
 1 file changed, 1 insertion(+)
 create mode 100644 sun
[root@git-lab moon]# git push -u origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 268 bytes | 268.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 172.25.254.30:root/moon.git
   8e75d31..aaca196  main -> main
branch 'main' set up to track 'origin/main'.

在这里插入图片描述


Jenkins

可以部署在新的虚拟机(推荐)

也可以在旧的虚拟机上部署

# 安装依赖包
[root@k8s-master ~]# dnf install fontconfig java-17-openjdk git -y
# 安装Jenkins
[root@k8s-master ~]# dnf install jenkins-2.462.2-1.1.noarch.rpm -y
# 启动Jenkins
[root@k8s-master ~]# systemctl enable --now jenkins.service
# 查看原始密码
[root@k8s-master ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

在这里插入图片描述

正常安装(比较久)

在这里插入图片描述

# 当有插件包时
[root@k8s-master ~]# systemctl stop jenkins.service
[root@k8s-master ~]# rm -rf /var/lib/jenkins/*
[root@k8s-master ~]# tar zxf /root/plugins.tar.gz -C /var/lib/jenkins/
[root@k8s-master ~]# systemctl start jenkins.service
# 确保插件被 jenkins 识别(实在识别不到 就老老实实下载了)
[root@k8s-master ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

此时再次访问,即跳过插件下载安装过程

在这里插入图片描述

在这里插入图片描述

[!note]

频繁使用命令查看密码 不方便 建议修改 admin 的密码

Jenkins 与 Gitlab 结合使用

在这里插入图片描述

在这里插入图片描述

添加私钥后,刷新页面 报错消失

在这里插入图片描述

在这里插入图片描述

[root@myjenkins ~]# cat /root/.ssh/id_rsa

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

非红叉 即成功

在这里插入图片描述