Azure DevOps - 更新JSON文件 - PowerShell脚本

3
我已经创建了powershell脚本来更新json文件中的变量。Json文件位于Azure DevOps存储库中,文件名为var.json。 我将在Azure DevOps中使用此解决方案,因此我构建了管道并在Azure DevOps的变量选项卡中设置了测试变量:

enter image description here

在我的脚本中,我有param和variables块,如下所示:
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"

如果你将它改成"test" | ConvertTo-Json | Set-Content -Path $JsonPath,会发生什么? - Tomalak
在这种情况下,脚本将覆盖JSON文件内容,JSON文件的内容将是“test”。 - tester81
好的,所以设置文件内容的那行代码是有效的并且正在执行。这只能说明一件事,改变数据的那行代码没有被执行,或者它并没有做你认为它应该做的事情。当我使用你在这里提供的示例代码时,它可以正常工作。这意味着你真正的代码与你在这里提出的问题不同。 - Tomalak
问题在于我也在本地笔记本电脑上测试了这段代码,它可以正常工作。但是在Azure DevOps上无法运行。 - tester81
@Tomalak - 你在Azure DevOps上还是本地测试了你的代码? - tester81
显示剩余5条评论
1个回答

2
实际上,它已经被替换了,但您需要在输出存储库中查看这个更改。
为了更清晰地了解情况,您可以使用私有代理来运行此构建。然后在构建完成后前往相应的本地存储库并检查Var.json文件。

enter image description here

在你的脚本中,你使用了Set-Content命令将内容写入位于$(Build.SourcesDirectory)\Var.json路径下的文件,而不是存储在VSTS repos中的文件。因此,要检查是否成功替换,请前往代理中的output repos
有时,如果你使用的是托管代理,可能无法查看详细的输出库,因为主机映像将在流水线完成后被服务器回收。
此时,您可以添加另一个脚本来打印JSON文件的内容,然后您就可以检查是否已成功替换:
$content= Get-Content -Path $JsonPath
Write-Host $content

enter image description here


另外,请在您的脚本中进行小小的更改:
$JsonBase.FileNames[0].value = "$(FileRes)"

请使用$(FileRes)而不是$FileRes,因为您在变量选项卡中指定了值。并且不要忘记双引号""
更新:
要将输出存储库同步回VSTS存储库,请尝试以下操作:

enter image description here

第一个命令行任务:
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

enter image description here

此外,在流水线中成功运行 git 脚本。除了启用“允许脚本访问......”之外,您还应遵循此权限设置。

为了将json文件更改推送到devops Repo,我决定在我的流水线中添加一个单独的任务,即powershell任务。在内联脚本部分,我粘贴了以下代码:git config --global user.email "xxx@no-mail.com" git config --global user.name "xxx" git add var.json git commit -m "Json file update" git push。我使用了选项:“允许脚本访问OAuth令牌”,但由于错误而面临困难。这个git代码块是正确的还是应该添加一些东西? - tester81
@tester81 看起来很有道理。它完全成功了吗? - Mengdi Liang
@tester81,你的脚本块中有一些东西缺失了。我已经更新了我的答案,请检查我的更新答案。 - Mengdi Liang
我添加了所有必要的权限,使用链接 - https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/git-commands?view=azure-devops&tabs=yaml。我按照您的建议创建了CMD任务,第1和第2个任务已成功完成,但第3个任务出现了问题-->“fatal: could not read Username for 'https://dev.azure.com': terminal prompts disabled”。我的第一个任务包含以下行:git config --global user.email "agent@no-mail.com" git config --global user.name "Robot Agent" cd $(Build.SourcesDirectory) git init - tester81
@tester81。太棒了!非常欢迎您:-)很高兴能为您提供帮助。 - Mengdi Liang
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接