使用 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/
两条备注:
- 这也允许远程用户避免 CI 到 运行 的管道,如果他们在他们的提交消息 SOME_KEYWORD 中包含 SOME_KEYWORD
- SOME_KEYWORD可以潜在地存储在Gitlab变量中,因此将来很容易修改。
我有一个项目,其中有 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]” 这就是我们停止无限循环的方式,但随后我们在状态列下将管道 运行 列为已跳过。不是世界上最糟糕的事情,而是想看看是否有更好的方法来做这种事情?在不触发另一个管道 运行.
在与同事交谈后(感谢 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/
两条备注:
- 这也允许远程用户避免 CI 到 运行 的管道,如果他们在他们的提交消息 SOME_KEYWORD 中包含 SOME_KEYWORD
- SOME_KEYWORD可以潜在地存储在Gitlab变量中,因此将来很容易修改。