在服务上下文中使用 RVM

在服务上下文中使用 RVM

我在 Ubuntu 14 上设置了一个用户。

如果我检查以用户身份登录时

build@linux-build-agent-1:~$ type rvm | head -1
rvm is a function

然而,这台机器将成为teamcity代理......

当在 teamcity 服务上下文中运行一项作业时,我们会看到

[13:19:11][Step 1/1] RVM is not a function, selecting rubies with 'rvm use ...' will not work.
[13:19:11][Step 1/1] 
[13:19:11][Step 1/1] You need to change your terminal emulator preferences to allow login shell.
[13:19:11][Step 1/1] Sometimes it is required to use `/bin/bash --login` as the command.
[13:19:11][Step 1/1] Please visit https://rvm.io/integration/gnome-terminal/ for an example.

我尝试了几个命令试图强制服务在登录 shell 中运行

su - build -c 'source "$HOME/.rvm/scripts/rvm" && /home/build/buildAgent/bin/agent.sh start'


sudo -u build -i bash -lc '/home/build/buildAgent/bin/agent.sh start'
su - build -c '/home/build/buildAgent/bin/agent.sh start'

在脚本中/etc/init.d/没有效果。

如果我source "$HOME/.rvm/scripts/rvm在 teamcity 中运行脚本的开头,那么一切都正常,但是有多个用户,我无法要求他们都记住这样做。

这是我安装 RVM 的方式吗?


澄清:

1) 当我通过 SSH 以用户身份登录时,rvm 安装正确且按预期运行。如type rvm | head -1=> 'rvm is a function' 所示 2) 当服务以用户身份登录时,rvm 无法正常工作。

我希望 rvm 在服务上下文中运行时能够工作,这样用户就不必source "$HOME/.rvm/scripts/rvm在构建脚本中明确地

通常,此问题是由于未作为登录 shell 运行而导致的。因此,我需要知道如何将服务作为登录 shell 运行。或者如何调整 rvm 以使其可以在登录 shell 上下文之外工作

答案1

当你运行 时su - build -c foo.sh,你将启动一个登录 shell,然后启动foo.sh。但是,脚本foo.sh运行在自己的子 shell 中(这就是脚本的工作方式),并且该 shell 的类型取决于舍邦线脚本。因此,su - -c foo.sh它不是foo.sh在登录 shell 中运行,它只是运行登录 shell,然后启动foo.sh

因此,编辑/home/build/buildAgent/bin/agent.sh并更改此内容:

#!/bin/sh

更改为:

#!/bin/sh -l

这将使其在登录 shell 中运行,并使其读取/etc/profile、和~/.profile文件并引入您的函数。请注意,这~/.bash_profile与此无关。这是一个仅由 读取的文件bash,而不是sh在 Ubuntu 上实际为 的文件dash

相关内容