基于提交消息的跳过阶段

时间:2019-08-16 07:00:36

标签: azure-devops azure-pipelines multistage-pipeline

如果消息不是以给定的文本开头,我试图将Azure DevOps设置为跳过multi-stage pipeline上的阶段。

examples documentation开始,我认为它只是

  - 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=results

不运行t1任务

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

  

我正在尝试将Azure DevOps设置为如果没有显示消息则跳过一个阶段   从给定的文本开始。

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

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

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

当我在管道上进行测试时:

enter image description here

实际上,此变量的值为已删除121321 。结果如下:

enter image description here

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

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

更新2:

虽然我的测试逻辑并不正确,但是在使用YAML和许多其他经过测试的方法(例如使用 Build.SourceVersion )进行复制之后,该方法只能在提取源之后才能获得。

是的,您是正确的,因为 Build.SourceVersionMessage 在作业级别没有价值。经过我的测试,它确实在工作级别上为 null

但是,不幸的是,这不是错误。这是事实所设计的。

我们可以认为仅在阶段作业开始执行时才将源存储库拉到本地,对吗?您可以看到Checkout日志,其中记录了下拉源文件的过程。

如果不执行该阶段,则不会下拉源。但是,如果没有拉取任何源,则服务器也将由于没有源历史而无法获得 Build.SourceVersionMessage 的值。这就是为什么我还要在作业级别使用变量 Build.SourceVersion 进行测试的原因。

enter image description here

我们不能在代理作业级别使用这两个变量,因为它尚未提取源,因此Build.SourceVersionMessage为null。您需要将其复制到管道中的每个步骤。这是我们的产品组团队确认的结果。

但是,我仍然需要对不起。抱歉,我们的文档不太清楚,无法宣布无法在座席工作级别使用。

答案 1 :(得分:1)

看来Build.SourceVersionMessage在这篇文章发表时只能在steps上解决。

这是一个工作示例,将值一步存储在变量中,并在下一个作业(可以是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

中找到该版本