我创建了powershell脚本来使用变量更新json文件。 Json文件位于Azure devops存储库中,json文件名为var.json。 我将在azure devops中使用此解决方案,因此我建立了管道并在azure devops的变量选项卡中设置测试变量:
在我的脚本中,我具有参数和变量块,如下所示:
param(
[Parameter (Mandatory=$true)]
[String] $FileRes
)
#env variable
$Path = $Env:BUILD_SOURCESDIRECTORY
# Download variables from Json file
$JsonBase = @()
$JsonPath = "$Path\Var.json"
$JsonBase = Get-Content $JsonPath | out-string | ConvertFrom-Json
$JsonBase.FileNames[0].value = $FileRes
在我的脚本中,我使用命令:$JsonBase | ConvertTo-Json | Set-Content -Path $JsonPath
将输出定向到json文件。
Json文件结构:
{
"FileNames": [
{
"value": "AAAbbbccc123",
"value1": "www",
"value3": "swd",
"value4": "xvb"
}
]
}
管道末端的状态正常,所有步骤均为绿色,但是var.json文件未根据需要更新。仍然有旧值-> "value": "AAAbbbccc123"
答案 0 :(得分:1)
实际上,它已被替换,但是您需要在输出存储库中看到此更改。
为清楚起见,您可以使用私有代理来运行此版本。然后转到相应的本地存储库,并在构建完成后检查Var.json
文件:
在脚本中,您Set-Content
进入$(Build.SourcesDirectory)\Var.json
下的文件,而不是VSTS repos
中存储的文件。因此,要检查它是否被成功替换,请转到您的output repos
,即代理人。
有时,如果您使用的是托管代理,则您可能无法查看详细的输出存储库,因为在管道完成后,主机映像将由服务器回收。
这时,您可以在其中添加另一个脚本以打印出JSON文件内容,然后可以检查它是否被成功替换:
$content= Get-Content -Path $JsonPath
Write-Host $content
此外,请对脚本进行一些更改:
$JsonBase.FileNames[0].value = "$(FileRes)"
由于您在变量标签中指定了值,因此请使用$(FileRes)
而不是$FileRes
。并且不要忘记双引号""
。
更新:
要将输出存储库更改同步回VSTS存储库,请尝试按照以下步骤操作:
(1)第一个命令行任务:
git config --global user.email "xxx@xx.com"
git config --global user.name "Merlin"
cd $(Build.SourcesDirectory)
git init
(2)在powershell任务中,执行set-content
脚本。
(3)在第二个命令行任务中,执行git push
以推送更改:
git add Var.json
git commit -m "aaaa"
git remote rm origin
git remote add origin https://xxx@dev.azure.com/xxx/xxx/_git/xxxx
git push -u origin HEAD:master
此外,要在管道中成功运行git脚本。除了启用“允许脚本访问........”之外,您还应该遵循此permission setting.