当我们将代码推送到“cicd-setup”分支时,下面的 CICD 代码会自动触发。这里,当我们每次将代码推送到“cicd-setup”分支时,“build-stage”和“sonar-stage”都会自动触发。 当我们推送代码时,我不想自动触发“声纳阶段”。 我添加了 仅有的: - 合并请求 如果我添加上面的代码,“声纳阶段”仅在我们提高 MR 时触发,而其他阶段在我们提高 MR 时不会运行,这是解决方案的一半!!.
我的问题是,当我们每次推送代码时,“声纳阶段”不应该自动执行/触发。仅当我们提出合并请求时才会触发。
stages:
- build-stage
- sonar-stage
variables:
SONAR_HOST: "http://asdftestserver01.abc.com:9000"
SONAR_PROJECT_KEY: "test-api"
SONAR_LOGIN_TOKEN: "aaabbbbbbcccccccddddddddd"
build_stage:
stage: build-stage
only:
- cicd-setup
environment:
name: stage
script:
- echo "build stage started"
- mvn clean install
api_sonarqube_analysis:
stage: sonar-stage
only:
- merge_requests
- cicd-setup
script:
- pwd
- echo "sonarqube started"
- mvn sonar:sonar -Dsonar.projectKey=$PROJECT_KEY -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_LOGIN_TOKEN
正如您可能在文档中看到的那样,
only
和 except
已被弃用,取而代之的是 rules
。因此,也许您最好迁移到新语法 - 并不是说您无法使用 only
实现相同的效果 - 因为它看起来也会更清晰。
也就是说,您可以像这样适应新格式:
stages:
- build-stage
- sonar-stage
variables:
SONAR_HOST: "http://asdftestserver01.abc.com:9000"
SONAR_PROJECT_KEY: "test-api"
SONAR_LOGIN_TOKEN: "aaabbbbbbcccccccddddddddd"
build_stage:
stage: build-stage
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "cicd-setup"
environment:
name: stage
script:
- echo "build stage started"
- mvn clean install
api_sonarqube_analysis:
stage: sonar-stage
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "cicd-setup"
script:
- pwd
- echo "sonarqube started"
- mvn sonar:sonar -Dsonar.projectKey=$PROJECT_KEY -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_LOGIN_TOKEN
我已经使用了变量
$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
,但如果你想使用它,你也可以使用 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
。可用合并请求变量的完整列表位于此处。
请记住,当您打开 MR 时,这将生成两个单独的管道,每个阶段一个,因为每次推送到 MR 相关分支也会触发
build_stage
作业。