从 Jenkins 管道运行脚本时,如何通过 ssh 在远程 AIX 机器中加载环境变量?
Posted
技术标签:
【中文标题】从 Jenkins 管道运行脚本时,如何通过 ssh 在远程 AIX 机器中加载环境变量?【英文标题】:How to load environment variables in a remote AIX machine through ssh while running script from Jenkin pipeline? 【发布时间】:2020-08-16 04:10:12 【问题描述】:我们在通过 Jenkins 管道运行的 Perl 自动化框架中使用了一些自定义模块。最近,由于安装了最新的 Perl 版本,我们在 AIX 服务器中执行测试用例时遇到了所有自定义模块的 package not found 错误。所以我们尝试在文档中提到的路径中添加“PERL5LIB”
https://perlmaven.com/how-to-change-inc-to-find-perl-modules-in-non-standard-locations
我们在 AIX 服务器的 /etc/profile 中添加了“export PERL5LIB=/home/foobar/code”,当从本地 AIX 机器运行时,脚本可以毫无问题地执行。
问题:
但是我们有 Jenkins 管道来使用 ssh 在 AIX 服务器中执行脚本。现在,当我们在管道脚本中通过 SSH 连接到 AIX 服务器时,我们在 /etc/profile 中设置的变量不会加载,并且我们会收到 package not found 错误。
问题:如何在 AIX 服务器中加载配置文件,同时从管道运行它?或者有没有其他方法可以处理这个问题。在执行脚本之前,我想通过管道(仅一次)将 PERL5LIB 导出到远程 AIX 服务器中,并且出现 I should not get package not found 错误。
我尝试过以下解决方案:
加载 /etc/profile: ssh AIX server ./etc/profile(使用点,因为源代码在 AIX 中不工作)
在 AIX 服务器的 .ssh/environment 中添加这一行 "export PERL5LIB=/home/foobar/code" 并设置 PermitUserEnviorment 是
感谢您对此的任何帮助。
【问题讨论】:
这是与脚本一起安装的模块吗?如果是这样,PERL5LIB 无论如何都不是最好的解决方案。脚本中的use FindBin qw( $RealBin ); use lib $RealLib;
(或使用 lib "$RealLib/../lib";` 或任何适当的)会更有意义,并完全避免您的问题。
嗨@ikegami。谢谢你的答复。我们已经尝试使用 FindBin qw( $RealBin );使用库 $RealLib;它运行良好,但问题是我们有 400-500 个使用这些模块的 perl 文件。所以认为 PERL5LIB 将是一个简单的解决方案。
如果有一种编程语言可以用来在文本文件的开头轻松添加一行... (find . -name '*.pl' -exec perl -pe's/^(?=use strict)/use lib qw( \$RealBin );\n/' -i~ +
)
【参考方案1】:
以通常的方式为变量赋值:
ssh user@host 'export PERL5LIB=/somepath; echo $PERL5LIB'
user@hosts's password:
/somepath
或
ssh user@host '. /etc/profile.local; echo $PERL5LIB'
user@hosts's password:
/somepath/from/profile
编辑: 如果必须执行多个命令,创建一个脚本并上传到目标计算机,例如:
SCRIPTNAME=/tmp/$$.$RANDOM.script
scp myscript.sh user@host:"$SCRIPTNAME"
ssh user@host "$SCRIPTNAME"
【讨论】:
你好@Lorinczy Zsigmond。谢谢你的答复。欣赏。此解决方案也有效,但我们需要在每个 ssh 命令中添加它。在我们的管道脚本中,我们在通过 ssh 连接的远程 AIX 服务器中执行大约 20-30 个 Perl 文件。有没有什么办法我们只在脚本开头导出一次 PERL5LIB 并且它应该在整个执行过程中持续存在?【参考方案2】:通过以下更改解决了这个问题。
第 1 步:编辑 ~/.ssh/environment。添加变量PERL5LIB="/模块路径/"
第 2 步:编辑 /etc/ssh/sshd_config。将变量 PermitUserEnvironment 从 no 更改为 yes。如果有评论,请取消评论。这将使环境变量能够访问 SSH。
第三步:重启SSHD服务。 (这是小鬼。我之前也尝试过第 1 步和第 2 步,但没有重新启动服务,因此解决方案不起作用)
我们可以创建一个脚本并在从管道执行自动化测试之前运行它。
【讨论】:
以上是关于从 Jenkins 管道运行脚本时,如何通过 ssh 在远程 AIX 机器中加载环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jenkins 管道脚本从 Windows 到 Linux 的 SCP
如何在同一个 Jenkins 节点中加载另一个 groovy 脚本?