【问题标题】:Jenkins execute shell scripts with parameters on remote machineJenkins 在远程机器上执行带有参数的 shell 脚本
【发布时间】:2018-04-10 18:32:53
【问题描述】:

我有一个 Jenkins 作业,它在远程服务器上执行一个 shell 脚本。现在我想连同 shell 脚本一起发送一些参数。下面的例子可能会让你有更多的想法。

variable1={git-URL}
variable2={branch}

我希望将此参数传递给远程机器上的 shell 脚本,并且应该像下面这样执行

#/usr/local/bin/check_out_code.sh <git-url> <branch>

如果有人能指点我解决这个问题,那就太好了

谢谢。

【问题讨论】:

    标签: linux git github jenkins ssh-agent


    【解决方案1】:

    您可以像 linux 中的任何其他变量一样引用任何环境变量,包括 Jenkins 参数:${VARNAME}

    【讨论】:

    • 这些变量是否被传递给在远程机器上执行的 shell 脚本?我试试看
    • 正在执行命令的节点(主节点或从节点)会在执行命令之前展开这些变量。如果该命令恰好是一个远程脚本,那么远程脚本将被执行,并带有扩展的参数。
    【解决方案2】:

    我也有同样的问题。

    参数/${xx}/$xxx 在远程机器中未定义。所以当你的shell脚本在远程机器上执行时无法得到正确的值。

    这样可以解决问题:

    ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'
    

    【讨论】:

    • 在我的情况下,shell 脚本不需要那么多转义:ssh 'export MYVAR="'$localvar1"_"$localvar2'";
    【解决方案3】:

    正如@Slav 所提到的,您可以像使用 Jenkins 中的任何其他环境变量一样使用环境/构建参数。要记住的一件事是它们在脚本执行之前被扩展。如果您碰巧使用管道 groovy 脚本,请确保使用双引号 " 而不是单引号 '

    以下将不起作用:

    sh '/usr/local/bin/check_out_code.sh ${giturl} ${branch}'
    

    以下将起作用:

        sh "/usr/local/bin/check_out_code.sh ${giturl} ${branch}"
    

    【讨论】: