GitLab Expert
GitLab
links:
CI/CD
CI: Continuous Integration
- Detect Errors
- Reduce Integration Problem
- Team Work
CD: Continuous Delivery/Continuous Deployment
- Every Change is Releasable
- Value Quickly to Get Feedback What Users Care About
CI/CD 在开发中的流程:
-
Code
-
Commit
-
Test(CI)
- Build
- Unit
- Integration
-
CD
- Review
- Staging
- Production
Workflow
mr
在 每个 branch 上显示的 0|1
状态表示该分支上的提交状态,0 表示存在 0 个提交落后于 default branch, 1 表示存在 1 个提交提前于 default branch。
GitLab Badge
徽章是一种统一的方式,用于呈现有关项目的概述信息。它们由一个小图像和图像指向的 URL 组成。徽标的示例可以是管道状态、测试覆盖范围或联系项目维护人员的方式。
添加 pipeline badge
-
进入 Settings -> General -> Badges
-
Name 字段:
Pipeline Status
-
Link 字段:
https://gitlab.com/%{project_path}/-/commits/%{default_branch}
-
Image URL 字段:
https://gitlab.com/%{project_path}/badges/%{default_branch}/pipeline.svg
GitLab Runner
执行 GitLab CI/CD 需要配置 GitLab runner
-
gitlab runner 是用于配置 GitLab CI/CD 重要工具。
安装
配置 gitlab-runner 为项目提供 CI/CD 的执行器。
links:
binary install
Step 1. 参考文档,根据机器架构安装下载二进制。
Step 2. 为二进制包添加执行权限。
Step 3. 配置 gitlab 工作路径 --working-directory
,避免 gitlab-runner 构建的缓存撑爆硬盘,配置文件所在 /etc/systemd/system/gitlab-runner.service
。
Step 4. 安装 gitlab-runner 服务。
1 | # root 用户,避免权限 |
Step 5. 注册 gitlab-runner 的执行器,生成配置文件 /etc/gitlab-runner/config.toml
。
1 | gitlab-runner register |
可单独配置 runner 的构建目录 builds_dir
,注意路径权限:
1 | chmod -R 777 gitlab-runner-custom-build-dir |
shell executor
使用 docker 配置 shell executor
1 | docker run -d --name gitlab-runner \ |
[!CAUTION]
注意 gitlab-runner 容器中用户和主机用户权限配置冲突解决,包括构建目录 /data2/cache 和 docker.sock 等挂载的访问权限都需要配置.
1 | chmod -R 777 /data2/cache |
向 gitlab instance 注册 runner
1 | docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register |
配置完后,host 下的 gitlab runner config 如下:
1 | # cat /srv/gitlab-runner/config/config.toml |
更新配置 /srv/gitlab-runner/config, 重启镜像,生效配置
1 | docker restart gitlab-runner |
docker executor
DOOD 配置: 使用主机的 docker daemon
1 | # cat /srv/gitlab-runner/config/config.toml |
links:
k8s install
使用 helm 在 k8s 上安装 gitlab-runner
links:
常用命令
1 | gitlab-runner stop # 停止 runner |
集成 docker 构建环境
需要配置 gitlab-runner 访问 dockerhub 权限 DOCKER_AUTH_CONFIG
。
links:
更多配置
CI 在 Gitlab 中跑起来,可能需要对 runner 配置.
参考文档:
常见问题
Missing /usr/bin/gitlab-runner-helper. Creating cache is disabled
存在环境变量 variable 设置到 DEBUG,需删掉干扰环境变量。
GitLab CI/CD
参考文档:
gitlab template
使用 GitLab CI/CD 最高效的方式是使用现有的模板.
links:
-
https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates
-
https://hodovi.cc/blog/creating-templates-for-gitlab-ci-jobs/
-
https://gitlab.com/nvidia/kubernetes/device-plugin/.common.yml
variable
GitLab CI/CD Variable 变量是一种环境变量,用于:
-
控制作业和管道的行为。
-
存储要重复使用的值。
-
避免在
.gitlab-ci.yml
中硬编码值。
变量分为:
预置变量(Predefined variables reference)预定义的 CI/CD 变量在每个 GitLab CI/CD 管道中都可用。
links:
GIT_STRATEGY
在 GitLab CI 中,可以使用 GIT_STRATEGY 来指定 Git 操作的策略。GIT_STRATEGY 有以下几个可选值:
-
clone:每个 Job 都会执行
git clone
操作来获取代码,默认值。 -
fetch:每个 Job 都会执行
git fetch
操作来更新代码。 -
none:每个 Job 都不会执行 Git 操作,适用于无需访问代码仓库的 Job。
rules
GitLab CI/CD 中的 rules 语法允许定义灵活的条件来确定何时创建或执行作业
1 | workflow: |
-
if:确定作业是否应该被创建或执行的条件。它支持使用预定义变量、运算符和正则表达式的广泛表达式。
-
changes:可选字段,允许指定一组文件,当这些文件在提交中被修改时,作业应该触发。
-
exists:可选字段,允许指定一组文件,当这些文件存在于存储库中时,作业应该触发。
-
allow_failure:可选字段,允许指定作业是否允许失败而不影响整体流水线状态。它接受布尔值(true 或 false)。
-
when:可选字段,允许指定作业应该在何时被创建或执行。它接受以下值:on_success、on_failure、always、manual 或 never。
-
start_in:可选字段,允许通过指定时间间隔来延迟作业的开始。它接受值如 3 minutes、1 hour 或 1 day。
extends
复用 CI 脚本配置语法。
如果 my-other-block
在对应的 script 有自定义值,则它会覆盖 extend 中的 值。
1 | my-base-block: |
links:
matrix
1 | stages: |
links:
trigger
使用子管道,解耦 CI 复杂的 jobs.
links:
-
https://docs.gitlab.com/ee/ci/pipelines/downstream_pipelines.html
-
https://about.gitlab.com/blog/2022/02/22/parent-child-vs-multi-project-pipelines/
interruptible
当为 job 配置了 interruptible 时,如果当前分支存在新的提交,会自动取消当前管道.
links:
script
在 gitlab-ci 中,存在 before_script(sc)
, script(s)
, after_script(as)
三个脚本阶段,特征如下:
before_script
:
-
影响 job 状态
-
变量能传递到
s
中
script
:
-
影响 job 状态
-
能接受
bs
中变量
after_script
:
-
不影响 job 状态
-
不接受
bs
和s
中变量,只接受 variable 中的变量
传递环境变量到 af
1 | pass_var_to_as: |
在 job 之间传递变量
1 | pass_var_to_downstream: |
git submodule
使用 git 子模块能保证项目依赖关系,在开发及构建能有效的保证这种关系的稳定。在 GitLab 中使用子模块可能需要做一定的配置。
.gitsubmodules
: 使用 Git 子模块时,项目应具有名为 .gitmodules 的文件。可能需要对其进行修改才能在 GitLab CI/CD 作业中工作。
例如,在以下情况下,配置可能如下所示:
-
项目依赖于 要将其作为子模块包含在内。https://gitlab.com/group/project
-
可以使用类似 .git@gitlab.com:secret-group/my-project.git
1 | [submodule "project"] |
当子模块位于同一 GitLab 服务器上时,应该在文件中使用相对 URL。然后,可以在所有 CI/CD 作业中使用 HTTPS 进行克隆。还可以使用 SSH 进行所有本地检出 .gitmodules。
上述配置指示 Git 自动推断克隆源时要使用的 URL。Git 对 HTTPS 和 SSH 使用相同的配置。GitLab CI/CD 使用 HTTPS 克隆源,可以继续使用 SSH 在本地克隆。
对于不在同一 GitLab 服务器上的子模块,请使用完整的 URL:
1 | [submodule "project-x"] |
子模块在 .gitlab-ci.yml 中 job 中的配置子模块迁出方式。
1 | variables: |
git lfs
要为代码仓库配置 Git LFS 拉取,需要执行以下步骤:
-
在 GitLab CI 脚本中,添加以下命令以安装 Git LFS:
1 | before_script: |
-
确保项目中包含了.gitattributes 文件,并在其中指定要使用 Git LFS 进行跟踪的文件类型。例如,如果想要使用 Git LFS 跟踪所有的.mp4 文件,可以在.gitattributes 文件中添加以下内容:
1 | *.mp4 filter=lfs diff=lfs merge=lfs -text |
这将告诉 Git LFS 将.mp4 文件视为大文件,并使用 Git LFS 进行跟踪。
access token
在 GitLab 项目配置中配置 access token, 可根据需要配置权限,使用方式
-
make a pr or oush with gitlab project token
将代码更改推送逻辑封装到一个 .yml 文件中,然后在其他项目中通过 extends 关键字来扩展这个模板。参考的示例
参考:
-
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
-
https://stackoverflow.com/questions/70775139/how-do-i-push-to-gitlab-with-a-project-access-token
workflow
使用工作流 workflow 控制管道行为。
links:
include
使用 include 在 CI/CD 配置中包含外部 YAML 文件。
links:
artifact
links:
dotenv
dotenv 保存为 artifact
将环境变量保存为 artifact
links:
job
配置 job 中的各种 artifact 行为
links:
service
gitlab ci 中定义的 service 默认以 privileged 权限启动,方便服务内部工作正常.
links:
publish release
GitLab 中发布 release 时会自动创建一个标签 (CI_COMMIT_TAG),所以可以通过检查标签是否存在来判断是否发布了 release。
links:
1 | job-name: |
badges
徽章是一种统一的方式,用于显示关于项目的简化信息。徽章由一个小图像和图像所指向的 URL 组成。在 GitLab 中,徽章显示在项目描述下面。可以在项目和组级别使用徽章。
links:
cron
定时命令
1 | # ┌───────────── minute (0 - 59) |
links:
GitLab Deploy
native
使用 ssh 验证远程部署,主要使用 scp 及 ssh 等工具
1 | # 传输文件到远程 |
生产 ssh 密钥用于自动化部署
1 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" |
将公钥添加到服务器。将 id_rsa.pub 文件的内容复制并粘贴到服务器的~/.ssh/authorized_keys 文件中。
将私钥添加到 GitLab。在 GitLab 中,转到项目的 Settings -> CI/CD -> Variables。创建一个新的变量,例如 SSH_PRIVATE_KEY,并将 id_rsa 文件的内容粘贴到值字段中。
在 .gitlab-ci.yml 文件中使用 SSH 密钥。可以在脚本中使用 SSH_PRIVATE_KEY 变量来建立 SSH 连接。例如:
1 | deploy: |
这个脚本首先检查是否已经安装了 ssh-agent,如果没有则安装它。然后,它启动 ssh-agent,添加私钥,并将服务器添加到 known_hosts 文件中。最后,它通过 SSH 连接到服务器并运行部署命令。
示例脚本
1 |
|
pages
使用 GitLab Pages 部署项目文档,参考使用 GitLab Pages
links:
GitLab API
python 操作
python 作为胶水语言及丰富的包源,很容易和其它工具配置集成。这里介绍通过 python-gitlab 集成进 gitlab 中的一种方式。
API 操作
GitLab API
create pull request
1 | curl --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ |
[!NOTE]
需要将https://gitlab.example.com
替换为 GitLab 实例的 URL,$CI_PROJECT_ID 是项目 ID,$CI_JOB_TOKEN 是 CI/CD 作业令牌,$CI_COMMIT_REF_NAME 是当前分支的名称。
delete tag
1 | # 删除 tag v1.0.0 |
GitLab CI local
Gitlab CI local 用于本地测试 gitlab 管道,避免频繁推送到远程测试 CI 流程。
[!TIP]
建议在 vscode devcontainer 配置 nodejs 及 dind 进行测试。
安装
手动安装,参考 README.md
常用命令
1 | # 列出job |