文章目录
DevOps
代码发布流程概述

CI-CD-DevOps

CI-CD
CI持续集成:开发的代码集成到代码仓库
CD持续交付:从代码仓库拉取代码部署到测试环境
CD持续部署:从代码仓库拉取代码部署到生产环境
DevOps-DevSecOps
DevOps: 理念让开发人员可以持续集成,运维人员可以持续交付和持续部署,让整个开发过程自动部署,上线...
- 开发写完的代码自动集成,自动交付与部署。本质是自动化。
- DevOps 是一套快速、频繁、可靠的软件交付实践。
DevOps
- Development 开发
- Operations 运维
DevOPS 目标是解决 开发书写代码,集成,交付,部署进度,审核缓慢.
DevOPS 实现
- 开发 (存放收集代码 CI): git/gitlab/github/gitee (代码平台)
- 安全:sonarqube ...(很多)
- 运维 (部署代码 CD): jenkins,argo,maven ... 插件 ...sonarqube (运维)
DevSecOps
- Dev 开发
- Sec Secure 安全
- Ops 运维


什么是环境
- 开发环境
- 测试环境
- 预发布环境/准生产环境/预生产环境
- 生产环境
- 谁部署,谁维护/负责

| 准生产环境/预生产环境 | 生产环境 | |
|---|---|---|
| 相同点 | 存放代码,服务配置与生产环境一致 | 存放代码 |
| 区别 | 服务器的配置可以低一些,数量少一些,甚至省钱可以用内部测试环境兼职 | |
| 关于数据库 | 连接生产环境数据库(从库),nginx镜像流量(alb镜像流量) |
Git和版本控制
关于版本控制
-
版本控制系统 ,又叫修订控制或源控制系统,是一种软件实用程序,用于跟踪和管理对文件系统的更改
-
VCS 还提供协作功能,用于与其他 VCS 用户共享和集成这些对文件系统的更改
-
常见的软件行业 VCS 的实现包括 Git、Mercurial 和 SVN 等
带来的好处
解决冲突
-
在团队驱动型软件项目的生命周期中,很可能有多位团队成员需要同时对同一个源代码文件进行更改
-
VCS能跟踪多位开发人员之间的冲突并帮助解决这些冲突,并将操作过程记入审计跟踪记录,形成变更历史
回滚和撤消对源代码的更改
-
VCS会记录其管控的源代码的变更历史,并支持"撤消"变更或回滚到此前的记录的某个历史状态
-
如果在已上线的应用中发现缺陷,代码可以快速恢复到已知的稳定版本
异地源代码备份
-
使用 VCS 时,需要创建一个 VCS 的远程实例,以在开发人员之间共享更改
-
这个远程 VCS 实例可以由值得信赖的第三方(如GitHub)进行异地托管;然后,它就会成为安全的异地备份;
版本控制软件对比

