6

如果消息不是以给定文本开头,我正在尝试将 Azure DevOps 设置为跳过多阶段管道上的一个阶段。

示例文档中,我认为它只是

  - stage: t1
    condition: not(startsWith(variables['Build.SourceVersionMessage'], '[maven-release-plugin]'))
    jobs:
      - job: ReleasePrepare
        displayName: Prepare release
        pool:
          vmImage: 'ubuntu-16.04'
        steps:
          - script: |
              env | sort

但是,无论如何都会执行此操作。这是一个示例,我希望根据提交消息https://dev.azure.com/trajano/experiments/_build/results?buildId=110&view=resultst1不运行任务

的输出env表明消息已正确传递

在此处输入图像描述

以防万一这是一个错误,我也在这里报告了它https://developercommunity.visualstudio.com/content/problem/697290/startswith-buildsourceversionmessage-variable-not.html

4

2 回答 2

3

看来,Build.SourceVersionMessage在这篇文章的时间只能在steps.

这是一个工作示例,它在一个步骤中将值存储在变量中,并在下一个作业中使用它(可以是 a deployment

trigger:
  batch: true
  branches:
    include:
      - master

stages:
  - stage: ci
    displayName: Continuous Integration
    jobs:
      - job: Build
        pool:
          vmImage: 'ubuntu-16.04'
        steps:
          - script: |
              env | sort
              echo "$(Build.SourceVersionMessage)"
  - stage: t1
    displayName: Release
    condition: eq(variables['Build.SourceBranch'],'refs/heads/master')
    jobs:
      - job: GetCommitMessage
        displayName: Get commit message
        steps:
          - bash: |
              echo "##vso[task.setvariable variable=commitMessage;isOutput=true]$(Build.SourceVersionMessage)"
              echo "Message is '$(Build.SourceVersionMessage)''"
            name: SetVarStep
            displayName: Store commit message in variable
      - job: ReleasePrepare
        displayName: Prepare release
        dependsOn: GetCommitMessage
        pool:
          vmImage: 'ubuntu-16.04'
        condition: not(startsWith(dependencies.GetCommitMessage.outputs['SetVarStep.commitMessage'], '[maven-release-plugin]'))
        steps:
          - script: |
              echo this would be a candidate for release
              env | sort
            displayName: Don't do it if maven release
      - job: NotReleasePrepare
        displayName: Don't Prepare Release
        dependsOn: GetCommitMessage
        pool:
          vmImage: 'ubuntu-16.04'
        condition: startsWith(dependencies.GetCommitMessage.outputs['SetVarStep.commitMessage'], '[maven-release-plugin]')
        steps:
          - script: |
              echo this not be a candidate for release because it was created by the plugin
              env | sort
            condition: startsWith(variables.commitMessage, '[maven-release-plugin]')
            displayName: Do it if maven release

构建可以在https://dev.azure.com/trajano/experiments/_build/results?buildId=133&view=logs&s=6fc7e65a-555d-5fab-c78f-9502ae9436c4&j=b5187b8c-216e-5267-fcdb-c2c33d846e05

于 2019-08-16T15:32:10.630 回答
1

如果消息不是以给定文本开头,我正在尝试将 Azure DevOps 设置为跳过一个阶段。

如果我没有误解,您想要的条件是如果消息与开头匹配maven-release-plugin,则当前阶段将排队。

如果这样,你写的条件不正确,我认为你应该指定它:

startsWith(variables['Build.SourceVersionMessage'], '[maven-release-plugin]')

正如我在管道上测试的那样:

在此处输入图像描述

事实上,这个变量的值是Deleted 121321。结果如下:

在此处输入图像描述

如您所见,跳过该阶段是成功的。我的逻辑是, 的值Build.SourceVersionMessage应该以othermessage. 但实际上,在我的管道中,它的值是Deleted 121321. 不匹配,所以跳过这个阶段。

(删除 121321 不仅是我的 PR 名称,我只是将提交消息设置为默认 PR 名称。)

更新2:

虽然我的测试逻辑没有错,但是在我用 YAML 和许多其他方法进行复现后,例如使用Build.SourceVersion只能在源拉出后得到。

是的,你说得对,Build.SourceVersionMessage在工作级别没有价值。正如我所测试的,它在工作级别上确实是无效的。

但是,不幸的是,这不是一个错误。这实际上是设计的。

我们可以认为只有 stage 作业开始执行才能将源 repos 拉到本地,对吗?你可以看到 Checkout 日志,它记录了拉取源文件的过程。

如果阶段没有被执行,源将不会被拉下。而且,如果没有拉取源,服务器也将无法获取Build.SourceVersionMessage的值,因为没有源历史记录。这就是为什么我还在Job 级别使用变量Build.SourceVersion进行测试的原因。

在此处输入图像描述

我们不能在代理作业级别使用这两个变量,因为它还没有拉取源,所以 Build.SourceVersionMessage 为空。您需要将其复制到管道中的每个步骤。这是我们的产品组团队确认的。

但是,我还是要说声对不起。抱歉,我们的文档不太清楚地宣布这不能用于代理工作级别。

于 2019-08-16T09:39:07.330 回答