GitLab 笔记 ongoing
将 Artifacts 长期保留
CI/CD Job 的 Artifacts 通常会设置失效时间, 以避免数据膨胀.
通常会在 gitlab-ci.yaml 中通过 expire_in 字段来设置:
my-job:
artifacts:
expire_in: 3 days然而有些时候我们希望重要的 Artifacts 可以被永久保留.
此时可以在对应 Job 的页面中, 点击右侧 Keep 按钮.

使用 Deploy Keys 来部署
INFO
Deploy Keys 优势在于安全 (ssh 这种非对称加密肯定比 "账号密码" 模式更安全).
缺陷是: 需要在目标设备上配置 ~/.ssh/config 文件, 且无法访问例如 Container Registry.
如果需要更精细的权限控制, 同时对安全性的要求没那么高, 可以使用 Deploy Token.
参考 GitHub 中的 使用 Deploy Keys 来部署. 这里只记录配置的路径:
在代码仓库的 Settings / Repository 中找到 Deploy keys 那一项.
使用 Deploy Tokens 来部署
WARNING
注意区分 Deploy Key 和 Deploy Token.
Key 是指 SSH 密钥对, 而 Token 是 HTTP 协议中常用的术语.
在代码仓库的 Settings / Repository 中找到 Deploy tokens 那一项.
TIP
Deploy Token 最适合用于部署容器镜像 (权限设置为 read_registry).
Access Token 的使用场景
INFO
Access Token 必须设置失效时间 (最长一年).
代码仓库级别的 Access Token 路径: 代码仓库的 Settings / Access Tokens.
用户级别的 Access Token 路径: 点击头像中的 Preferences, 然后在侧边栏找到 Access Tokens.

Access Token 应该用于代表开发者自己的身份, 并用于开发环境 (避免在生产环境中使用).
例如当希望使用 https (而不是 ssh) 来 git clone 时, 就可以使用用户级别的 Access Token.
如果开启了两步验证, 此时要想使用 https 来访问私有仓库, 则必须使用 Access Token.
在 CI/CD 中创建 Commit
若使用了某个根据注释自动生成文档的工具, 所生成的文档也会被 git 追踪并做版本管理.
如果每次都需要手动执行命令才能生成文档, 那么就会出现 "文档与注释不同步" 的问题.
此时就可以创建 CI/CD Job, 用于自动生成文档, 若发现有变化则创建 commit 并 push.
这里举个例子, 通过 helm-docs 生成 README.md 文件:
helm-docs:
stage: test
rules:
# 仅允许此 Job 在 merge request 中执行
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- sh helm-docs.sh# helm-docs.sh
# 通过配置在 compose.yaml 中的 helm-docs 程序来生成文档.
docker compose --progress quiet run --rm helm-docs
# 判断是否存在 "未提交的修改".
if [ -z "$(git add . && git status -s)" ]; then
echo "文档没有需要更新的地方, 因此不创建新的 commit."
exit 0
fi
# 以当前 GitLab 用户的身份创建 Commit.
git -c user.email="$GITLAB_USER_EMAIL" \
-c user.name="$GITLAB_USER_NAME" \
commit -m "update helm-docs.md"
# ROBOT_TOKEN_NAME 和 ROBOT_TOKEN_PASSWORD 是 Project Access Token 的名称和密码.
# 需要在代码仓库的 Settings / Access tokens 页面申请好, 并在 Settings / CI/CD 页面的 Variables 中配置好.
PROJECT_URL="https://$ROBOT_TOKEN_NAME:$ROBOT_TOKEN_PASSWORD@$CI_SERVER_HOST/$CI_PROJECT_PATH.git"
echo "PROJECT_URL: $PROJECT_URL"
# 由于 CI/CD Job 执行时, git 处于 detached mode,
# 因此 git push 相关的命令看起来和常见的不太一样.
git push $PROJECT_URL HEAD:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME