问题描述
在Azure DevOps中需要构建和部署一个ClickOnce应用程序。由于该应用程序需要签名(包括配置文件),用户必须为staging和production分别创建构建。
用户决定使用两个任务创建一个包含两个构建的artifact:
目前,用户正在使用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的转换任务都添加到管道定义中,然后只有在需要时才有条件地运行所需的步骤。你可以根据源分支(可能更好)或在排队时设置的变量来决定条件。
你需要决定条件是什么。例如,你可以根据源分支来做决定(可能更好),或者只是一个可以在排队时设置的变量。
请注意,使用自定义条件可能会导致构建时间变长,因为所有任务都会被执行,但只有满足条件的任务才会运行。
以上是解决这个问题的两种方案,你可以根据自己的需求选择其中一种。希望对你有所帮助!