我使用 Jenkins 版本在主/从配置中设置了 2 台 RHEL 机器。 1.609.2
从站正在通过 SSH Slaves 插件 1.10 启动。
我正在尝试使用 Slave Setup Plugin v 1.9 安装我的从机运行构建所需的工具。特别是我正在安装 sqlplus。
这是我为了尝试安装 sqlplus 而运行的脚本:
if command -v sqlplus >/dev/null; then
echo "sqlplus already setup. Nothing to do."
else
#Create directory for sqlplus and unzip it there.
mkdir /jenkins/tools/sqlplus
tar -xvf sqlplussetup/instantclient-basiclite-linux.x64-12.1.0.2.0.tar.gz -C /jenkins/tools/sqlplus || { echo 'unzip failed' ; exit 1; }
tar -xvf sqlplussetup/instantclient-sqlplus-linux.x64-12.1.0.2.0.tar.gz -C /jenkins/tools/sqlplus || { echo 'unzip failed' ; exit 1; }
cd /jenkins/tools/sqlplus/instantclient_12_1
#Create links for the Oracle libs
ln -s libclntsh.so.12.1 libclntsh.so || { echo 'Could not create link' ; exit 1; }
ln -s libocci.so.12.1 libocci.so || { echo 'Could not create link' ; exit 1; }
#Add two lines to .bashrc only if they don't already exist. Export LD_LIBRARY_PATH and add sqlplus to PATH.
grep -q -F 'export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH' /home/jenkins/.bashrc || echo 'export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH' >> /home/jenkins/.bashrc
grep -q -F 'export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1' /home/jenkins/.bashrc || echo 'export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1' >> /home/jenkins/.bashrc
#Export variables so they can be used right away
export LD_LIBRARY_PATH=/jenkins/tools/sqlplus/instantclient_12_1:$LD_LIBRARY_PATH
export PATH=$PATH:/jenkins/tools/sqlplus/instantclient_12_1
echo "sqlplus has been setup."
fi
此脚本成功运行,并且一切似乎都正常,直到我尝试运行构建并执行 sqlplus
命令。构建失败,因为 sqlplus
不是可识别的命令。
我的主要问题是: 启动从站时自动添加环境变量的正确方法是什么?
请注意,我正在寻找一种自动化的方法来执行此操作。我不想进入我的从属设备的配置屏幕,勾选复选框并指定环境变量。这对我想要实现的目标是适得其反的,即一旦连接就可以立即用于构建的奴隶。
<小时/>我非常明白为什么我的脚本不起作用。当 Jenkins 启动从站时,它首先建立 SSH 连接,然后使用以下命令运行我的设置脚本
/bin/sh -xe /jenkins/tmp/hudson8035138410767957141.sh
其中 hudson8035138410767957141.sh
的内容是我上面的脚本。显然,export
isn't going to work 。我希望将导出添加到 .bashrc 文件可以解决这个问题,但它不起作用。我认为这是因为该脚本是在建立 ssh 连接后执行的,因此 .bashrc 已被读取。
问题是我无法找到任何方法来解决此限制。
最佳答案
对于没有 的非交互式 shell,Bash 不会读取任何启动文件(
选项——这就是导出不起作用的原因。.bashrc
、.profile
等)--显式设置登录
因此,解决方案“A”是保留您上面建议的 bashrc 魔力,并通过将构建步骤中的第一行更改为来添加 --login
选项
#!/bin/bash --login
<your script here>
第一行的显式 shebang 还将防止从默认的 -x
选项获得过多的调试输出(请参阅上面的控制台代码段)。
替代解决方案“B”使用这样的事实:bash 将获取名称在 $BASH_ENV
中给出的任何脚本(如果定义了该变量并且文件存在)。在从属属性中全局定义该变量(例如,设置为/jenkins/tools/setup.sh),并在从属设置期间根据需要添加导出。每个 bash shell 构建步骤都会读取设置。
使用解决方案“B”,您不需要使用 --login
选项,也不必弄乱 .bashrc
。但是,“BASH_ENV”功能仅当 bash 在“bash 模式”下运行时才处于事件状态。当 Jenkins 通过 sh
启动 shell 时,bash 会尝试模拟历史上的 sh,但它没有该功能。因此,对于 B,您也需要一个 shebang:
#!/bin/bash
<your script here>
但无论如何,您都需要摆脱生产设置中通常过多的跟踪输出。
关于jenkins - 如何使用 Slave SetupPlugin 添加到从站的 PATH ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641532/