Azure 管道在构建过程中替换 json 键值

Azure pipeline replace json key value during build process

我希望有人能帮我解决这个让我抓狂的问题。

我有一个正在学习的基本测试基础设施。

我有一个运行 Microsoft(教程)网站的基本 Web 应用程序。

在我的项目中,我有一个 json 文件,我曾在该文件上手动更新代码版本以始终匹配 GitHub 上的标签。需要说明的是,这是一个基本的 version.json 文件,版本为:

{
    "app": {
      "name": "TestingInfra",
      "service": "TestInfraConfiguration",
      "version": "vX.X.X"
    }
}

当我准备部署时,我在 GitHub 中创建一个标签并手动更新 version 编号以匹配 GitHub 存储库,然后我推送。

在这个阶段手动执行此操作有点烦人,所以我想在 json 中自动执行该值的 sed 以自动从我的 repo 中选择标签。

作为第一步,在我的管道 yaml 文件中我有这个配置

- powershell: |
      # Write your PowerShell commands here.
      
      Write-Host "Update Build.BuildNumber"
      cd $(System.DefaultWorkingDirectory)
      $Latesttag = $(git describe --tags $(git rev-list --tags --max-count=1))
      Write-Host "The latest git tag is $Latesttag "
      Write-Host
      "##vso[build.updatebuildNumber]$Latesttag"
  - bash: |
      version=$Latesttag
      sed -i "s|$version|$version|g" ./version.json
      cat ./version.json

在 PowerShell 任务中,我用 GitHub 中的标签覆盖了代理的 BuildNumber。这非常有效。 我想做的是使用 Powershell 中的相同 $Latesttag,并替换 version.json

中的 json 文件 version

管道不会像这样失败,但也不会更新版本占位符。

任何人都可以帮助理解如何实现这一目标吗?

如果有什么不清楚的地方,请询问更多信息,我很乐意提供尽可能多的细节

看看这是否能让您更接近期望的行为。请注意代码中解释更改的注释。

- powershell: |
    Write-Host "Update Build.BuildNumber"
    cd $(System.DefaultWorkingDirectory)

    # Pretend the latest tag is v2.0.0
    $Latesttag = "v2.0.0"
    Write-Host "The latest git tag is $Latesttag "

    # *** Note change in this command compared to original post
    Write-Host "##vso[task.setvariable variable=LATEST_TAG]$Latesttag"

- bash: |
    # Pretend that you want to update v1.0.0 in version.json 
    # to the latest tag (v2.0.0) derived in the powershell step
    cat > ./version.json << EOF
    {
      "app": {
        "name": "TestingInfra",
        "service": "TestInfraConfiguration",
        "version": "v1.0.0"
      }
    }
    EOF
    echo "version.json - BEFORE CHANGE:"
    cat ./version.json

     # Do replace
    sed -i "s|v1.0.0|$LATEST_TAG|g" ./version.json
    
    # Verify change
    echo "version.json - AFTER CHANGE:"
    cat ./version.json

输出:

Starting: Bash
==============================================================================
Task         : Bash
Description  : Run a Bash script on macOS, Linux, or Windows
Version      : 3.201.1
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash
==============================================================================
Generating script.
========================== Starting Command Output ===========================
/usr/bin/bash /home/vsts/work/_temp/dheudhwj345-737-shej34.sh
version.json - BEFORE CHANGE:
{
  "app": {
    "name": "TestingInfra",
    "service": "TestInfraConfiguration",
    "version": "v1.0.0"
  }
}
version.json - AFTER CHANGE:
{
  "app": {
    "name": "TestingInfra",
    "service": "TestInfraConfiguration",
    "version": "v2.0.0"
  }
}
Finishing: Bash

您可以使用 File Transform Azure.

我在 pipelines.yml

中做了类似下面的事情
variables
  buildNumber: '$(Build.BuildNumber)'
  ... other code
  steps:
      - task: FileTransform@1
        inputs:
          folderPath: '$(System.DefaultWorkingDirectory)/drop'
          fileType: 'json'
          targetFiles: 'assets/json/version.json'

我在 assets/json/version.json 中有一个文件,如下所示

{
    "buildNumber" : ""
}

在管道的步骤之后,它将用正确的数字替换内部版本号变量

构建后

{
    "buildNumber" : "2022.4.13.2"
}