【问题标题】:Edit the files with replacing string in DevOps using shell script使用 shell 脚本在 DevOps 中使用替换字符串编辑文件
【发布时间】:2021-02-03 00:41:21
【问题描述】:

我在 DevOps 中为 Azure 数据工厂创建了一个构建管道,它将从 azure 存储库中获取文件。

在部署更改之前,我想替换构建工件中某些文件中的几个字符串值。

以下是我遵循的步骤。

  1. 在存储库的根文件夹中添加了一个 shell 脚本文件。
  2. 创建了一个构建管道,指向需要部署的存储库分支。
  3. 创建了一个使用构建工件的发布管道。
  4. 在代理作业中添加了一个 shell 脚本,用于替换 repo 中文件中的几个字符串值。

以下是存储库结构的屏幕截图。

在构建管道中发布工件后,以下是管道中已发布工件的结构。

我已将示例 shell 脚本添加到已在工件中的代理作业,如下所示

在运行版本时,我收到以下关于路径的错误,如下所示

如何使用 power shell 通过替换字符串值来更新工件中的文件。有谁知道如何指向工件中的文件并运行替换脚本。如果您可以通过选择文件名来共享示例替换脚本,那将会很有帮助。

【问题讨论】:

  • 嗨,安东尼。我想为您提供另一项任务来满足您的要求,您可以查看我的答案以获取更多详细信息。如果您仍然想使用 powershell,请免费告诉我。
  • 这对部署期间的字符串替换很有帮助。
  • 我有一个查询,在 prod/UAT 实例中部署 ARM 时,假设如果管道已经在该实例中运行,那么该管道/任务会发生什么?它会被部署中断还是由 DevOps/ADF 负责? @Leo Liu-MSFT
  • 想为这个新问题打开新线程,从目前的信息来看,我无法理解你的问题。您需要打开一个新帖子以提供更具体的信息。我非常愿意帮助你。
  • @LeoLiu-MSFT 我为这个疑问创建了一个新线程。请看看 [stackoverflow.com/questions/64531318/…

标签: azure azure-devops azure-data-factory azure-data-factory-2


【解决方案1】:

如何使用 power shell 通过替换字符串值来更新工件中的文件。有谁知道如何指向工件中的文件并运行替换脚本。

有一个很棒的扩展 Replace Tokens 可以满足您的要求。

通过此任务,您可以直接选择要替换字符串的文件:

我们只需要将 .json 文件中的变量替换为 repo 中的#{VarValue1}# 格式即可:

喜欢:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "storageAccounts_leoteststorageaccount_name": {
            "defaultValue": "#{TestValue}#",
            "type": "String"
        }
    },

然后在变量选项卡上定义键的值:

测试结果是:

这个方法很简单,不需要考虑文件路径,可以试试。

【讨论】:

  • 这是我的问题的替代解决方案。
【解决方案2】:

您在发布管道中的 powershell 任务中看到的上述错误是因为您将 script path 指向 .sh1 文件,而 powershell 任务需要 .ps1 文件。即使您在script path 字段中指定的路径值是正确的,如果文件不是 .ps1 文件,powershell 任务仍然会失败并出现错误。

如果脚本是 bash 脚本,你应该使用 Bash 任务而不是 powershell 任务。

您可以在 powershell 脚本中查看以下简单示例,以替换工件文件中的 json 值。见this thread

$json = Convertfrom-json (get-content "_Source_alias\artifactsName\arm_template.json")

$json.parameter.value = $(PipelineVariables)

ConvertTo-Json $json -Depth 4 | Out-File _Source_alias\artifactsName\arm_template.json -Force

如果您使用 ARM template deployment task 部署 arm 模板。此任务允许您通过配置Template parameters 字段和Override template parameters 字段来替换模板参数。见下文:

【讨论】:

    【解决方案3】:

    在 shell 脚本中,我无法转到 repo 文件位置来替换字符串值。如何从shell脚本文件重定向到repo的根目录?

    请使用 workingDirectory 导航到您要执行脚本的位置。

    - task: PowerShell@2
      inputs:
        filePath: '$(System.DefaultWorkingDirectory)\scripts\script.ps1'
        workingDirectory: '$(System.DefaultWorkingDirectory)\templates\'
    

    您需要记住的是为您的脚本提供完全限定的位置,并为您的 arm 文件所在的目录设置工作目录。

    如果您正在寻找其他方法,您总是可以考虑在您的手臂模板中创建参数,而不是替换值,只需将它们作为那些参数传递。

    上述步骤对于替换字符串值是否正确,还是我们需要先发布构建,然后从工件中替换文件?

    这一切都取决于你。您可以在创建工件之前替换 arm 文件中的字符串,或者在运行它们之前在发布管道上替换字符串。您可能会问自己的问题:

    • 在发布工件之前,我是否会在替换字符串中存储一些秘密
    • 当我替换字符串时,我是否能够将这些字符串部署到任何环境,或者我需要再次进行替换

    但是,请考虑添加参数。也许这是最好的方法。

    【讨论】:

    • 我想在从工件构建后替换字符串。更新了问题,请看一下。
    • 你的 paramchanges.sh1 想做什么?你有一块 YAML。而且您可能会遇到错误,因为您将 sh1 文件放在了 powershell 任务中。但是我真的不明白你想用这个 paramchanges.sh1 实现什么。
    • powershell 脚本应该转到 arm_template.json 和 arm_template_parameters.json 文件并替换这些文件中的字符串
    • 我有一个查询,在 prod/UAT 实例中部署 ARM 时,假设如果管道已经在该实例中运行,那么该管道/任务会发生什么?它会被部署中断还是由 DevOps/ADF 负责? @Krzysztof Madej
    • 这一切都取决于。因为某些基础设施部署实际上可能会删除并创建资源。我宁愿避免同时部署基础设施和代码。这风险太大,后果难以预测。
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2014-11-29
    • 2016-09-03
    • 2021-09-07
    相关资源
    最近更新 更多