Azure DevOps 中跳过的流水线阶段

9

问题

当触发下面的流程时,在构建和推送后,Dev阶段未被运行。

enter image description here

该流水线是通过将develop作为目标分支的PR来触发的。

pipeline.yaml

trigger:
  branches:
    include:
      - master
      - develop

pr:
  branches:
    include:
      - develop

stages:
  # Frontend tests: Triggered by opening new PRs to develop or updating pr to develop.
  - stage: FrontEndTests
    displayName: "Frontend tests"
    condition: eq( variables['Build.Reason'], 'PullRequest') #  Trigger stage only for PullRequests
    jobs:
      - template: /templates/pipelines/npm-unit-tests.yml@templates
        parameters:
          triggerType: ${{ variables.triggerType }}

  # Common build triggered by push to master or develop
  - stage: BuildPush
    displayName: "Build and push"
    condition: ne(variables['Build.Reason'], 'PullRequest') # Don't perform stage if PR triggered pipeline
    variables:
      envName: "common"

    jobs:
      - template: /templates/pipelines/dockerbuild-dashboard-client.yml@templates
        parameters:
          displayName: "Build docker image"
          deploymentName: "docker_build_push"
          dependsOn: ""

  # Dev deploy stage
  - stage: dev
    displayName: "Dev"
    dependsOn: BuildPush
    condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master'))
    variables:
      envName: "dev"

    jobs:
      - template: /templates/pipelines/webapprelease-dashboard-dev-client.yml@templates
        parameters:
          dependsOn: ""
          deploymentName: "publish_container_to_webapp"
          
  # Test deploy stage
  - stage: test
    displayName: "Test"
    dependsOn: BuildPush
    condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/develop'))

    jobs:
      - template: /templates/pipelines/webapprelease-dashboard-test-client.yml@templates
        parameters:
          dependsOn: ""
          deploymentName: "publish_container_to_webapp"

  # Prod deploy stage
  - stage: prod
    displayName: "Prod"
    dependsOn: test
    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
    variables:
      envName: "prod"

    jobs:
      - template: /templates/pipelines/webapprelease-dashboard-prod-client.yml@templates
        parameters:
          dependsOn: ""
          deploymentName: "publish_container_to_webapp"

问题

为什么Dev阶段没有运行?对我来说,dev阶段的条件未被满足,但我不知道原因。


PR 是从 master 到 dev 吗? - Shayki Abramczyk
PR 是从 feature 分支合并到 dev 分支。 - meerkat
你有这个条件:condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master')),所以它只会在源分支为master而不是feature时运行。 - Shayki Abramczyk
它不会在除了主分支之外的每个分支上运行吗?因此使用 ne 吗? - meerkat
抱歉,我的错,我以为是“eq”。 - Shayki Abramczyk
1个回答

12
在你的情况下,succeded 被评估为:

如果依赖图中所有先前的作业都成功或部分成功,则在没有参数的情况下仅评估为 True。

FrontEndTests 被跳过,因此 while 被评估为 false。
请将其更改为:
  condition: |
    and(
    or
    (
      in(dependencies.FrontEndTests.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
      in(dependencies.BuildPush.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    ),
    ne(variables['Build.SourceBranch'], 'refs/heads/master'))

我在这个案例上进行了测试,它的工作原理如上所述。

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: build
  displayName: Build
  condition: eq( variables['Build.Reason'], 'PullRequest')
  jobs:
  - job: Build
    steps:
    - bash: echo "Build"
- stage: test
  displayName: Test
  condition: succeeded()
  jobs:
  - job: Test
    steps:
    - bash: echo "Test"
- stage: test2
  displayName: Test2
  condition: |
    or(
      in(dependencies.build.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
      in(dependencies.test.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    )
  jobs:
  - job: Test2
    steps:
    - bash: echo "Test2"

1
这会产生与 condition: succeeded('previousStage') 相同的结果吗? - meerkat
不。如果您未通过 dependsOn 指定依赖项,则您的阶段将依赖于之前的所有阶段。succeeded 会为 skipped 返回 false。 - Krzysztof Madej
1
但是我有 dependsOn: BuildPush,但它仍然无法工作?带条件:成功。(来自问题) - meerkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接