如何在Azure DevOps中为staging和production安排构建

109次阅读
没有评论

问题描述

在Azure DevOps中需要构建和部署一个ClickOnce应用程序。由于该应用程序需要签名(包括配置文件),用户必须为staging和production分别创建构建。
用户决定使用两个任务创建一个包含两个构建的artifact:
如何在Azure DevOps中为staging和production安排构建
目前,用户正在使用XML转换来应用特定的staging或production设置,这个方法运行良好,但用户希望能够使用Azure DevOps内置的变量替换系统。用户已经在部署部分中使用了这个系统来部署所有的IIS项目,但在构建管道部分无法实现这一点。
用户想知道该怎么办?是否应该创建两个独立的构建和两个独立的artifact?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Azure DevOps中,可以通过在脚本中设置作业范围变量来实现变量替换。在你定义的每个Agent Job的上下文中,你可以添加一个PowerShell任务,用于设置变量,然后在xml中使用这些变量进行自动变量替换。
以下是使用YAML定义的示例,它直接在yaml中创建作业范围变量。下面的示例是针对JSON文件进行替换,但对于xml来说,概念是类似的。
这是它要替换的Json文件test.json

{
    "menu": {
        "id": "file",
        "value": "File"
    }
}
trigger:
- master
pool:
  vmImage: 'ubuntu-latest'
jobs:
- job: Production
  variables:
    - name: menu.id # Substituting this value in test.json
      value: 'productionValue'
  steps:
    - task: FileTransform@1
      displayName: 'File Transform:'
      inputs:
        folderPath: '$(System.DefaultWorkingDirectory)'
        fileType: json
        targetFiles: test.json
    - task: PowerShell@2
      inputs:
          targetType: 'inline'
          script: |
            Get-Content -Path test.json
- job: Staging
  variables:
    - name: menu.id  # Substituting this value in test.json
      value: 'stagingValue'
  steps:
    - task: FileTransform@1
      displayName: 'File Transform:'
      inputs:
        folderPath: '$(System.DefaultWorkingDirectory)'
        fileType: json
        targetFiles: test.json
    - task: PowerShell@2
      inputs:
          targetType: 'inline'
          script: |
            Get-Content -Path test.json

方案2

另一种方法是使用Azure DevOps提供的任务级别的自定义条件。你可以将Stage和Production的转换任务都添加到管道定义中,然后只有在需要时才有条件地运行所需的步骤。你可以根据源分支(可能更好)或在排队时设置的变量来决定条件。
你需要决定条件是什么。例如,你可以根据源分支来做决定(可能更好),或者只是一个可以在排队时设置的变量。
请注意,使用自定义条件可能会导致构建时间变长,因为所有任务都会被执行,但只有满足条件的任务才会运行。
以上是解决这个问题的两种方案,你可以根据自己的需求选择其中一种。希望对你有所帮助!

正文完