跳到主要内容DevOps、Git 与 GitLab 核心概念及实践 | 极客日志Shell / Bashjava
DevOps、Git 与 GitLab 核心概念及实践
综述由AI生成DevOps 流水线模型及相关平台(项目管理、代码托管、持续交付、运维)。详细阐述了 CI/CD 流程演变、版本控制系统(VCS)的核心功能。重点讲解了 Git 的基本概念(工作区、暂存区、本地/远程仓库)、常用命令(安装、配置、提交、分支、回滚、标签)以及私有仓库 GitLab 的安装、配置、HTTPS 设置、备份恢复和密码重置方法。通过实际案例演示了从本地开发到云端推送的完整协作流程。
黑客帝国27 浏览 一、DevOps
DevOps 流水线模型

DevOps 涉及的四大相关平台:
- 项目管理:如 Jira, 禅道
- 代码托管:如 Gitlab, SVN
- 持续交付:如 Jenkins, Gitlab CI
- 运维平台:如腾讯蓝鲸,Spug 等
二、持续集成、持续交付和持续部署 (CI/CD)

持续交付:目标是拥有一个可随时部署到生产环境的代码库。
持续部署:可以自动将应用发布到生产环境。
(一)CI/CD 流程过程和架构
- 开发人员自行手动上传构建并部署代码:早期项目,没有专业的运维人员,运维的工作由开发兼职完成,项目发布很不专业,很容易出错,也是最原始的方式。
- 开发人员先将代码发给运维,再由运维人员手动上传至生产环境:专业的运维人员完成应用的部署,每次项目发布都由运维人员一步一步手动实现,效率低下且容易出错。
- 运维利用脚本和自动化运维工具实现部署:由运维人员编写 Shell, Python 等脚本或利用自动化运维工具,如 Ansible 等实现半自动化应用部署,效率很高,但对技术专业性有较高要求。
- 通过 Web 等 GUI 界面实现一键自动化部署:可以通过开源或自研的运维平台实现方便的应用部署,操作容易,效率高,但需要提前构建运维平台,比如,Jenkins 等。
(二)版本控制系统 (VCS)
是用于追踪、管理文件 / 代码的修改历史、实现多人协作开发、保障数据完整性的核心工具,核心解决「版本混乱、协作冲突、代码丢失、追溯无据」四大问题。从单人开发到大型团队协作均能适配,其核心功能可分为基础核心功能、分支协作功能、团队管理功能、实用辅助功能四大类。
通用且核心的功能总结:
- 版本追踪与快照:记录文件的每一次修改(增 / 删 / 改),为每次有效修改生成唯一版本号 / 提交 ID,同时保存修改的作者、时间、修改内容,形成完整的版本历史链;部分 VCS(如 Git)会为项目生成版本快照,记录整个项目在某一时刻的完整状态。
- 修改备注与溯源:要求每次提交修改时填写提交说明(备注改了什么、为什么改),结合版本历史链,可快速追溯任意版本的修改背景。
- 回滚与恢复:当代码出现 bug、误修改 / 误删除,或新功能开发失败时,可一键回滚到项目任意稳定版本。
- 本地备份与数据保护:本地 VCS 会在本地生成版本库,集中式 / 分布式 VCS 会将版本数据同步到服务端 / 远程仓库,即使本地文件丢失、设备损坏,也能从版本库 / 远程仓库中完整恢复项目所有历史版本。
(三)常见的版本控制系统

