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"
}
我希望有人能帮我解决这个让我抓狂的问题。
我有一个正在学习的基本测试基础设施。
我有一个运行 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
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"
}