【问题标题】:How to add to slave's PATH using Slave SetupPlugin?如何使用 Slave SetupPlugin 添加到从站的 PATH?
【发布时间】:2015-09-17 23:26:50
【问题描述】:

我在使用 Jenkins 版本的主/从配置中设置了 2 台 RHEL 机器。 1.609.2

slave 正在通过 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

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

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

请注意,我正在寻找一种自动方式来执行此操作。我不想进入我的奴隶的配置屏幕,勾选一个复选框并指定一个环境变量。这与我试图实现的目标是适得其反的,即连接后立即可用于构建的从站。


我非常明白为什么我的脚本不起作用。当 Jenkins 启动从属服务器时,它首先建立 SSH 连接,然后使用命令运行我的设置脚本

/bin/sh -xe /jenkins/tmp/hudson8035138410767957141.sh

hudson8035138410767957141.sh 的内容是我上面的脚本。很明显,exportisn't going to work。我希望将导出添加到.bashrc 文件可以解决这个问题,但它不起作用。我认为这是因为该脚本是在 ssh 连接建立后执行的,因此 .bashrc 已经被读取。

问题是我想不出任何方法来解决这个限制。

【问题讨论】:

标签: jenkins


【解决方案1】:

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

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

#!/bin/bash --login

<your script here>

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

替代解决方案“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>

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

【讨论】:

  • 我喜欢你的解决方案“B”。如果我理解正确,如果我要在$BASH_ENV 脚本中使用export PATHLD_LIBRARY_PATH,那么这些会在整个构建步骤中保留吗?不幸的是,我不再从事需要这个的项目,所以我无法实际测试它。
  • 是的。 $BASH_ENV 中的命令/导出在 bash 启动期间被读取,并在整个 shell 会话中持续存在——与您为交互式登录 shell 添加到 .bashrc 等的语句完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多