| Git | SVN | |
|---|---|---|
| 共同点 | 存放代码,版本控制 | 存放代码,版本控制 |
| 工作模式 | 分布式架构(git代码仓库挂了,本地的代码仍旧可以使用) | CS架构,中心化(权限集中) |
| 分支 | 创建和维护分支方便 | 创建和维护分支繁琐 |
Git
Git简介
Git是分布式版本控制系统(Version Control System,VCS)的一种实现,由Linux之父Linus Torvalds于2005年创建
数据仓库 (Repository) 是记录文件或目录状态的地方,存储着内容修改的历史记录
-
远程数据库: 配有专用的服务器,为了多人共享而建立的数据库
-
本地数据库: 为了方便用户个人使用,在自己的机器上配置的数据库
Git基础概念(1)
Git将管控的源代码置于一个目录中,目录名即为项目名称,因而该目录即为项目的"根(起始位置)
Git在其项目目录中会为版本控制机制划分出工作区、暂存区和版本库三个空间
工作区(working directory)
-
◆项目目录内部的空间即为工作区
-
◆项目目录内部还会存在一个隐藏的子目录".git",这个子目录就是暂存区和版本库的存放位置
暂存区(staging area)
-
◆暂存区git开始跟踪和保存文件中发生的更改的地方
-
◆用户在工作区做出一些更改后,可以运行命令(git add)
把这些更改先复制到暂存区中暂存
-
◆暂存区只会记录用户执行暂存命令之前的更改,后来再做的
变更需要再次运行暂存命令完成暂存
版本库(repository)
-
◆暂存区中的更改累积到一定程度后,即可使用命令
(git commit)将这些更改一并提交至版本库中持久保存
-
◆提交(commit)只是一个检查点,用于告诉git将暂存区的内容
同前一次的提交进行比较,并记录下来生成的所有更改
-
◆提交操作完成后,会自动清空暂存区
Git基础概念(2)
Git本地版本控制的基本工作流程
开始使用git时,需要先于项目目录中运行"git init"命令,生成**.git**目录结构,完成版本库初始化
暂存和提交两个步骤是周期类操作,可根据需要重复运行
-
随着用户在工作区编码工作的展开,可随时按需运行"git add"命令将工作区中的更改暂存,该区域通常也称为索引
-
暂存区累积的更改操作,可由用户使用"git commit"命令一次性地提交到版本库中
-
每次提交操作完成后会生成一个反映到提交操作这一该工作区的状态快照,并可拥有名称和标识,即commit name和commit id
每个commit,都可由用户使用"git checkout"命令按需检出
- ◆checkout命令执行了同commit命令相反的操作,它将版本中存储的commit所代表着的工作区状态反映到工作区中
- ◆checkout命令完成后,工作区中的内容与其检出的提交那一刻的状态相同
- 若工作中存储此前未被提交的新文件,这些文件不计入在此刻的状态表示中
- 当然,用户也可以暂存这些新文件,并将带有新文件的工作区提交到版本库中,这将是新的暂存和提交循环
Git命令
git命令文档:https://git-scm.com/docs
安装Git并配置Git
windows安装Git
https://git-scm.com/install/windows
Linux安装Git
https://git-scm.com/install/linux
shell
yum install -y git
配置Git
git配置有三个级别,分别对应三个文件
-
--system:系统级,全系统范围有效,对应文件/etc/gitconfig
-
--global:全局级,当前用户范围有效,对应文件为$HOME/.gitconfig
-
--local:本地级,仅对当前一个项目有效,对应文件为项目目录下的.git/config
shell
#列出已有配置
git config -l
##常用的配置变量
#用户名,提交者
git config --global user.name 'csq'
#用户的邮箱
git config --global user.email '2033717617@qq.com'
#开启语法颜色
git config --global color.ui true
Git使用
从本地版本库开始
启动一个基于git进行版本控制的项目的常用途径有两种
-
本地初始化并创建一个自有项目
-
从某个Git Server上克隆一个项目
从一个空的项目和本地版本库开始
-
创建项目目录并将其切换为当前工作目录
mkdir ~/deploy-demoapp && cd ~/deploy-demoapp
-
初始化本地版本库
git init
-
编写源代码文件,并查看代码跟踪状态
git status
范例:从一个空项目和本地版本库开始
shell
##从一个空的项目和本地版本库开始
#1.创建项目目录(代码目录),并进入代码目录
mkdir -p /app/src/live/
cd /app/src/live/
#2.配置用户
git config --global user.name 'csq'
git config --global user.email '2033717617@qq.com'
git config --global color.ui true
git config --global -l
#3.初始化代码目录
git init
###此时代码目录下会生成一个.git目录
ll -a
#4.书写代码 添加文件
echo "项目完成%80" > index.html
##查看状态 仓库状态
git status
#5.添加代码到暂存区(git add命令也支持使用文件通配符)例如git add *.yaml
git add index.html
##查看状态,仓库状态
git status
#6.提交到本地仓库
git commit -m '项目开始完成%80'
##查看状态
git status
##查看提交的详情
git log -p
git reflog
项目中文件的状态
在git版本库,一个被跟踪的文件可能处于下面三种状态之一
| 核心状态 | 所属区域 | 定义与关键特征 | 典型场景 |
|---|---|---|---|
| Unstaged(未暂存) | 工作区(Working Tree) | 文件已修改,但未通过 git add 暂存,修改仅存在于本地工作目录,未进入 "待提交清单" |
编辑已跟踪的 index.html 后,未执行 git add |
| Staged(已暂存) | 暂存区(Staging Area/Index) | 文件修改已通过 git add 标记,进入 "待提交清单",等待 git commit 同步到本地仓库 |
执行 git add index.html 后,文件等待提交 |
| Committed(已提交) | 本地仓库(Local Repo) | 文件修改通过 git commit 永久保存到 Git 本地数据库(.git 目录),形成版本快照 |
执行 git commit -m "fix: 修改首页样式" 后,修改被记录 |
| 具体状态 | 触发场景 | git status 典型输出 | 核心操作建议 |
|---|---|---|---|
| Unmodified(未修改) | 1. 刚从仓库拉取的文件; 2. 已提交(Committed)后的文件; 3. 暂存后未再修改 | 无特殊提示,仅显示 "nothing to commit, working tree clean" | 无需操作,文件与仓库版本一致 |
| Added(新增) | 新文件通过 git add 暂存,首次纳入跟踪 |
"Changes to be committed: new file: 文件名"(绿色) | 执行 git commit 提交到仓库 |
| Modified(已修改) | 1. 已跟踪文件被编辑但未暂存(Unstaged); 2. 已暂存后又二次修改(Unstaged 与 Staged 并存) | - 未暂存:"Changes not staged for commit: modified: 文件名"(红色)- 已暂存:"Changes to be committed: modified: 文件名"(绿色) | 未暂存:git add 文件名 暂存;已暂存:直接 git commit |
| Deleted(已删除) | 1. 本地删除已跟踪文件但未暂存; 2. 通过 git rm 删除并暂存 |
- 未暂存:"Changes not staged for commit: deleted: 文件名"(红色)- 已暂存:"Changes to be committed: deleted: 文件名"(绿色) | 确认删除:git commit 提交删除记录;撤销删除:git checkout -- 文件名 |
| Renamed(已重命名) | 通过 git mv 旧文件名 新文件名 重命名已跟踪文件 |
"Changes to be committed: renamed: 旧文件名 -> 新文件名"(绿色) | 直接 git commit 提交重命名记录 |
| Copied(已复制) | 复制已跟踪文件生成新文件,并通过 git add 暂存(部分 Git 版本支持) |
"Changes to be committed: copied: 源文件名 -> 复制文件名"(绿色) | 直接 git commit 提交复制记录 |
对比文件的变动
| 命令格式 | 比较对象(核心) | 功能描述 | 适用场景 |
|---|---|---|---|
git diff |
工作区 ↔ 暂存区 | 显示「未暂存」的文件变动(自上次 git add 后,工作区的修改) |
开发中想查看自己没暂存的修改内容 |
git diff --staged 或 git diff --cached |
暂存区 ↔ 上一次提交(HEAD) | 显示「已暂存但未提交」的文件变动 | 提交前检查暂存的修改是否正确,避免提交错误内容 |
git diff <commit-ID> |
工作区 ↔ 指定提交(commit-ID) | 显示工作区与历史某一版本的差异 | 想知道当前代码比历史版本改了什么,或回滚前确认差异 |
git diff --cached <commit-ID> |
暂存区 ↔ 指定提交(commit-ID) | 显示暂存区与历史某一版本的差异 | 暂存后想对比 "待提交的修改" 与历史版本的区别 |
忽略项目中的某些文件
.gitignore 的核心作用是告诉 Git 哪些文件 / 目录不需要纳入版本跟踪,专门过滤临时文件、构建产物、IDE 配置等无关文件,避免仓库体积膨胀和团队协作冲突,完全匹配你提到的核心特性。
| 规则类型 | 语法说明 | 示例 | 作用 |
|---|---|---|---|
| 基础匹配(逐行指定) | 每行对应一个忽略规则,支持「具体文件名」或「glob 通配模式」(模糊匹配) | test.txt(具体文件) *.log(通配) |
忽略单个文件 test.txt、所有 .log 日志文件 |
| glob 通配模式 | *:匹配任意多个字符(不含路径分隔符 /) ?:匹配单个字符 /**/:匹配多级目录 目录/:匹配整个目录(含子目录) |
*.tmp(所有临时文件) node_modules/(前端依赖目录) src/**/*.class(src 下所有层级的 .class 文件) |
批量忽略同类文件 / 目录,无需逐个指定 |
| 叹号取反(排除指定文件) | 用 ! 开头,取消对某文件 / 目录的忽略(需放在被取反规则之后) |
*.txt + !important.txt |
忽略所有 .txt 文件,但保留 important.txt |
| 注释行 | 以 # 开头,仅作说明,Git 会忽略该行内容 |
# 忽略日志文件 # IDEA 配置文件 |
方便团队理解规则含义,不影响功能 |
| 自身需纳入版本跟踪 | .gitignore 是项目核心配置文件,需提交到仓库,让所有团队成员共享规则 | git add .gitignore + git commit -m "feat: 添加.gitignore" |
确保团队所有人的忽略规则一致 |
shell
# 构建产物
dist/
build/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 依赖目录
node_modules/
bower_components/
# 环境变量文件(敏感信息)
.env
.env.local
.env.development.local
# IDE 配置
.idea/
.vscode/
*.suo
*.ntvs*
*.njsproj
*.sln
撤销操作
撤消文件变更(git restore)------ 操作工作区 / 暂存区
| 命令格式 | 核心行为 | 比较对象 | 数据安全性 | 适用场景 |
|---|---|---|---|---|
git restore --stage <pathspec> |
撤消「已暂存」的文件变更(从暂存区放回工作区) | 暂存区 ← 工作区(保留工作区修改) | 安全(不删除任何修改) | 执行 git add 后后悔,想取消暂存 |
git restore <pathspec> |
撤消「已跟踪但未暂存」的文件变更(恢复到暂存区状态) | 工作区 ← 暂存区(覆盖工作区修改) | 中等(工作区未暂存的修改会丢失) | 编辑文件后后悔,想恢复到上次 git add 后的状态 |
git restore -s <source> <pathspec> |
从「指定提交 / 分支」恢复文件(覆盖工作区 / 暂存区) | 工作区 / 暂存区 ← 源提交(source) |
中等(当前修改会被覆盖) | 想恢复文件到历史版本(如前一次提交、指定分支的版本) |
shell
#1.在项目根目录写入一些代码
echo 1 > test.html
#2.添加代码到暂存区
git add test.html
#3.突然发现写的有问题(撤销已暂存)
git restore --staged test.html
撤消提交(git reset)------ 操作本地仓库提交记录
| 选项 | 核心行为(移动指针 + 重置范围) | 数据安全性 | 适用场景 |
|---|---|---|---|
--soft |
仅移动 HEAD 和分支指针到指定提交,不重置暂存区 / 工作区 | 最安全(所有修改都保留) | 想撤消最近的提交,但保留修改(比如提交信息写错,想重新提交) |
--mixed(默认选项) |
移动指针 + 重置暂存区(暂存区与指定提交一致),工作区修改保留 | 安全(仅暂存区重置,工作区不变) | 想撤消提交和暂存,保留工作区修改(比如提交后发现漏改文件,想重新暂存) |
--hard |
移动指针 + 重置暂存区 + 重置工作区(三者与指定提交完全一致) | 极危险(所有未提交的修改会永久丢失) | 确认要彻底丢弃最近的提交和所有修改(需谨慎!) |
shell
#1.在项目根目录写入一些代码
echo 1 > test.html
#2.添加代码到暂存区
git add test.html
#3.突然想删除暂存区提交的内容
###查看本地操作记录
git reflog
git reset --hard 52648a3
Git使用远程仓库
(1)使用远程仓库(将代码上传到Gitee)
推送代码至远程仓库的简明步骤
在某个Git托管服务上注册一个账号
-
GitHub
-
Gitee
(1)从windows上传代码到Gitee,获取windows公钥,添加至Gitee
bash
#1.使用Git BASH 查看windows ssh的公钥
###生成密钥
$ ssh-keygen
###复制公钥到Gitee
$ cat ~/.ssh/id_ed25519.pub


