如何通过Jenkins使用PowerShell脚本插件创建环境变量并更改JSON文件

如何通过Jenkins使用PowerShell脚本插件创建环境变量并更改JSON文件,json,shell,powershell,jenkins,jenkins-plugins,Json,Shell,Powershell,Jenkins,Jenkins Plugins,我在%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" : "

我在
%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文件更改为下面的json文件。我已创建了两个全局凭据,其中包含一个机密文本
CLIENT\u ID
CLIENT\u secret

有人能帮我写一个windows批处理命令,用
CLIENT\u ID
CLIENT\u SECRET
替换上面的json文件吗

例如,如果
CLIENT\u ID=123456
CLIENT_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"
}
任何帮助都将不胜感激

  • 获取一个合适的命令行编辑器(我们使用SED,可以在CygWin、UnixUtils、GnuWin32等中获得)

  • 在要编辑的位置放置可识别的占位符:

  • { “客户id”:“@client@” “客户机密”:“@secret@” “环境”:“测试” “用户名”:“rocky” 密码“”“123” }

  • 通过编辑器导入文件以替换占位符

  • 我给你写了一个小剧本:

    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%"
    
    对于我来说,您必须用json文件的路径替换“test.json”

    @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"
    }
    

    事实上,我试过这种方法,效果很好

    步骤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:创建秘密文本,并使用凭据插件(您将在Jenkins左侧找到它,您将在那里创建新作业)定义您的值Client_Id=“12345”,Client_secret=“54321”)。现在使用绑定选项卡创建环境变量“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'
    

    可能重复的应该是
    “Password”:“rock123”
    ?我稍微更改了我的json文件,同样的脚本也适用于上面的json文件吗?这是您应该使用的解决方案,特别是当您有更多变量时。但是它有一些问题:如果您有空字符串,您只需回显键而不是值(
    )示例“:”,
    将成为
    “示例”
    ),它只会回显所有内容,然后关闭,不会创建/更改任何文件。这很有趣!我的答案产生的输出与问题中发布的输出示例(修改前)完全相同。投票人能否至少解释他/她的原因?>“我的答案产生的输出与输出示例完全相同”您的代码永远不会更改文件(>“json文件应更改为以下内容”)我稍微更改了我的json文件,相同的脚本是否也适用于上述json文件?是的,它仍然有效。(但它仍然添加了您在第一个示例中使用的选项卡。JSON与选项卡的工作方式相同(并且看起来更好),但是如果您想删除它们,只需将tab设置为空字符串
    set“tab=“
    )我可以在jenkins中使用execute shell脚本吗?或者我需要安装任何插件来运行此脚本吗?当我使用execute shell脚本C:\Program Files(x86)\Jenkins\workspace\AfsAutomation\u Test>exit 0[AfsAutomation\u Test]$sh-xe C:\Users\por\AppData\Local\Temp\Jenkins 6457885774024126472.sh时,出现以下错误。系统找不到指定的文件,原因是:java.io.IOException:无法运行程序“sh”(在目录“C:\Program Files(x86)中)\Jenkins\workspace\AfsAutomation_Test”):CreateProcess error=2,系统找不到文件specöhm。。。这是一个批处理脚本。我发现这个问题是因为标签“batchfile”,它的标题是“如何在jenkins中使用windows批处理命令更改json文件”。。。