目录
一、CICD是什么
CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)
1、持续集成
持续集成是一种软件开发实践,团队成员频繁地将他们的工作集成到共享的代码仓库中。其主要特点包括:
-
频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态。
-
自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等。
-
快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题。
2、持续部署
持续部署是在持续集成的基础上,将通过所有测试的代码自动部署到生产环境中。其特点如下:
-
自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预。
-
高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户。
-
风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性。
3、持续交付
持续交付与持续部署类似,但不一定自动部署到生产环境,而是随时可以部署。其重点在于确保软件随时处于可发布状态。
CI/CD 的好处包括:
-
提高开发效率:减少手动操作和等待时间,加快开发周期。
-
尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决。
-
降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性。
-
增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率。
常见的 CI/CD 工具包括 Jenkins、GitLab CI/CD、Travis CI 等。这些工具可以帮助团队实现自动化的构建、测试和部署流程。
二、git工具使用
1、git简介
Git 是一个分布式版本控制系统,被广泛用于软件开发中,以管理代码的版本和变更。 主要特点:
-
分布式
-
每个开发者都有完整的代码仓库副本,这使得开发者可以在离线状态下进行工作,并且在网络出现问题时也不会影响开发。
-
即使中央服务器出现故障,开发者仍然可以在本地进行开发和查看项目历史。
-
-
高效的分支管理
-
Git 中的分支创建和切换非常快速和简单。开发人员可以轻松地创建新的分支来进行新功能的开发或修复 bug,而不会影响主分支。
-
合并分支也相对容易,可以使用多种合并策略来满足不同的需求。
-
-
快速的版本回退
-
如果发现某个版本存在问题,可以快速回退到之前的版本。
-
可以查看每个版本的详细变更记录,方便了解代码的演进过程。
-
-
强大的提交管理
-
每个提交都有一个唯一的标识符,可以方便地引用和查看特定的提交。
-
提交可以包含详细的提交信息,描述本次提交的更改内容。
-
-
支持协作开发
-
开发者可以将自己的更改推送到远程仓库,供其他开发者拉取和合并。
-
可以处理多个开发者同时对同一文件进行修改的情况,通过合并冲突解决机制来确保代码的完整性。
-
Git必看秘籍:Git - Book
2、git工作流程
Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
-
已修改表示修改了文件,但还没保存到数据库中。
-
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
-
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
三、部署git
1、安装git
[root@CICD-node1 ~]# dnf install git -y
#设定命令补全功能
[root@CICD-node1 ~]# echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc
[root@CICD-node1 ~]# source ~/.bashrc
2、初始化
获取 Git 仓库通常有两种方式:
-
将尚未进行版本控制的本地目录转换为 Git 仓库。
-
从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone
初始化版本库
[root@CICD-node1 ~]# mkdir zx
[root@CICD-node1 ~]# cd zx/
[root@CICD-node1 zx]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /root/zx/.git/
[root@CICD-node1 zx]# ls -a
. .. .git
[root@CICD-node1 zx]# ls .git/
branches config description HEAD hooks info objects refs
#设定用户信息
[root@CICD-node1 zx]# git config --global user.name "zx"
[root@CICD-node1 zx]# git config --global user.email "zx@zx.org"
[root@CICD-node1 zx]# git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
#简化输出
[root@CICD-node1 zx]# git status -s
四、git的使用方法
1、常用方法
# 添加到暂存区
[root@CICD-node1 zx]# echo zx > README.md
[root@CICD-node1 zx]# git status
On branch master # 位于分支 master
No commits # 尚无提交
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@CICD-node1 zx]# git status -s
?? README.md # ?? 新建文件未添加到版本库
[root@CICD-node1 zx]# git add README.md
[root@CICD-node1 zx]# git status -s
A README.md # A 已添加到暂存区
#提交暂存区的数据
[root@CICD-node1 zx]# git commit -m "add README.md"
[master (root-commit) 9f57726] add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@CICD-node1 zx]# git status -s #无任何显示,标识已经提交到版本库
#再次修改
[root@CICD-node1 zx]# echo "zx" >> README.md
[root@CICD-node1 zx]# git status -s
M README.md #右M 表示文件在工作区被修改
[root@CICD-node1 zx]# git checkout -- README.md #撤销修改
[root@CICD-node1 zx]# cat README.md
zx
#重新修改
[root@CICD-node1 zx]# echo "zxzx" >> README.md
[root@CICD-node1 zx]# git add README.md
[root@CICD-node1 zx]# git status -s
M README.md #左M表示文件已经在版本库中并被跟踪
#从暂存区撤销
[root@CICD-node1 zx]# git restore --staged README.md
[root@CICD-node1 zx]# git status -s
M README.md
#重新修改
[root@CICD-node1 zx]# git add README.md
[root@CICD-node1 zx]# git status -s
M README.md
#更新
[root@CICD-node1 zx]# git commit -m "update v1"
[master 57b4495] update v1
1 file changed, 1 insertion(+)
[root@CICD-node1 zx]# git status -s
#更新文件
[root@CICD-node1 zx]# echo "hello" >> README.md
[root@CICD-node1 zx]# git add README.md
[root@CICD-node1 zx]# echo "hello" >> README.md
[root@CICD-node1 zx]# git status -s
MM README.md # MM表示有一部分在暂存区,还有一部分没有提交
[root@CICD-node1 zx]# git commit -m "update v2" #如果现在提交只能提交在暂存区中的部分
[master 6a871a2] update v2
1 file changed, 1 insertion(+)
[root@CICD-node1 zx]# git status -s
M README.md # 右M还在
#查看已暂存和未暂存的修改变化
[root@CICD-node1 zx]# echo "zzzz" >> README.md
[root@CICD-node1 zx]# git diff
diff --git a/README.md b/README.md
index c145d45..1836c51 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
zx
zxzx
hello
+hello
+zzzz
#跳过使用暂存区,只能在提交过的在版本库中存在的文件使用如果文件状态是“??”不能用此方法
[root@CICD-node1 zx]# git commit -a -m "update v3"
[master 5ed696e] update v3
1 file changed, 2 insertions(+)
#撤销工作区中删除动作
[root@CICD-node1 zx]# touch zx.txt
[root@CICD-node1 zx]# git add zx.txt
[root@CICD-node1 zx]# git commit -m "add zx.txt"
[master 3354b59] add zx.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 zx.txt
[root@CICD-node1 zx]# git status -s #右D表示文件在工作区被删除
D zx.txt
#从版本库中删除文件
[root@CICD-node1 zx]# git checkout -- zx.txt
[root@CICD-node1 zx]# ls
README.md zx.txt
[root@CICD-node1 zx]#
[root@CICD-node1 zx]# git rm zx.txt
rm 'zx.txt'
[root@CICD-node1 zx]# git status -s
D zx.txt #左D表示文件删除动作被提交到暂存区
[root@CICD-node1 zx]# git commit -m "delete zx.txt"
[master 41444d6] delete zx.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 zx.txt
[root@CICD-node1 zx]# git status -s
[root@CICD-node1 zx]# git log #查看操作日志
commit 41444d6364aae2c205d0e18317648463f706ae51 (HEAD -> master)
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:20:28 2024 +0800
delete zx.txt
commit 3354b5968f0fb32dae127cb0919dcdd4149d1488
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:19:16 2024 +0800
add zx.txt
commit 5ed696ecf662832e94231d7dd54f2d214a495284
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:18:52 2024 +0800
update v3
commit 6a871a24cc85e4511395feccfaa0c1e8a5c5bfb6
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:18:05 2024 +0800
update v2
commit 57b4495cb69bb6625a681b2be877fad35680d324
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:17:07 2024 +0800
update v1
commit 9f577262c63818ff3abf7bbca41f192163ec13b2
Author: zx <zx@zx.org>
Date: Sun Sep 22 08:14:50 2024 +0800
add README.md
[root@CICD-node1 zx]#
[root@CICD-node1 zx]# git reflog #查看提交动作
41444d6 (HEAD -> master) HEAD@{0}: commit: delete zx.txt
3354b59 HEAD@{1}: commit: add zx.txt
5ed696e HEAD@{2}: commit: update v3
6a871a2 HEAD@{3}: commit: update v2
57b4495 HEAD@{4}: commit: update v1
9f57726 HEAD@{5}: commit (initial): add README.md
#版本回退到之前
[root@CICD-node1 zx]# git reset --hard 9f57726
HEAD is now at 9f57726 add README.md
[root@CICD-node1 zx]# ls
README.md
2、gitlab对于文件如何忽略
在做软件开发时对源码编译会产生一些临时文件,我们在提交时需要忽略这些临时文件
[root@CICD-node1 zx]# mkdir dir1/
[root@CICD-node1 zx]# touch dir1/.file1
[root@CICD-node1 zx]# touch .file1
[root@CICD-node1 zx]# git status -s
?? .file1
?? dir1/
[root@CICD-node1 zx]# echo .file1 > .gitignore
[root@CICD-node1 zx]# git status -s
?? .gitignore
[root@CICD-node1 zx]# echo ".*" > .gitignore
[root@CICD-node1 zx]# git status -s
五、gitlab代码仓库
1、gitlab简介
-
GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。
-
GitLab 具有很多功能,比如代码托管、持续集成和持续部署(CI/CD)、问题跟踪、合并请求管理等。它可以帮助开发团队更好地协作开发软件项目,提高开发效率和代码质量。
官网:https://about.gitlab.com/install/
中文站点: GitLab下载安装_GitLab安装和配置_GitLab最新中文官网免费版下载-极狐GitLab
官方包地址:gitlab/gitlab-ce - Packages · packages.gitlab.com
2、gitlab的部署实施
(1)部署gitlab
部署gitlab需要内存大于4G
[root@CICD-node1 ~]# yum install -y curl openssh-server perl
[root@CICD-node1 ~]# yum install -y policycoreutils-python-utils.noarch
[root@CICD-node1 ~]# dnf install gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm -y
(2)配置gitlab
[root@CICD-node1 ~]# cd /etc/gitlab/
[root@CICD-node1 gitlab]# ls
gitlab.rb
[root@CICD-node1 gitlab]# vim gitlab.rb # 修改external_url 'http://172.25.254.150'
[root@CICD-node1 gitlab]# gitlab-ctl reconfigure
(3)登录gitlab
用户名默认为 root
。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password
文件中, 查看随机密码并使用 root
用户名登录。
注意:出于安全原因,24 小时后,
/etc/gitlab/initial_root_password
会被第一次gitlab-ctl reconfigure
自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。
#查看原始密码
[root@CICD-node1 gitlab]# cat /etc/gitlab/initial_root_password
……
Password: 1uZff3U3X4I41SRhDP6RAdxhLCz93F4cphpHh0pori4=
……
3、在gitlab中新建项目
生成并上传公钥到gitlab中
[root@CICD-node1 ~]# 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:H4R3eiuRlJTsjxnZLPk/86KLO30XhPp5OJj4q/IHBzE root@CICD-node1.zx.org
The key's randomart image is:
+---[RSA 3072]----+
| ... |
| Eo. |
| ..B=. . |
| =*+o. . |
| S *Bo . |
| oo*o. . |
| *.=.o .|
| . ..*.=*..|
| oo*=++o*.|
+----[SHA256]-----+
[root@CICD-node1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2ixQrELvAqqY0jxQxEf1nSonzNPoJvzkEBXA1wyd79ZENToc0+7yFpiMpQU0sSFIZTinNW+ZZ3duYeTIk2yLpNXk1Lh6l8nimbceJYwdWVX+oAnkYpJb5i6ljdlRi/BB8jBk8UWgU/LUK0fjFk3M1x9UVJ978qwv1IsAI3O75Cd5VriVJQjSzL2y/56gMTMr2Yw7faipUeczXP1qlL/aEQ01eThtvy9Weoioj4lTqkXMzO7KRCAS9cEwG3rAqODFSW+SE7zw/QtYySSWT2IvlEB/ErqQVqTN5Mtsr0zGVlpOcYapCd021GUSn0GRSaZ4eNThK1Bmc1vpqQRrtKfH5qMWi9/+UVSBYxKwQ1eiAhw9jufJvZ7rMWvs/gWx/UGyoGQoI0ebbAvb1Ja7EgGkfWKomnrssvU9vQ4CJfrWtRPozLHpjHM+M8r4SOiXqWcIUTDsShdEotH3/vWnTRdDRB5IJx4w5LCE4/vGsktfR3xZMaBF5EytcSZniwqUN8Uk= root@CICD-node1.zx.org
下载项目
[root@CICD-node1 ~]# rm -rf zx/
[root@CICD-node1 ~]# ls
anaconda-ks.cfg Documents gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm Pictures Templates zuoyedir
Desktop Downloads Music Public Videos
[root@CICD-node1 ~]# git clone git@172.25.254.150:root/zx.git
Cloning into 'zx'...
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@CICD-node1 ~]#
[root@CICD-node1 ~]# ls -R
.:
anaconda-ks.cfg Documents gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm Pictures Templates zuoyedir
Desktop Downloads Music Public Videos zx
./Desktop:
./Documents:
./Downloads:
./Music:
./Pictures:
./Public:
./Templates:
./Videos:
./zuoyedir:
zuoyedir
./zuoyedir/zuoyedir:
./zx:
README.md
[root@CICD-node1 ~]# cd zx/
[root@CICD-node1 zx]# ls
README.md
[root@CICD-node1 zx]# git remote -v
origin git@172.25.254.150:root/zx.git (fetch)
origin git@172.25.254.150:root/zx.git (push)
[root@CICD-node1 zx]# echo zx > zx
[root@CICD-node1 zx]# git add zx
[root@CICD-node1 zx]# git commit -m "add zx"
[main ae5f020] add zx
1 file changed, 1 insertion(+)
create mode 100644 zx
[root@CICD-node1 zx]# git push -u origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 253 bytes | 126.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 172.25.254.150:root/zx.git
681c466..ae5f020 main -> main
branch 'main' set up to track 'origin/main'.
六、Jenkins
1、Jenkins简介
-
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
-
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行
CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中
2、部署Jenkins
软件下载:Download and deploy
jenkins需要部署在新的虚拟机中
[root@CICD-node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.150 CICD-node1.zx.org
172.25.254.160 jenkins.zx.org
[root@jenkins ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.160 jenkins.zx.org
172.25.254.150 CICD-node1.zx.org
#安装依赖包
[root@jenkins ~]# yum install fontconfig java-17-openjdk git -y
#安装jenkins
[root@jenkins ~]# dnf install jenkins-2.462.2-1.1.noarch.rpm -y
#启动jenkins
[root@jenkins ~]# systemctl enable --now jenkins.service
#查看原始密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
e7e65728b64d46638bd5ccdefaaa6291
# 当插件加载下载失败(因网络环境问题)
[root@jenkins ~]# systemctl stop jenkins.service
[root@jenkins ~]# rm -rf /var/lib/jenkins/*
[root@jenkins ~]# systemctl start jenkins.service
# 若出现超时的错误,则增加超时时长
[root@jenkins ~]# vim /usr/lib/systemd/system/jenkins.service # TimeoutStartSec=600
[root@jenkins ~]# systemctl daemon-reload
[root@jenkins ~]# systemctl start jenkins.service
[root@jenkins ~]# cd /var/lib/jenkins/
[root@jenkins jenkins]# rm -rf plugins/
[root@jenkins jenkins]# tar zxf /root/plugins.tar.gz
[root@jenkins plugins]# cat /var/lib/jenkins/secrets/initialAdminPassword
ae5e27439d254a58b289a8961d400074
[root@jenkins ~]# systemctl restart jenkins.service
更改密码(admin)
3、Jenkins与gitlab的整合
添加ssh密钥
上传公钥
[root@jenkins jenkins]# cd
[root@jenkins ~]# 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:UL/va/TFHH57ASgghxHwBCgppmQH9rI+ub6c9VKgrR4 root@jenkins.zx.org
The key's randomart image is:
+---[RSA 3072]----+
| +ooo++ . |
|==..oo + . |
|B... .+ . . . |
|. o. . . o . . |
| .o . S o oo.|
|.... . .. o=|
| E... ... .+|
|..*.. .. ...|
|oB. .. .o. .|
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDEGl6+UHeYahTBMWATLhHiGEJy8MMoXdb6KF8crvJ/j3w5UcTemEot38ijX9QX7khSLeYdIsNtmxvxORtXrT7kzOXxe8op/cZR9k3ZGHICmLwlYXSF1lx/XhEWL5/f8O3+zcPDWCIOBs7SWeg0FHari/GlIARaJf+hdzMuGeE/+04J59In0UoCc0f3sp0NH3Oepi1XT57tpQL8Fiv4QKgt72/a4WJzNbJO/0vq9ynbobkGyo3I6E3/DO1kqsTiBkxhdA7zn4+hyfP+SRMc+F4Sdpj1uD9icxNNKTHeBoJMDdkr/hXyWqFiuUzZAFsjQrGJk86qRM+lxmoYY0hoYaIN1k85wfIHCwF5lds1ZwjFAFWmw1vtp/lChHMUqux0UwtZVghHUL2MX5frta3VxN386PL9Fn1LYnvPuQzClpS8Jn7T4sTHZ+gcEkdQ7GRCG3DWXnKnaRWSbINGTH0bHyWETs6ontkBBEDFHdRmXLFmrmYvoRAog41ZbxTjzGnbyg0= root@jenkins.zx.org
上传私钥
# 私钥
[root@jenkins ~]# cd .ssh/
[root@jenkins .ssh]# cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
ssh首次连接主机取消签名认证
[root@jenkins ~]# vim /etc/ssh/ssh_config
20 Host *
21 StrictHostKeyChecking no