【问题标题】:Azure DevOps: Ensure Production stage can only be released from the master branch of the repositoryAzure DevOps:确保生产阶段只能从存储库的主分支发布
【发布时间】:2020-07-15 16:23:24
【问题描述】:

我有一个包含通常阶段的发布管道

开发 -> 测试 -> 预生产 -> 生产

我想知道是否有办法确保只有 master 分支可以一直提升到生产环境,以避免从功能发布和开发分支到生产环境结束。

【问题讨论】:

  • 您使用的是经典管道还是 YAML 管道?你做了什么研究?
  • 您可以在stage的Continuous deployment Trigger上使用分支过滤器,只允许从master分支释放。请查看以下答案。

标签: azure-devops azure-pipelines devops


【解决方案1】:

YAML 管道

如果您使用的是基于 YAML 的管道,则可以使用 Checks + Approval Gates 功能添加分支策略检查。

  1. 创建一个Environment for each deployment environment
  2. 构建您的 YAML 管道以使用指定环境的部署作业
stages:
- stage: build
- stage: dev
- stage: test
- stage: preprod
- stage: prod

您可以在阶段上设置条件以确保满足分支条件。

- stage: production
  dependsOn: preprod
  condition: |
    and(
      succeeded('preprod'),
      or(
        eq(variables['Build.SourceBranch'], 'refs/heads/main'),
        startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'),
        startsWith(variables['Build.SourceBranch'], 'refs/heads/hotfix/')
      )         
    )
  1. 确保执行部署活动的每个阶段都有一个Deployment Job
- deployment: deploy
  displayName: 'Deploy'
  environment: 'Production'
  strategy:
    runonce:
      deploy:
        steps:
        - pwsh: Write-Host 'Deployment Steps go here!'
  1. 在您的生产环境中,添加 Branch Control check:

经典发布管道

如果您使用的是经典发布管道,则可以添加工件过滤器以防止管道排队,但这些并不强制阶段不能手动运行或覆盖这些过滤器。

如果您真的想阻止发布,即使有人手动覆盖了工件过滤器,您也可以通过检查它是否是脚本中的正确分支来使构建失败。

$currentBranch = "$(Release.Artifacts.MyAlias.SourceBranch)" 
if ( $currentBranch -ne "refs/heads/main" )
{
    Write-Host "##vso[task.logissue type=error]This release must originate from the main branch. Current branch: $currentBranch"
    Exit 1
}

【讨论】:

  • 示例eq(variables['Build.SourceBranch', 'refs/heads/main'), 中有一个小错字,其中缺少右括号。 (变量['Build.SourceBranch')
【解决方案2】:

@paddingtonMike,

这是 ADO Release Pipelines 的核心功能,您可以通过多种方式完成;但是,最常见的是修改工件的来源。

我强烈建议您花一些时间来学习 ADO 发布管道。这是一个很好的入门资源:

Learn - Create Release Pipeline

【讨论】:

  • 这只是将master设置为默认使用的分支。它不会阻止您将工件更改为使用存储库中的不同分支生成的工件
【解决方案3】:

您可以在持续部署触发器上设置分支过滤器,见下文:

点击Artifacts部分中突出显示的trigger图标打开触发面板-->Enabled持续部署触发-->设置分支过滤器只包含主分支。

当您如上所述设置发布管道持续部署触发器时。只有从 master 分支生成的工件才能触发发布管道。

您还可以为每个阶段设置工件过滤器,以确保只有来自特定分支的工件可以部署到此阶段。见下文:

您可以查看this document 了解有关经典 CD 管道的更多信息。

【讨论】:

    【解决方案4】:

    我不知道有什么方法可以防止从非主分支创建部署。也就是说,Levi 的回答将阻止自动创建或部署版本。除此之外,您还可以为部署设置必需的审核者,这将保证未经授权部署人员的批准不会发布任何版本。

    (Levi分享的链接的具体部分)https://docs.microsoft.com/en-us/azure/devops/pipelines/release/define-multistage-release-process?view=azure-devops#add-pre-deployment-approvals

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多