使用 Gitlab 管道和 git 推送防止无限循环



>我有一个项目,其中有 4 个环境(开发、测试、暂存和生产(,每个环境都有分支(分别为开发、测试、暂存主控(。我们使用npm version来提升package.json版本中的版本,但也添加一个 git 标签。之后,我们运行构建,成功后,我们推送由npm version命令创建的提交和标记。所以在我的管道工作中,我有这个(简化(:

dev build:
stage: build
only:
- develop@username/reponame
script:
- npm version patch -m "[ci skip] %s"
- git add -A
- echo "Do build here before pushing the version bump"
- git push git@my-repo-url:$CI_PROJECT_PATH.git HEAD:develop --follow-tags

请注意npm version,我还为 git 提交指定了一条消息,以便我可以添加"[ci skip]">,这就是我们停止无限循环的方式,但随后我们在状态列下将管道运行列为跳过。不是世界上最糟糕的事情,但想看看是否有更好的方法来做这种事情?将版本 git 提交和标记推送到存储库,而不会触发另一个管道运行。

在与同事交谈后(感谢Lucas Still(,他有了这个想法,并在Gitlab的文档中指出了它,以检查用户正在推送的变量。这是一个好主意,因为我已经有一个机器人 gitlab 用户来执行git push所以我所要做的就是有一个except并检查用户是否是该机器人帐户:

dev build:
stage: build
except:
variables:
- $GITLAB_USER_LOGIN == "my-bot"
only:
- develop@username/reponame
script:
- npm version patch
- echo "Do build here before pushing the version bump"
- git push git@my-repo-url:$CI_PROJECT_PATH.git HEAD:$CI_COMMIT_REF_NAME --follow-tags

因此,这里唯一重要的是将"my-bot"更改为机器人帐户的用户名。也可以使用$GITLAB_USER_ID甚至$GITLAB_USER_EMAIL,但用户名对遇到 yml 文件的其他人更具描述性。

我遇到了同样的问题,并提出了一个简洁的解决方案,它使用 Gitlab 变量(正如米切尔指出的那样(,但不需要有一个 git 机器人(尽管你需要凭据来 git push,也许是你自己的(。

基本上,我检查变量CI_COMMIT_MESSAGE,特别是如果它包含预定义的关键字,以便在匹配时不运行CI管道。所以 yml 文件看起来像这样:

ci_runner_job: # I want this job to run whenever someone else pushes something
script:
- echo Running ci job...
... (your stuff, e.g. git clone, some code, git add --all) ...
- git commit -m "optional message SOME_KEYWORD"  # this keyword will avoid the loop
- git push (your repo info)
only:
variables:
- $CI_COMMIT_MESSAGE !~ /SOME_KEYWORD/
some_other_job:
script:
- echo This job is running because SOME_KEYWORD was found in the commit message...
... your stuff here, probably something without git push ...
only:
variables:
- $CI_COMMIT_MESSAGE =~ /SOME_KEYWORD/

两点评论:

  1. 这也允许远程用户避免运行 CI 管道,如果他们在其提交消息中包含SOME_KEYWORD
  2. SOME_KEYWORD可以存储在 Gitlab 变量中,因此将来可以轻松修改。

>https://semantic-release.gitbook.io/semantic-release/使用基于git标签在package.json中增加版本的工作流程,并且不需要提交。

最新更新