最初是这两个,后面就演化出了熟悉的 GitHub 等。
(四)常见的软件部署模式
1. 蓝绿部署 (Blue-green Deployments)
- 核心原理:维护两套完全相同的生产环境(蓝环境 = 旧版本,绿环境 = 新版本)。先在绿环境部署新版本并验证,确认无误后,通过流量切换(如 DNS、负载均衡)将所有用户流量一次性切到绿环境。如果出现问题,可瞬间切回蓝环境。
- 适用场景:需要零停机发布、对服务可用性要求极高的场景,适合中小型服务或状态无依赖的应用。
- 优点:发布与回滚都非常迅速,用户无感知;新旧版本完全隔离,风险可控。
- 缺点:需要双倍的服务器资源,成本较高;对环境一致性要求高,若涉及数据库等有状态组件,数据同步会比较复杂。
2. 金丝雀(灰度)发布 (Canary Deployment)
- 核心原理:先将新版本推送给一小部分用户(比如 1%–5%),验证新版本的稳定性和性能。如果无异常,再逐步扩大用户比例(如 10%→30%→100%),直到全量用户切换到新版本。
- 适用场景:大型服务、用户量较大的场景,希望逐步验证风险,避免全量发布故障影响所有用户。
- 优点:风险可控,问题仅影响小范围用户;无需额外的完整环境,资源成本较低。
- 缺点:发布周期较长;需要流量分割和用户分组能力。
3. 滚动发布 (Rolling Deployment)
- 核心原理:按批次逐步替换旧版本的服务器实例。例如,将 10 台服务器分成 3 批,先更新 2 台,验证无误后再更新 3 台,最后更新剩余 5 台,直到所有实例都切换到新版本。
- 适用场景:资源有限、无法支撑蓝绿部署的场景,适合无状态或状态可平滑迁移的服务。
- 优点:无需额外资源,成本低;发布过程平稳,对用户影响较小。
- 缺点:发布过程中存在新旧版本共存的情况,可能引发兼容性问题;回滚速度较慢。
4. A/B 测试 (A/B Testing)
- 核心原理:并非传统意义上的'发布',而是同时运行两个或多个版本(A 版和 B 版),给不同用户群体展示不同版本,通过收集用户行为数据来对比效果。
- 适用场景:产品功能迭代、UI 优化、营销策略验证等,需要基于数据做决策的场景。
- 优点:可以量化不同版本的效果,驱动数据化决策;风险低,仅影响测试用户。
- 缺点:需要专业的流量分流和数据埋点能力。
三、Git 相关概念和原理
- 工作区 (Workspace):当前正在编辑和修改文件的地方。通常是项目目录。工作区中的文件变更不受 Git 跟踪和管理,无法实现版本回滚等功能。需要将工作的变更,通过
git add 命令加入暂存区后,才可纳入 Git 的版本管理控制的范畴。
- 暂存区 (Staging Area/Index/Cached):也称为索引区,缓存区,用于存储在工作区中对代码进行修改后的文件所保存的地方。只有放入此区的文件才能被 git 进行管理,使用
git add 添加。当变更累积到一定阶段,希望生成里程碑式的结果时,会使用 commit,将暂存区的变更一次性的批量提交到本地仓库。
- 本地仓库 (Local Repository):用于存储在工作区和暂存区中改过并提交的文件地方,使用
git commit 提交。每一次 commit 会生成一个唯一的 ID,通常用于表示一个阶段性的新的版本。checkout 命令执行了同 commit 命令相反的操作,它将版本中存储的 commit 所代表着的某个版本恢复至工作区中。
- 远程仓库 (Remote Repository):多个开发人员共同协作提交代码的仓库,即私有 GitLab 服务器或公有云 GitHub, Gitee 网站等。利用远程仓库,可以实现异地备份和远程协作。
(一)Linux 安装 Git,常见命令
1. 包安装
2. 常见命令
(二)Git 案例
1. 创建项目并初始化配置
mkdir myapp
cd myapp/
git init
ls -a . .. .git
设置 git,提交 commit 之前需要先配置 git 的基本信息
选项--system 表示针对所有用户的配置,保存在/etc/gitconfig 文件中
选项--global 表示当前用户环境,保存在~/.gitconfig 文件中,推荐使用
选项--local 表示只针对当前目录 (项目) 的配置,保存在当前目录的.git/config 文件中,此为默认值,可省略
优先级: local > global > system
git config --global user.name lty
git config --global user.email [email protected]
git config -l
2. 添加暂存区并提交数据
cat hello.java
hello.world v1.0
git add hello.java
git status
git ls-files hello.java
git add .
git commit -m 'v3.0'
以上两个命令可以通过以下命令实现,但是必须是已经提交过的不是新的文件。
cat hello.java
hello.world v4.0
git commit -am 'v4.0'
3. 设置忽略文件
cat .gitignore
/bin /target .classpath .project .settings *.h !test.h *.py[c|x]
4. 将文件加入暂存区再取消添加
git add f1.txt
git ls-files f1.txt hello.java
git status
git rm --cached f1.txt
git restore --staged f1.txt
git status
git ls-files hello.java
5. 利用暂存区恢复误删除的工作区文件
touch test.txt
git add .
git ls-files
git status
rm -f test.txt
ls
git restore test.txt
git checkout test.txt
ls
6. 同时删除工作区和暂存区
7. 回滚工作区的文件为暂存区中版本
echo v1 > f1.txt
git status
git add .
echo v2 > f1.txt
git status
git checkout -- f1.txt
cat f1.txt
8. 多次提交后回滚至指定提交的版本
(1)git reset
--soft:工作目录和暂存区都不会被改变,只是本地仓库中的文件回滚到指定的版本,仅移动 HEAD 和 master 指针的指向。
--mixed:默认选项。回滚暂存区和本地仓库,但工作目录不受影响。
--hard:本地仓库,暂存区和工作目录都回滚到指定的提交,该选项非常危险。
(2)git revert
相比上一个可以保留历史,从内容来说确实回退了但是从逻辑来说是一个新的文件上传了。
git revert HEAD
git revert HEAD --no-edit
git revert HEAD^
git revert <commitid>
9. 创建分支和合并分支
git checkout dev
git checkout -b dev
(1)快进式合并:切换分支至 dev 分支,此分支为被合并的目标分支
三路合并:平行分支中因为不同分支中同一个文件内容不同,会出现冲突,需要手动解决冲突,并重新 add 和 commit。
(2)修改分支名称
git branch dev * master
git checkout dev
git branch -M devel
git branch
10. 当前状态打 tag 并利用 tag 回滚
git tag v1.0
git push origin v1.0
git push origin --tags
11. 本地代码提交给公有云仓库码云
git remote add origin https://gitee.com/heyibushuoh/myapp.git
git remote -v
git push -u origin master
四、私有软件仓库 GitLab
(一)安装下载
apt install ./gitlab-ce_18.6.4-ce.0_amd64.deb
vim /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure
cat /etc/gitlab/initial_root_password
(二)软件管理
改语言、取消注册权限、邀请成员等操作。
可以对默认仓库改名重设,推送内容和标签进仓库。
git remote rename origin old-origin
git remote add origin http://gitlab.lty.com/lty/devops.git
vim /etc/hosts
git push --set-upstream origin --all
git push --set-upstream origin --tags
git clone http://gitlab.lty.org/lty/devops.git
cd devops/
git tag v1.0 v2.0
git checkout master
git branch main
git checkout devel
git branch
vim test.txt
git commit -am test.txt
git push --all
1. 使用 SSH 连接
将 .ssh 目录下的 id_ed25519.pub 公钥文件内容复制到某个账号的这里,那么这台主机就和这个账号关联到一起了。
2. 其他仓库上传到本仓库
(三)GitLab 的数据备份和恢复
备份配置文件命令;本地备份了最好把这个文件放到远程服务器上做备份。
gitlab-ctl backup-etc
ls /etc/gitlab/config_backup/
tar tvf /etc/gitlab/config_backup/gitlab_config_1770088913_2026_02_03.tar
1. 手动备份数据文件
gitlab-backup create
vim /etc/gitlab/gitlab.rb
2. 执行恢复
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
恢复时指定备份文件的时间部分,不需要指定文件的全名:
gitlab-backup restore BACKUP=1770089118_2026_02_03_18.6.4
gitlab-ctl reconfigure
gitlab-ctl restart
(四)实现 Https
mkdir -p /etc/gitlab/ssl && cd /etc/gitlab/ssl
openssl genrsa -out gitlab.lty.org.key 2048
openssl req -days 3650 -x509 ...
vim /etc/gitlab/gitlab.rb
external_url "https://gitlab.wang.org"
nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] ="/etc/gitlab/ssl/gitlab.wang.org.crt"
nginx['ssl_certificate_key'] ="/etc/gitlab/ssl/gitlab.wang.org.key"
...
gitlab-ctl reconfigure
git clone http://gitlab.lty.org/devops/myai.git
fatal:无法访问'http://gitlab.lty.org/ devops/myai.git/ ': server certificate verification failed.CAfile: none CRLfile: none
在使用 git 客户端的主机上信任自签名证书,把证书文件给想克隆仓库文件的主机,再把证书文件内容追加到 /etc/ssl/certs/ca-certificates.crt 文件的最后。
scp gitlab-server:/etc/gitlab/ssl/gitlab.lty.org.crt .
cat gitlab.lty.org.crt >> /etc/ssl/certs/ca-certificates.crt
红帽系统证书路径 /etc/pki/tls/certs/ca-bundle.crt。
(五)重置 GitLab 忘记的密码
gitlab-rails console -e production
User.find_by_username 'root'
user.password="L!@#$%^l"
user.password_confirmation="L!@#$%^l"
user.save
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online