我有一个Azure Function项目。它包括local.settings.json配置文件,其中包含一些秘密。xUnit测试项目检索并使用这些值。在Visual Studio上运行时,一切都很好,但在Azure构建管道中,不会注入值,并且文件包含原始占位符值。local.settings.json文件的Build Action为";内容";,并复制到输出目录作为"输出目录";如果更新则复制";。在管道中,我使用"文件转换"任务来注入值。这是我的管道的一部分:
- task: FileTransform@1
inputs:
folderPath: '$(System.DefaultWorkingDirectory)/ProjectName'
fileType: 'json'
targetFiles: 'local.settings.json'
- task: DotNetCoreCLI@2
displayName: 'DotNet Build Projects'
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: --configuration $(buildConfiguration)
- task: DotNetCoreCLI@2
displayName: 'Run Unit Tests'
inputs:
command: 'test'
projects: '**/ProjectName.Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Build.SourcesDirectory)/TestResults/Coverage/'
publishTestResults: true
我做错了什么?
不确定json文件的结构以及变量的定义方式。但根据您的描述,变量值并没有注入到local.settings.json
中。变量的定义似乎不正确,或者在运行管道的过程中找不到json文件。
在targetFiles
字段中,直接或相对地提供json文件路径,因此,如果您在第一个字段中给定的文件夹路径中有多个appsettings文件,则给定相对路径将看到所有设置的json文件,如下所示:'**/settings.json'
。
文件转换任务将根据与设置json文件中字段匹配的变量名称,从可用变量更新设置json中的字段。例如,将下面的json文件作为我们的应用程序设置json文件:
{
"customFunctions": [],
"importedLibraries": [],
"firstResource": "",
"groupOne": {
"firstFieldInOne": "Test",
"name": "DemoApp"
},
"groupTwo": {
"nameTwo": "TestValue2",
"idTwo": ""
},
"runtimeSettings": {
"storage": "",
"telemetry": {
"instrumentationKey": ""
}
}
}
在这个appsettings文件中,如果你想替换json文件的父元素,那么你应该在yaml管道内添加变量,或者作为一个具有元素名称的管道变量-例如,要更新'firstResource'
字段,你需要创建一个名为firstResource
的变量。
如果要更新内部子元素,则必须创建以点(.
(分隔路径值的变量。例如,要更新元素groupOne
的子元素firstFieldInOne
字段,我们必须创建一个名为groupOne.firstFieldInOne
的变量
因此,对于以上两个值的更新,我们必须在yaml或管道变量中创建以下变量:
variables:
firstResource: "firstResourceValue"
groupOne.firstFieldInOne: "FirstField Value"