【问题标题】:Allow PR Build Validation builds without publishing artifacts允许 PR Build Validation 构建而不发布工件
【发布时间】:2023-12-24 04:33:01
【问题描述】:

我正在尝试在我们的主分支上为 PR 设置一些构建验证(我们正在使用 Git 和 VSTS)。我添加了一些构建策略来启动各种构建,具体取决于哪些文件已更改。对于一些背景知识,我们在流程的早期创建 PR,以便我们可以跟踪更改并在我们的功能分支开发时添加 cmets。

现在,我希望这些构建运行并成功以完成 PR,但是,我不希望发布这些构建的输出(工件)。我们的发布着眼于要部署的最新构建工件,在这种情况下,最新的构建工件将来自 PR。如果我们确实允许发布来自 PR 的这些构建工件,那么我们会将功能分支代码(来自 PR)发布到我们的主站点,这是不可取的(我们有一个单独的发布来处理我们的功能分支机构)。

基本上,在进行 PR 时,我只想运行构建以确保一切都符合要求,然后在构建完成后将其丢弃。

除了为 PR 验证创建构建定义之外,我不确定我能做什么。我用谷歌搜索并四处询问,但我要么没有问正确的问题,要么答案没有我希望的那么简单。

希望我已经包含了足够的细节来解释我的问题。

TL;DR

如何在 PR 上运行构建验证,而无需发布获取并部署验证构建产生的构建工件?

编辑(更多细节)

我尝试向发布任务添加条件(也尝试将发布置于一个阶段并有条件地运行它)。但是,当我发布新版本时,它仍然会看到运行的构建定义。现在,我想如果我尝试发布该构建定义,它会失败,因为没有创建工件。但是我什至不想在发布时看到该构建定义(不想意外选择它)。

【问题讨论】:

    标签: git azure-devops azure-pipelines azure-pipelines-release-pipeline


    【解决方案1】:

    您可以将 Publish Artifact 任务放在自己的阶段,然后在构建定义的末尾使用“运行此阶段”和“使用变量表达式的自定义条件”。您也可以按照 Dan 在下面评论中的建议在任务级别执行此操作。

    not(eq(variables['Build.Reason'], 'PullRequest'))

    https://docs.microsoft.com/en-us/vsts/pipelines/process/conditions?view=vsts

    【讨论】:

    • 为什么不把条件放在任务本身而不是为它创建一个完整的单独阶段?
    • 哦,那也行,我没有意识到变量表达式可以在任务级别使用。
    • 试过了,它适用于不创建工件,但发布仍然看到要使用的构建定义。编辑问题来代表这一点。
    • 发布工件仍然看到要使用的构建定义是什么意思?发布工件任务是构建定义的一部分。你的意思是发布吗?
    • @Andrew 您是否通过在发布管道中选择工件来尝试将默认版本值选项设置为“带有标签的构建管道默认分支的最新版本”?它将选择默认分支创建的工件,并在创建发布时忽略所有其他工件
    【解决方案2】:

    您可以使用多个选项来跳过发布工件以进行 PR 构建验证。

    选项 1:使用单独的构建定义进行 PR 构建验证

    您可以克隆当前构建定义,并将克隆的构建定义单独用于 PR 构建验证。

    在克隆的构建定义中,您可以删除不希望执行 PR 构建验证的任务(例如删除 Publish Build Artifacts 任务)。

    选项 2:使用客户条件跳过执行 Publish Build Artifacts 任务

    或者您可以将custom conditions 用于您想要有条件地运行的任务(正如 Calidus 和 Daniel 提到的那样)。

    如为 Publish Build Artifacts 任务添加以下自定义条件(如果构建用于 PR 验证,则不执行该任务):

    ne(variables['Build.Reason'], 'PullRequest')
    

    【讨论】:

    • 尝试了选项 2,它适用于不创建工件,但发布仍然看到要使用的构建定义。编辑问题来代表这一点。我想避免为合并创建新的构建定义。
    • 当 PR 合并到目标分支时,选项 1 有什么办法不运行两个构建定义?