【问题标题】:Skipped pipeline stage in Azure devops在 Azure devops 中跳过管道阶段
【发布时间】:2021-03-18 19:29:30
【问题描述】:

问题

当触发下面的管道时,构建和推送之后不会运行Dev阶段。

管道由 PR 触发,以 develop 作为目标分支。

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?
  • PR 是从功能分支到开发。
  • 你有这个条件:`条件:and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master'))` 所以它只会运行源分支是master,而不是feature
  • 它不会为除 master 之外的所有其他分支运行吗?因此ne?
  • 糟糕,我的错,我以为是‘eq’

标签: azure docker azure-devops azure-pipelines


【解决方案1】:

在您的情况下,succeded 被评估为

不带参数,仅当依赖关系图中的所有先前作业都成功或部分成功时才计算为 True。

FrontEndTests 被跳过,因此被评估为假。

请改成

  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"

【讨论】:

  • 这会产生与 condition: succeeded('previousStage') 相同的结果吗?
  • 没有。如果您不指定依赖(通过dependsOn),您的阶段将依赖于之前的所有阶段。 succeeded 给你错误的 skipped
  • 但是我有dependsOn: BuildPush,但它仍然无法正常工作?有条件:成功。 (来自问题)