(2)创建仓库


(3)上传代码到远程仓库
shell
#1.Git全局设置
git config --global user.name "csq"
git config --global user.email "16376057+csq5201314@user.noreply.gitee.com"
#2.创建Git仓库
mkdir code
cd code
#3.初始化代码目录
git init
#4.书写代码
echo "live 100%" > live.html
git add live.html
git commit -m 'first commit'
##关联远程仓库,一般默认名称为origin,可以自定义
git remote add gitee git@gitee.com:csq5201314/test.git
##查看关联的远程仓库
git remote -v
##给远程仓库推送代码
git push -u gitee 'master'

(2)使用远程仓库(拉取远程仓库)
远程仓库没有工作区,也不需要工作区
克隆至本地后会自动区分为工作区、暂存区和版本库
shell
#1.将远程仓库克隆到当前目录,远程仓库名称,就是创建仓库或者本地创建项目,仓库/项目名字
git clone git@gitee.com:csq5201314/test.git
(3)使用远程仓库(其他操作)
抓取远程仓库上的变动
命令:git fetch
- 它只会抓取远程仓库中的变动至本地版本库中,但不会修改工作区
拉取远程仓库上的变动
命令:git pull
- 它会拉取远程仓库中的变动至本地版本库中,而且会通过合并(merge)操作修改本地工作区
其它操作
-
重命名远程仓库:git remote rename
-
删除本地仓库上配置的远程仓库:git remote remove
Tags
| 操作类型 | 命令格式 | 核心说明 |
|---|---|---|
| 轻量标签创建 | git tag <tagName> |
创建仅关联 commit 的轻量标签,无额外元数据(本地临时使用) |
| 附注标签创建 | git tag -a <tagName> -m <message> |
创建含打标者信息、时间、说明的完整附注标签(正式版本推荐) |
| 指定 commit 打标 | git tag -a <tagName> -m <message> <commitID> |
给历史提交(需传入 commit 哈希)补打附注标签 |
| 本地标签删除 | git tag -d <tagName> |
删除本地指定标签,不影响远程仓库 |
| 标签列表查看 | git tag -l |
列出所有本地标签(可加模糊匹配,如 git tag -l "v1.*") |
| 标签详情查看 | git show <tagName> |
显示标签关联的 commit 信息、附注标签元数据(作者 / 时间 / 说明)及代码差异 |
| 标签检出 | git checkout <tagName> |
切换到标签对应的版本;注意:会进入分离头指针状态,新提交无分支关联 |
| 推送特定标签 | git push origin <tagName> |
将本地指定标签推送到远程仓库(如 GitLab/GitHub) |
| 推送所有标签 | git push --tags |
批量推送本地所有未同步到远程的标签 |
| 远程标签删除 | git push --delete origin <tagName> |
删除远程仓库上的指定标签(需先删除本地标签 git tag -d <tagName>) |
shell
#1.给刚刚上传的代码传个标签
git tag -a 'v1.0' -m 'test'
#2.上传指定标签
git push gitee v1.0
#3.删除远程仓库的标签
git push --delete gitee v1.0

