如何使用Slave SetupPlugin添加到slave的PATH?

FGr*_*reg 5 jenkins

我使用Jenkins ver在主/从配置中设置了2台RHEL机器.1.609.2

奴隶正在通过SSH Slaves Plugin 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
Run Code Online (Sandbox Code Playgroud)

此脚本成功运行,一切似乎都有效,直到我尝试运行构建并执行sqlplus命令.构建失败,因为sqlplus它不是可识别的命令.

我的主要问题是:启动从站时自动添加环境变量的正确方法什么?

请注意我正在寻找一种自动化的方法.我不想进入我的奴隶的配置屏幕,勾选一个复选框并指定一个环境变量.这对我想要实现的目标是适得其反的,这是一个连接后立即可用于构建的从属.


我非常理解为什么我的脚本不起作用.当Jenkins启动从属服务器时,它首先建立SSH连接,然后使用该命令运行我的安装脚本

/bin/sh -xe /jenkins/tmp/hudson8035138410767957141.sh
Run Code Online (Sandbox Code Playgroud)

其中的内容hudson8035138410767957141.sh是我上面的脚本.显然,这export 不会起作用.我希望添加到.bashrc文件的导出将绕过这个,但它不起作用.我认为这是因为这个脚本是在建立ssh连接后执行的,因此.bashrc已经被读取.

问题是我无法找到解决此限制的任何方法.

Ale*_*x O 1

对于没有显式设置选项的非交互式 shell,Bash 不会读取其任何启动文件(.bashrc等) ——这就是导出不起作用的原因。.profile--login

因此,解决方案“A”是保留您上面建议的 bashrc 魔力,并通过将--login构建步骤中的第一行更改为来添加选项

#!/bin/bash --login

<your script here>
Run Code Online (Sandbox Code Playgroud)

第一行的显式 shebang 还将防止从默认选项中获得过多的调试输出-x(请参阅上面的控制台代码片段)。

替代解决方案“B”使用这样一个事实:bash 将获取名称中给出的任何脚本$BASH_ENV(如果定义了该变量并且文件存在)。在从属属性中全局定义该变量(例如,设置为 /jenkins/tools/setup.sh),并在从属设置期间根据需要添加导出。每个 bash shell 构建步骤都会读取设置。

使用解决方案“B”,您不需要使用该--login选项,也不必弄乱.bashrc. 但是,“BASH_ENV”功能仅当 bash 在“bash 模式”下运行时才处于活动状态。当 Jenkins 通过 启动 shell 时sh,bash 会尝试模拟历史上的 sh,但它没有该功能。所以,对于 B,你也需要一个 shebang:

#!/bin/bash

<your script here>
Run Code Online (Sandbox Code Playgroud)

但无论如何,您都需要摆脱生产设置中通常过多的跟踪输出。