【问题标题】:JENKINS pass parameters as inputs to remote host scriptJENKINS 将参数作为输入传递给远程主机脚本
【发布时间】:2017-08-05 03:32:35
【问题描述】:

我们有一个用于 Jenkins 项目和构建的 (3) 层系统。 我们已经在工作节点和远程主机之间建立了信任关系 通过 SSH 插件和密钥。

jenkinsrh-01 = main jenkins server (gui for projects/builds, dashboard, etc)
sys-07       = worker  node  (projects / builds are run from this remote node)
raloda10     = remote host  (target of builds)

在 Jenkins 主服务器 (jenkinsrh-01) 的 gui 配置屏幕中,我们的项目的以下代码具有硬编码参数值等。 $SCRIPT 位于远程主机,我们希望传递参数值以供远程主机脚本使用。

构建 --> 执行 Shell --> 命令

#!/bin/bash

export ORACLE_USER="oracle"
export ODA_HOST="raloda10"
export DATABASE="DEV11G05"
export SCHEMA="ASA14101X5"
export COMMENT="good state archive"
export SCRIPT="/u01/app/oracle/databases/dev11g05/bod/jenky_test.sh"

sudo -i -u ${ORACLE_USER} ssh ${ODA_HOST} ${SCRIPT} 

在目标远程主机 (raloda10) 上目标脚本的内容 是一个简单的测试,用于回显在上述构建步骤中通过“导出”措辞传递给它的参数值。目标远程主机脚本(jenky_test.sh)的内容是;

#!/bin/bash
#
#
echo
echo This is correct target script on remote host
echo 
echo 1. Source database: ${DATABASE}
echo 2. Name of  schema: ${SCHEMA}
echo 3. Comments: ${COMMENT}
echo
echo ${DATABASE}
echo ${SCHEMA}
echo ${COMMENT}
#
exit

worker build 可以访问远程主机,找到远程主机脚本,并运行 shell 脚本“jenky_test.sh”。

但问题是 jenky_test.sh 脚本在运行时没有任何构建参数被传递。它不会回显这些值,因为它们是空白的,如下面的“控制台输出”所示;

Started by user Donald Collins
[EnvInject] - Loading node environment variables.
Building remotely on sys-07 (SYS-07) in workspace /var/lib/jenkins/workspace/fails_Send_Jenkins_Parameters_fromSlave_as_Inputs_for_Script_on_Remote_Host
[fails_Send_Jenkins_Parameters_fromSlave_as_Inputs_for_Script_on_Remote_Host] $ /bin/bash /tmp/hudson7103389345936604753.sh

This is correct target script on remote host

1. Source database:
2. Name of schema:
3. Comments:

控制台输出应该显示上面第 1、2 和 3 行的导出变量(参数)的值。相反,它们是空白的。

我已经在执行 Shell 的命令步骤中为“sudo”调用尝试了各种不同编码的各种组合。 “Nothing”似乎能够获取要作为输入传递给远程目标主机上 jenky_test.sh 的参数值。

我确定我在这里遗漏了一些显而易见的东西,因为我试图用 Jenkins 做的是“Jenkins 101”的东西;)...

非常感谢任何帮助或建议。

最好的问候, 唐纳德

【问题讨论】:

  • 您在本地 shell 而不是远程 shell 中设置环境变量。这就是问题所在。您需要将变量作为参数传递给脚本,或者通过读入 EOF 并在写入 EOF 之前列出命令来设置它们

标签: linux bash shell jenkins


【解决方案1】:

在您的本地脚本中,您是一个“heredoc”,因此执行 ssh 命令并将要在本地主机上执行的命令读入 EOF 标记。

sudo -i -u ${ORACLE_USER} ssh ${ODA_HOST} << EOF
export ORACLE_USER="oracle"
export ODA_HOST="raloda10"
export DATABASE="DEV11G05"
export SCHEMA="ASA14101X5"
export COMMENT="good state archive"
/u01/app/oracle/databases/dev11g05/bod/jenky_test.sh
EOF

【讨论】:

  • 嗨拉曼,感谢您查看此问题以及您的建议和帮助。我们之前一直在设置远程环境变量,但方式不同。我们在 sudo 命令中添加了一个“源”调用,并指向 oracle home 中的 .bash_profile,ala; sudo -i -u ${ORACLE_USER} ssh ${ODA_HOST} "source /home/oracle/.bash_profile ; ${SCRIPT}" 结果相同,控制台输出为空值。但是我们还没有通过你的想法用 EOF 标记尝试过同样的事情,我们会尝试并报告回来.... 最好的问候 - Donald
  • 嗨拉曼,谢谢,您的建议奏效了!控制台输出符合预期,但也发出警告; “不会分配伪终端,因为标准输入不是终端。”我将在接下来的 2 个 cmets 和 jenkins shell 命令代码中粘贴完整的输出,因为我们必须在本地机器(工作节点,sys07)和远程(目标节点,raloda10)上导出值才能使输出工作。 (我无法在这些回复中进行格式化,所以下面看起来像废话,抱歉。我正在关注,“stackoverflow.com/editing-help#comment-formatting")再次感谢!
  • 压缩控制台输出:由用户 Donald Collins [EnvInject] 启动 - 加载节点环境变量。在工作区中的 sys-07 (SYS-07) 上远程构建...... $ /bin/bash /tmp/hudson7098082742483678924.sh 不会分配伪终端,因为 stdin 不是终端。这是远程主机 1 上的正确目标脚本。源数据库:DEV11G05 2.模式名称:ASA14101X5 3.评论:良好状态存档 DEV11G05 ASA14101X5 良好状态存档已完成:成功
  • Jenkins 命令; "#!/bin/bash export ORASRC="source /home/oracle/.bash_profile" ; export ORACLE_USER="oracle" export ODA_HOST="raloda10" export DATABASE="DEV11G05" export SCHEMA="ASA14101X5" export COMMENT="good状态存档" export SCRIPT="/u01/app/oracle/databases/dev11g05/bod/jenky_test.sh" sudo -i -u ${ORACLE_USER} ssh ${ODA_HOST}
  • 使用 -T 标志和 ssh 来禁用伪 tty 分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2021-01-11
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多