Branches
分支是 "平行开发空间":以手机拍照功能开发(完成 80%)为例,建 "拍照功能" 分支可隔离未完成代码,既保障代码不丢失,又避免影响他人工作,待开发完成后合并主分支;
默认分支master是主分支,其代码稳定可用、可部署到生产环境;
开发人员通常会创建dev、shopping等分支,分支对应独立功能,待开发测试完成后,需将分支代码合并到主分支。
| 操作类型 | 命令格式 | 示例 | 核心说明 |
|---|---|---|---|
| 创建分支 | git branch <branchName> |
git branch devel |
新建分支,指向当前分支的最新提交(无代码复制,仅建指针) |
| 切换分支 | git checkout <branchName> |
git checkout devel |
移动 HEAD 指针到目标分支,工作区文件同步为该分支最新状态 |
| 创建 + 切换分支 | git checkout -b <branchName> |
git checkout -b devel |
等价于「创建分支 + 切换分支」,开发中高频使用 |
| 合并分支 | git merge <待合并分支名> |
git checkout master && git merge devel |
将 devel 分支合并到当前 master 分支;支持快进式 / 三路合并 |
| 查看分支列表 | git branch |
git branch |
列出所有本地分支,当前分支前带 * |
| 查看分支关联 | git branch -vv |
git branch -vv |
显示本地分支与远程分支的关联关系(如是否跟踪、最新提交) |
| 查看合并状态 | git branch --merged |
git branch --merged |
列出已合并到当前分支的所有分支(可安全删除) |
| 查看未合并分支 | git branch --no-merged |
git branch --no-merged |
列出未合并到当前分支的分支(删除需谨慎) |
| 删除本地分支 | git branch -d <branchName> |
git branch -d devel |
删除已合并的本地分支;未合并分支需用 -D 强制删除(git branch -D devel) |
| 删除远程分支 | git push origin --delete <branchName> |
git push origin --delete devel |
删除远程仓库上的分支(需先确保本地分支已处理完毕) |
| 撤销合并(未推) | git reset --hard HEAD~1 |
git reset --hard HEAD~1 |
回滚到合并前的提交(仅合并提交未推送远程时使用,谨慎!会丢失合并后修改) |
shell
#1.创建分支
git branch devel
#2.切换分支
git checkout devel
git status
#3.写入一些代码
echo 'shopping 100% ' > shop.html
#4.将代码存入暂存区
git add shop.html
#5.提交代码
git commit -m 'shop add'
#6.推送代码
git push -u gitee devel

