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

Prevent infinite loop with Gitlab pipeline and git pushing

我有一个项目,其中有 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 提交了 cify 消息,这样我就可以添加 “[ci skip]” 这就是我们停止无限循环的方式,但随后我们在状态列下将管道 运行 列为已跳过。不是世界上最糟糕的事情,而是想看看是否有更好的方法来做这种事情?在不触发另一个管道 运行.

的情况下将版本 git 提交和标记推送到 repo

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

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 文件的其他人更具描述性。

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

我 运行 遇到了同样的问题,并提出了一个使用 Gitlab 变量的巧妙解决方案(正如 Mitchell 所指出的)但不需要 git 机器人(尽管你' git 推送需要凭据,也许是你自己的)。

基本上我会检查变量 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 中包含 SOME_KEYWORD
  2. SOME_KEYWORD可以潜在地存储在Gitlab变量中,因此将来很容易修改。