仅为合并/特定提交消息做作业
Do jobs only for merge / specific commit message
我不太确定 gitlab CI 工作流程应该如何实现这一点:
- 在我的 gitlab 存储库中,每个功能都将在自己的分支中开发。至少分支会合并到master。
- 我正在使用 npm 包 grunt-bump 来提升 package.json
的版本
我想用gitlab做什么CI:
- 对于合并到master我想做一些测试(阶段测试)
- 如果测试阶段成功通过,合并应该完成,
grunt bump
应该执行
- 这会增加版本值并向 master 提交新的提交。这个提交总是被标记为 "v0.0.2" 并且有一个像 "Release v0.0.2" 的消息。仅针对此提交,我想进入将构建和部署应用程序的构建阶段。
总结
所以 grunt bump
应该只在 master 上并且在成功测试和合并之后执行。仅针对生成的提交(发布 vx.x.x)构建和部署作业应该完成...
也许有比这个想法更智能的工作流程。基本上我想在合并和成功测试后增加版本值并标记提交...
我对 YAML 文件的尝试
stages:
- test
- build
- deploy
lint:
image: testing:latest
stage: test
tags:
- testing
script:
- /node_modules/.bin/eslint --ext .js --ext .jsx .
bump:
stage: build
tags:
- deploy
script:
- grunt bump
only:
- master
- /^Merge .*$/
build:
stage: build
tags:
- deploy
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:latest
only:
- master
- tags
- /^Release .*$/
production:
stage: deploy
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $CI_REGISTRY_IMAGE:latest
- cd /home/ubuntu
- docker-compose up -d
only:
- master
- tags
- /^Release .*$/
可以根据预定义的 gitlab 变量 $CI_COMMIT_MESSAGE
执行作业 only/except
。
参见 gitlab ci reference。
还要检查 docu 变量表达式的处理方式。
commit_message_has_release_job:
only:
variables:
- $CI_COMMIT_MESSAGE =~ /^Release .*$/
[...]
也可以过滤 merge_requests。
merge_request_job:
only:
- merge_requests
[...]
合并 only/except
的多个案例可能不会像您预期的那样工作。该列表不适用于 AND
,但 OR
。此外,不能 100% 确定前导 only
后跟 except
是否按预期工作。所以一个简单的解决方法是这样的:
merge_reqeuest_to_master_job:
only:
- merge_requests
before_script:
- if [[ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master" ]]; exit 0 ; fi
由于刚刚设置了变量 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
,如果管道用于合并请求,您可以这样做:
merge_reqeuest_to_master_job:
only:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
但是,功能 "CI variable expression conjunction/disjunction" 从 12.0 开始实施。
merge_reqeuest_to_master_job:
only:
- merge_requests
对您的其他评论:
- 如果一个阶段的单个作业失败,默认情况下不会自动启动以下阶段的任何作业(如果您不这样做
allow_failure: true
或 when: on_failure
)
是的,可以使用特定的提交消息触发管道,为此我们可以使用正则表达式
对我来说,它适用于以下内容,
install_nodemodules:
stage: install
script:
- npm install
artifacts:
paths:
- node_modules/
only:
variables:
- $CI_COMMIT_MESSAGE =~ /Release/
在每个阶段都需要指定这个条件来执行当Commit消息等于Release的阶段
我不太确定 gitlab CI 工作流程应该如何实现这一点:
- 在我的 gitlab 存储库中,每个功能都将在自己的分支中开发。至少分支会合并到master。
- 我正在使用 npm 包 grunt-bump 来提升 package.json 的版本
我想用gitlab做什么CI:
- 对于合并到master我想做一些测试(阶段测试)
- 如果测试阶段成功通过,合并应该完成,
grunt bump
应该执行 - 这会增加版本值并向 master 提交新的提交。这个提交总是被标记为 "v0.0.2" 并且有一个像 "Release v0.0.2" 的消息。仅针对此提交,我想进入将构建和部署应用程序的构建阶段。
总结
所以 grunt bump
应该只在 master 上并且在成功测试和合并之后执行。仅针对生成的提交(发布 vx.x.x)构建和部署作业应该完成...
也许有比这个想法更智能的工作流程。基本上我想在合并和成功测试后增加版本值并标记提交...
我对 YAML 文件的尝试
stages:
- test
- build
- deploy
lint:
image: testing:latest
stage: test
tags:
- testing
script:
- /node_modules/.bin/eslint --ext .js --ext .jsx .
bump:
stage: build
tags:
- deploy
script:
- grunt bump
only:
- master
- /^Merge .*$/
build:
stage: build
tags:
- deploy
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:latest
only:
- master
- tags
- /^Release .*$/
production:
stage: deploy
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $CI_REGISTRY_IMAGE:latest
- cd /home/ubuntu
- docker-compose up -d
only:
- master
- tags
- /^Release .*$/
可以根据预定义的 gitlab 变量 $CI_COMMIT_MESSAGE
执行作业 only/except
。
参见 gitlab ci reference。
还要检查 docu 变量表达式的处理方式。
commit_message_has_release_job:
only:
variables:
- $CI_COMMIT_MESSAGE =~ /^Release .*$/
[...]
也可以过滤 merge_requests。
merge_request_job:
only:
- merge_requests
[...]
合并 only/except
的多个案例可能不会像您预期的那样工作。该列表不适用于 AND
,但 OR
。此外,不能 100% 确定前导 only
后跟 except
是否按预期工作。所以一个简单的解决方法是这样的:
merge_reqeuest_to_master_job:
only:
- merge_requests
before_script:
- if [[ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master" ]]; exit 0 ; fi
由于刚刚设置了变量 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
,如果管道用于合并请求,您可以这样做:
merge_reqeuest_to_master_job:
only:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
但是,功能 "CI variable expression conjunction/disjunction" 从 12.0 开始实施。
merge_reqeuest_to_master_job:
only:
- merge_requests
对您的其他评论:
- 如果一个阶段的单个作业失败,默认情况下不会自动启动以下阶段的任何作业(如果您不这样做
allow_failure: true
或when: on_failure
)
是的,可以使用特定的提交消息触发管道,为此我们可以使用正则表达式
对我来说,它适用于以下内容,
install_nodemodules:
stage: install
script:
- npm install
artifacts:
paths:
- node_modules/
only:
variables:
- $CI_COMMIT_MESSAGE =~ /Release/
在每个阶段都需要指定这个条件来执行当Commit消息等于Release的阶段