shell
##各分支按分别按自己的更改向前演进
#3.分支合并
git checkout master
git merge devel
git push -u gitee master
#4.查看关联分支
git branch -vv

Gitlab
Gitlab简介
-
私有代码仓库
-
精细化权限配置,让系统更安全
-
控制用户/用户组是否可以提交到主分支
-
基于Ruby 开发。后来,一些部分用Go语言重写
GitLab和Github/Gitee区别
| 对比维度 | Gitlab | Github/Gitee |
|---|---|---|
| 共同点 | 存放代码,支持 Git 访问 | 存放代码,支持 Git 访问 |
| 不同点 | 支持精细化访问控制、具备全面安全措施、支持定时备份、支持迁移、支持升级 | 使用权限及用户管理较弱,无法实现精细化权限控制 |
GitLab组件介绍
| 组件名称 | 简要功用 |
|---|---|
| Gitaly | 处理 GitLab 发起的所有 Git 调用的 Git RPC 服务 |
| GitLab Exporter | GitLab 指标暴露器(提供系统运行指标数据) |
| GitLab Page | GitLab 内置的静态 Web 站点服务 |
| GitLab self-monitoring 组件(Prometheus) | 监控系统核心组件,收集并存储指标数据 |
| GitLab self-monitoring 组件(Alertmanager) | 监控告警管理,基于指标触发告警通知 |
| GitLab self-monitoring 组件(Grafana) | 可视化监控平台,展示 Prometheus 收集的指标图表 |
| GitLab self-monitoring 组件(Sentry) | 应用错误跟踪工具,捕获并分析组件运行错误 |
| GitLab self-monitoring 组件(Jaeger) | 分布式追踪工具,排查组件间调用链路问题 |
| GitLab Shell | 处理基于 SSH 会话的 Git 命令(如 git clone/push 等 SSH 协议操作) |
| GitLab Workhorse | 智能反向代理,高效处理高并发 HTTP 请求,减轻后端压力 |
| Inbound emails(SMTP) | 接收邮件,用于更新 Issue、合并请求等事项 |
| Outbound email(SMTP) | 向用户发送邮件通知(如告警、任务状态变更、@提及等) |
| LDAP Authentication | 集成 LDAP 认证服务,支持统一身份认证登录 |
| Mattermost | 开源企业级即时通讯工具(类似 Slack),支持团队协作沟通 |
| MinIO | 提供对象存储服务,存储 GitLab 相关文件数据 |
| NGINX | 反向代理,将客户端请求路由到对应组件,同时终止 SSL 会话 |
| Praefect | Git 客户端与 Gitaly 存储节点之间的透明代理,优化存储访问 |
| Node Exporter | 节点指标暴露器,收集服务器(运行 GitLab 的节点)的系统指标 |
| PostgreSQL | GitLab 核心数据库,存储项目、用户、权限等核心业务数据 |
| PostgreSQL Exporter | 暴露 PostgreSQL 数据库的运行指标,供监控组件采集 |
| Puma (GitLab Rails) | 应用服务器,处理 Web 接口和 API 相关请求 |
| Redis | 缓存服务,缓存频繁访问的数据,提升系统响应速度 |
| Redis Exporter | 暴露 Redis 缓存的运行指标,供监控组件采集 |
| Registry | 容器镜像仓库,支持 Docker 镜像的 push(推送)和 pull(拉取)操作 |
| Runner | GitLab CI/CD 执行器,运行自动化构建、测试、部署等 CI/CD 作业 |
| Sentry integration | 集成 Sentry 工具,跟踪各部署应用的错误信息并反馈 |
| Sidekiq | 后台作业处理器,处理 GitLab 异步任务(如邮件发送、数据备份等) |
部署GitLab
GitLab安装要求:https://docs.gitlab.cn/docs/jh/install/requirements/#storage
yum安装
gitlab-ce 社区版,ee企业版
社区版:https://packages.gitlab.com/gitlab/gitlab-ce
shell
#1.安装依赖
yum install -y policycoreutils-python-utils.noarch
#2.下载gitlab
rpm -ivh --nodeps
#3.修改/etc/gitlab/gitlab.rb(ruby语言)
# 配置 GitLab 外部访问 URL,用户通过该地址访问 GitLab 服务
external_url 'http://gitlab.chenshiquan.xyz'
# 禁用 SMTP 邮件发送功能(不配置邮件服务器)
gitlab_rails['smtp_enable'] = false
# 禁用 GitLab 邮件发送功能(即使 SMTP 启用,也不发送系统邮件)
gitlab_rails['gitlab_email_enabled'] = false
# 启用 GitLab 管理备份目录(由 GitLab 自动维护备份目录结构)
gitlab_rails['manage_backup_path'] = true
##备份目录
# 指定 GitLab 数据备份文件的存储路径
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
##备份文件权限
# 设置备份文件的访问权限(0644 表示所有者可读可写,其他用户只读)
gitlab_rails['backup_archive_permissions'] = 0644
# 备份保留时间
# 备份文件的保留时长(单位:秒),604800 秒 = 7 天,超过自动清理
gitlab_rails['backup_keep_time'] = 604800
# 存储初始 root 用户密码(安装后首次登录的 root 密码会被保存到指定位置)
gitlab_rails['store_initial_root_password'] = true
# 禁用容器镜像仓库 Registry 功能(不启用 GitLab 内置的镜像仓库服务)
gitlab_rails['registry_enabled'] = false
# 禁用 Registry 服务(与上一行配合,彻底关闭 Registry 相关服务)
registry['enable'] = false
# 禁用 Puma 服务器的 SSL 监听(Puma 是 GitLab 后端应用服务器,不启用 SSL 监听)
puma['ssl_listen'] = nil
# 清空 Puma 服务器的 SSL 端口配置(不指定 SSL 监听端口)
puma['ssl_port'] = nil
# 清空 Puma 服务器的 SSL 证书路径(不配置 SSL 证书)
puma['ssl_certificate'] = nil
# 清空 Puma 服务器的 SSL 证书密钥路径(不配置 SSL 证书密钥)
puma['ssl_certificate_key'] = nil
# 清空 Puma 服务器的 SSL 客户端证书路径(不配置客户端证书验证)
puma['ssl_client_certificate'] = nil
# 清空 Puma 服务器的 SSL 加密套件过滤规则(使用默认加密套件)
puma['ssl_cipher_filter'] = nil
# 设置 Puma 服务器的 SSL 验证模式为无验证(不验证客户端证书)
puma['ssl_verify_mode'] = 'none'
# 禁用 Puma 服务器的指标导出功能(不暴露 Puma 运行状态指标)
puma['exporter_enabled'] = false
# 启用内置 PostgreSQL 数据库(使用 GitLab 自带的 PostgreSQL 服务)
postgresql['enable'] = true
# 设置 PostgreSQL 数据库的 SSL 模式为关闭(不启用数据库连接的 SSL 加密)
postgresql['ssl'] = 'off'
# 启用内置 Redis 缓存服务(使用 GitLab 自带的 Redis 服务)
redis['enable'] = true
# 启用 Nginx 反向代理服务(使用 GitLab 自带的 Nginx 作为前端服务器)
nginx['enable'] = true
# 设置 Nginx 允许的最大客户端请求体大小(250m 支持大文件上传,如大型代码仓库、附件等)
nginx['client_max_body_size'] = '250m'
# 禁用 HTTP 重定向到 HTTPS(保持 HTTP 访问,不强制跳转 HTTPS)
nginx['redirect_http_to_https'] = false
# 配置 HTTP 重定向到 HTTPS 的监听端口(因上一行禁用跳转,此处仅为默认配置保留)
nginx['redirect_http_to_https_port'] = 80
# 禁用 Prometheus 监控服务(不启用 GitLab 内置的 Prometheus 监控)
prometheus['enable'] = false
# 禁用 Alertmanager 告警服务(不启用监控告警功能)
alertmanager['enable'] = false
# 禁用 Node Exporter 主机指标采集服务(不采集服务器系统指标)
node_exporter['enable'] = false
# 禁用 Redis Exporter 指标导出服务(不暴露 Redis 运行状态指标)
redis_exporter['enable'] = false
# 禁用 PostgreSQL Exporter 指标导出服务(不暴露 PostgreSQL 运行状态指标)
postgres_exporter['enable'] = false
# 禁用 GitLab Exporter 指标导出服务(不暴露 GitLab 系统运行状态指标)
gitlab_exporter['enable'] = false
# 禁用 Let's Encrypt 自动 SSL 证书申请功能(不自动获取免费 SSL 证书)
letsencrypt['enable'] = false
--------------------------------------------------
external_url 'http://gitlab.oldboy.cn'
gitlab_rails['smtp_enable'] = false
gitlab_rails['gitlab_email_enabled'] = false
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_keep_time'] = 604800
gitlab_rails['store_initial_root_password'] = true
gitlab_rails['registry_enabled'] = false
registry['enable'] = false
puma['ssl_listen'] = nil
puma['ssl_port'] = nil
puma['ssl_certificate'] = nil
puma['ssl_certificate_key'] = nil
puma['ssl_client_certificate'] = nil
puma['ssl_cipher_filter'] = nil
puma['ssl_verify_mode'] = 'none'
puma['exporter_enabled'] = false
postgresql['enable'] = true
postgresql['ssl'] = 'off'
redis['enable'] = true
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = false
nginx['redirect_http_to_https_port'] = 80
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false
letsencrypt['enable'] = false
--------------------------------------------------
#4.生效配置gitlab
gitlab-ctl reconfigureg
#5.Gitlab默认登陆密码 账号root
cat /etc/gitlab/initial_root_password
命令
(1)GitLab常用命令
| 命令 | 功能 | 命令 | 功能 |
|---|---|---|---|
| check-config | 检查配置文件中是否使用了过时的配置参数 | once | 启动处于停止状态的服务,但若再次停止不会重启 |
| remove-accounts | 删除所有的用户和组 | start | 启动处于停止状态的服务,若再次停止会进行重启 |
| upgrade-check | 检查是否支持版本升级 | restart | 重启服务 |
| upgrade | 升级和迁移 | stop | 停止服务 |
| cleanse | 清空 gitlab 上的数据,从 0 开始重新配置 | statu3 | 显示所有服务的状态 |
| reconfigure | 重新配置 gitlab | tail | 监视服务的相关日志 |
| show-config | 显示将会由 reconfigure 生成的配置 | service-list | 列出所有的 service |
| uninstall | 关闭所有进程并卸载 supervisor,数据会保留 | backup-etc | 备份 gitlab 的配置 |
(2)GitLab维护命令gitlab-rails/gitlab-rake
| 工具名称 | 本质 | 核心作用 |
|---|---|---|
| Rails | 基于 Ruby 语言的 Web 应用开发框架(Ruby on Rails) | 支撑 GitLab Web 应用与实例运行,为 GitLab 提供核心开发 / 运行环境 |
| Rake | Ruby 专属的工程管理工具(类似 Make) | 读取 Rakefile 脚本,执行 GitLab 各类维护任务 |
| 命令分类 | 具体命令 | 功能说明 |
|---|---|---|
| gitlab-rails | gitlab-rails console |
打开 Rails 控制台,支持命令行与 GitLab 实例交互,可访问 Rails 内置工具 |
| gitlab-rails | 各类子命令 | 完成 GitLab 多维度维护任务(控制台内执行) |
| gitlab-rake | gitlab:check |
检查 GitLab 配置的完整性与正确性 |
| gitlab-rake | cache:clear |
清除 Redis 缓存(解决缓存异常、配置不生效等问题) |
| gitlab-rake | gitlab:db:reindex |
重建 PostgreSQL 数据库索引(优化数据库查询性能) |
| gitlab-rake | gitlab:backup:create |
创建 GitLab 完整备份(包含数据、配置等核心内容) |
| gitlab-rake | gitlab:backup:restore |
从已生成的备份文件中恢复 GitLab 数据 |
Gitlab备份
shell
#1.创建GitLab完整备份
gitlab-rails gitlab:backup:create
#2.从生成的备份文件中恢复GitLab数据(BACKUP指定从哪个备份文件恢复)
gitlab-rake gitlab:backup:restore BACKUP=1765415897_2025_12_11_17.7.7
Gitlab升级
shell
# 版本升级步骤
# 1. 需完成之前步骤以确保版本升级成功
# 2. 升级至目标主版本的第一个次要版本
# 3. 升级到目标主版本的下一个次要版本(格式示例:x.0.2)
Gitlab设置Https
shell
#1.修改/etc/gitlab/gitlab.rb(修改前先备份)
###修改如下内容
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80
nginx['ssl_certificate'] = "/etc/gitlab/ssl/xxx.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/xxx.key"
nginx['ssl_ciphers'] = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
nginx['ssl_prefer_server_ciphers'] = "off"
nginx['ssl_protocols'] = "TLSv1.2 TLSv1.3"
nginx['ssl_session_cache'] = "shared:SSL:10m"
#nginx['ssl_certificate'] =
#修改gitlab中nginx服务的ssl_certificate配置
#gitlab-ctl reconfigure就会读取gitlab.rb重新生成配置文件
设置Gitlab能送邮件
shell
#1.修改/etc/gitlab/gitlab.rb(修改前先备份)
### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '2501379813@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab_tongzhi'
##配置详细发件人信息
### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "15180579479@163.com"
gitlab_rails['smtp_password'] = "????授权码"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
#生效配置文件
gitlab-ctl reconfigure
GitLab用户在Group的权限
Group 内用户权限(5 种核心角色)
| 权限角色 | 核心权限 | 适用人群 |
|---|---|---|
| Guest | 可创建 Issue、发表评论;不能读写版本库 | 仅需参与问题讨论的非开发人员 |
| Reporter | 可 clone 代码;不能执行代码 commit | QA(测试人员)、PM(产品经理) |
| Developer | 可执行 clone、commit、push 等代码操作 | RD(研发工程师) |
| Maintainer | 可创建项目、添加 tag、保护 branch、添加项目 member、编辑项目 | 核心 RD 负责人 |
| Owner | 可设置项目访问权限、调整可见级别、迁移项目、管理组成员 | 开发组 leader |
Group / 项目可见性级别
| 可见性级别 | 访问范围说明 |
|---|---|
| Private | 群组及其项目仅能由组内成员查看 |
| Internal | 除外部用户外,任何登录 GitLab 实例的用户均可查看该群组及内部项目 |
| Public | 群组和公开项目无需身份验证,全网可查看 |
GitLab web相关配置
设置中文

创建仓库



设定仓库的访问权限

设置分支保护机制

设置仓库上的合并请求机制

Git工作流程示例
将代码上传到GitLab
(1)从windows上传代码到GitLab,获取windows公钥,添加至Gitee
bash
#1.使用Git BASH 查看windows ssh的公钥
###生成密钥,如果生成过了,直接查看即可
$ ssh-keygen
###复制公钥到Gitee
$ cat ~/.ssh/id_ed25519.pub

(2)关联远程仓库,并上传代码文件
shell
#1.windows做好域名解析(如果是Linux也得做好域名解析)
#2.关联远程仓库
git remote add gitlab git@gitlab.chenshiquan.xyz:root/live.git
#3.上传代码
git push -u gitlab --all
