【问题标题】:How to Create Environment Variables and alter a JSON file using Power Shell Script Plugin through Jenkins如何通过 Jenkins 使用 Power Shell 脚本插件创建环境变量和更改 JSON 文件
【发布时间】:2018-08-20 17:27:35
【问题描述】:

我在%Workspace%\solution\config\appsettings.json 有以下 JSON 文件

{
"appName": "Test",
"appId": "1",
"env" : "Test",
"url" : "https://url.com",
"client_id": "",
"client_secret": "",
"QAEmail" : "itteam@email.com",
"Preuri" : "https://preuri.com",
"Ravuri" : "https://Ravuri.com",
"Q&A"    : "https://QandA.com"
}

由于安全问题,我无法将客户端 ID 和客户端密码提交给 git,但我需要它们通过 Jenkins 运行我的 API 测试脚本。

所以我们需要使用环境变量将上面的 json 文件更改为以下一个。我创建了两个带有秘密文本CLIENT_IDCLIENT_SECRET 的全局凭据。

有人可以帮我写一个windows批处理命令,用CLIENT_IDCLIENT_SECRET替换上面的json文件吗?

例如如果CLIENT_ID = 123456CLIENT_SECRET = 654321,json文件应该改成如下。

{
"appName": "Test",
"appId": "1",
"env" : "Test",
"url" : "https://url.com",
"client_id": "123456",
"client_secret": "654321",
"QAEmail" : "itteam@email.com",
"Preuri" : "https://preuri.com",
"Ravuri" : "https://Ravuri.com",
"Q&A"    : "https://QandA.com"
}

任何帮助将不胜感激。

【问题讨论】:

标签: json shell powershell jenkins jenkins-plugins


【解决方案1】:

我给你写了一个小脚本:

set "file=test.json"
set "tmpF=%TEMP%\appsettingsJSON_%time:~9,2%.json"
set "tab=    "
for /F "tokens=1* delims=: " %%V in (%file%) do if %%V=="client_id" ( echo %tab%%%V:"%CLIENT_ID%">>%tmpF% ) else ( if %%V=="client_secret" ( echo %tab%%%V:"%CLIENT_SECRET%">>%tmpF% ) else ( if [%%W]==[] ( echo %%V>>%tmpF% ) else ( echo %tab%%%V:%%W>>%tmpF% ) ) )
move "%tmpF%" "%file%"

为我工作,您必须将“test.json”替换为您的 json 文件的路径

【讨论】:

  • 我稍微改变了我的 json 文件,同样的脚本也适用于上述 json 文件吗?
  • 是的,它仍然有效。 (但它仍然添加了您在第一个示例中拥有的选项卡。JSON 与选项卡的工作方式相同(并且看起来更好),但如果您想删除它们,只需将选项卡设置为空字符串 set "tab="
  • 我可以在 jenkins 中使用执行 shell 脚本还是需要安装任何插件来运行这个脚本?当我使用执行 shell 脚本 C:\Program Files (x86)\Jenkins\workspace\AfsAutomation_Test>exit 0 [AfsAutomation_Test] $ sh -xe C:\Users\por\AppData\Local\Temp 时出现以下错误\jenkins6457885774024126472.sh 系统找不到指定的文件 原因:java.io.IOException: Cannot run program "sh" (in directory "C:\Program Files (x86)\Jenkins\workspace\AfsAutomation_Test"): CreateProcess error=2 , 系统找不到文件spec
  • öhm...这是一个批处理脚本。我发现这个问题是因为标签“batch-file”,它的标题是“How to make Changes to a json file using windows batch command in jenkins”...
【解决方案2】:

实际上,我尝试过这种方式并且像魔术一样工作。

第 1 步:如下所示替换您的 JSON 文件

{
"appName": "Test",
"appId": "1",
"env" : "Test",
"url" : "https://url.com",
"client_id": "CLIENT_ID_VALUE",
"client_secret": "CLIENT_SECRET_VALUE",
"QAEmail" : "itteam@email.com",
"Preuri" : "https://preuri.com",
"Ravuri" : "https://Ravuri.com",
"Q&A"    : "https://QandA.com"
}

第 2 步: 将以下插件安装到 Jenkins

   **1)** Credentials plugin 

   **2)** Credential Binding Plugin

   **3)** Windows Power Shell Plugin

第 3 步: 创建密钥文本并使用凭据插件定义您的值 Client_Id = "12345", Client_Secret = "54321"(您可以在 Jenkins 的左侧找到它,您可以在其中找到将创建一个新工作)。现在使用绑定选项卡创建环境变量“CLIENT_ID_VALUE”和“CLIENT_SECRET_VALUE”。

第 4 步:现在添加一个步骤来执行 Windows Power Shell 并将以下脚本写入其中

(gc 'C:\Documents\application.json') -replace 'CLIENT_ID_VALUE', $env:CLIENT_ID_VALUE | Out-File 'C:\Documents\application.json'

(gc 'C:\Documents\application.json') -replace 'CLIENT_SECRET_VALUE', $env:CLIENT_SECRET_VALUE | Out-File
 'C:\Documents\application.json'

【讨论】:

    【解决方案3】:
    @echo off
    setlocal EnableDelayedExpansion
    
    set "Field[CLIENT_ID]=123456"
    set "Field[CLIENT_SECRET]=654321"
    
    for /F "tokens=1,2 delims=: " %%a in (appsettings.json) do (
       if defined Field[%%~a] (
          echo     %%a: "!Field[%%~a]!"
       ) else if "%%~b" neq "" (
          echo     %%a : %%b
       ) else (
          echo %%a
       )
    )
    

    输入:

    {
        "client_id": ""
        "client_secret": ""
        "Environment" : "Test"
        "Username" : "rocky"
        "Password" : "rock123"
    }
    

    输出:

    {
        "client_id": "123456"
        "client_secret": "654321"
        "Environment" : "Test"
        "Username" : "rocky"
        "Password" : "rock123"
    }
    

    【讨论】:

    • 我稍微改变了我的 json 文件,同样的脚本也适用于上述 json 文件吗?
    • 这就是您应该使用的解决方案,尤其是在您有更多变量的情况下。但它有一些问题:如果你有一个空字符串,你只是回显键而不是值("example":"", 将变为"example"),它只回显所有内容然后关闭,没有文件被创建/更改。跨度>
    • 这很有趣!我的回答产生与问题中发布的输出示例完全相同的输出(在修改之前)。投反对票的人至少可以解释他/她的理由吗?
    • > "我的答案产生的输出与输出示例完全相同" 您的代码永远不会更改文件 (>"json 文件应更改为以下")
    【解决方案4】:
    1. 获取合适的命令行编辑器(为此我们使用 SED,可在 CygWin、UnixUtils、GnuWin32 等中使用)

    2. 将可识别的占位符放在您要编辑的位置:

    { "client_id": "@client@" "client_secret": "@secret@" “环境”:“测试” “用户名”:“岩石” 《密码》《rock123》 }

    1. 通过您的编辑器将您的文件通过管道替换您的占位符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2020-05-31
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多