Jenkins无法访问shell别名

时间:2013-08-02 14:24:28

标签: bash jenkins hudson

我已经配置了一个Jenkins作业,以获取一个bash脚本来源另一个 bash脚本,该脚本为其用户.bashrc添加一个别名,并从.bashrc本身获取,然后原始脚本尝试使用该别名(由第二个设置)。但是,它似乎无法找到它刚刚创建的别名。我没有使用任何脚本插件,除了使用“通过SSH发送文件或执行命令”构建步骤来源脚本。

这项工作是这样做的:

source ./test_script.sh

test_script.sh看起来像这样:

echo "In test_script.sh"
echo $USER
echo $HOME
source ./setup_env.sh
echo "\nBack in test_script.sh"
alias foo
foo

最后,setup_env.sh看起来像这样:

echo "\nIn setup_env.sh"
echo "alias foo=\"echo foobar\"" >> $HOME/.bashrc
source $HOME/.bashrc 2>/dev/null
cat $HOME/.bashrc

我从Jenkins工作中收到的输出如下所示:

In test_script.sh
my_user
/home/my_user
\nIn setup_env.sh
...all of my bashrc...
alias foo="echo foo"
\nBack in test_script.sh
alias foo='echo foo'
./test_script.sh: line 7: foo: command not found

我不明白为什么会发生这种情况,当我可以在命令行上自己运行它并观察它是否成功时。为什么詹金斯不能使用新的别名,当它显然可以找到它时(如alias foo命令的输出所示)?

2 个答案:

答案 0 :(得分:11)

对于遇到此问题的其他任何人,您可能需要设置expand_aliases shell选项,默认情况下这似乎与Jenkins关闭:

shopt expand_aliases # check if it's on
shopt -s expand_aliases # set expand_aliases option to true
shopt expand_aliases # it should be on now

# test with a simple alias, should print 1
alias x="python -c 'print 1'"
x

答案 1 :(得分:4)

\n命令输出中显示的echo 建议这不是在bash下运行,正如您可能期望的那样。

请检查 jenkins 用户的设置
(或您运行 Jenkins 的任何其他用户) -
尤其是默认shell 的设置。

要对此进行测试,请在脚本开头添加其中一行:

env

env | grep -i shell

还应该考虑确保你的脚本在正确的shell下运行,
通过在每个脚本中添加“ shebang ”行作为第一行 例如,在'bash'的情况下,您应该添加以下第一行:

#!/bin/bash

(这不是评论,尽管自动语法 - 荧光笔可能会想到......)