【问题标题】:Skipping stage based on commit message根据提交消息跳过阶段
【发布时间】:2019-08-16 07:00:36
【问题描述】:

如果消息不是以给定文本开头,我正在尝试将 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

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

env的输出显示消息正确传入

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

【问题讨论】:

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


    【解决方案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中找到

    【讨论】:

    • 感谢代码。奇迹般有效!似乎文档已在 BuildSourceVersion 上更新,它现在明确声明它仅在步骤级别可用
    【解决方案2】:

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

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

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

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

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

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

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

    (删除121321不只是我的PR名,我只是把commit message设置为默认的PR名。)

    更新 2:

    虽然我的测试逻辑没有错,但是在我用YAML复现后和很多其他方法测试过,比如使用Build.SourceVersion,只有拉取源才能得到。

    是的,你是对的关于 Build.SourceVersionMessage 在工作级别没有价值。经过我的测试,它确实在工作级别 null

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

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

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

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

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

    【讨论】:

    • 你误会了。如果它不以给定文本开头,我希望它跳过。其次,我希望它来自 commit message 而不是 PR 标题
    • 为了证明这不仅仅是我的pr名,我使用powershell将变量值打印出来。查看我的更新内容。另外,SKIP if it doesn't start with a given text是不是意味着如果它是一个给定的文本就不会跳过,会执行这个阶段?
    • 它存在于 shell 中。但是,如果您可以提供一个示例公共管道,至少我可以与我的进行比较。
    • 我在我的env | sort 输出中看到了BUILD_SOURCEVERSIONMESSAGE,所以至少我知道它存在,但它不在舞台级别
    • 它在“工作”级别上也是空的,而不仅仅是在“阶段”级别上。所以只需指出它仅在“步骤”级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2012-06-27
    • 2020-05-07
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多