我试图让 CruiseControl.rb 在构建期间运行 rcov。目前失败并出现以下错误:

sh: rcov: not found 

既然我能跑 rcov 当我登录时从 shell 中,我认为这是一个 PATH 问题。(此外,我可以同时运行 rake test:rcovrake cruise 从 shell 中没有错误)。我添加了一个 p 'echo $PATH' 语句(使用正确的反引号来执行命令;感谢 Markdown)到我的 Cruise.rake 并发现路径确实不正确:

"/usr/local/bin:/usr/bin:/bin\n"

rcov 可执行文件位于 /var/lib/gems/1.8/bin/rcov,所以难怪 CC.rb 找不到它。

但是,我不知道如何正确设置路径。我在 .profile 的底部设置了此设置:

PATH="$PATH:/var/lib/gems/1.8/bin/"

这就是让它交互工作的原因,但它没有被 CC 接受。

我在 Passenger Phusion 下运行 CruiseControl.rb (因此在 apache 下)。我已经检查了尽可能多的文件,但对我来说没有什么看起来像路径。

我可以在哪里设置路径和/或确定路径的设置位置?

有帮助吗?

解决方案

首先,你的.profile文件是错误的。您需要将环境变量导出对其他进程可见之前。像这样:

export PATH=....

PATH=...
export PATH

非出口环境变量值只能从同一外壳内的过程访问。

但是,因为你正在运行的Phusion乘客,这不是你的问题。 .profile文件只能由壳阅读,因为Apache不从外壳开始,而是从系统初始化过程中,不管你把.profile中被忽略。对于乘客的Phusion你必须与mod_env和SetEnv指令设置PATH,像这样的:

<VirtualHost *:80>
    ServerName something.test
    DocumentRoot /somewhere/to/cruisecontrol/public
    SetEnv PATH /usr/bin:/usr/local/bin:/bin:/var/lib/gems/1.8/bin    # <---- add this
</VirtualHost>

其他提示

我终于一切正常了。

首先,@Hongli 关于在 Apache 中设置 PATH 的建议是正确的;SetEnv 能够设置基于 Passenger 的站点的 PATH。

在深入研究 CruiseControl.rb 代码后,我发现了第二个问题(我在对 Hongli 答案的评论中提到了这个问题)。在启动过程中,CC.rb 为每个项目分叉一个构建器进程。每个进程都会获取其父进程的 PATH 在它被创建时. 。我的问题是我正在重新启动 Apache,但无论出于何种原因,这都没有重新启动构建器进程。因此,构建者没有获得我的 PATH 更新,因此似乎也没有从 Apache 获得 PATH。这让我相信他们的路径是在其他地方设置的——但事实并非如此。

重新启动系统就可以了;新的构建者从 Apache 获得了新的 PATH,现在一切都按预期工作。可能还有其他方法可以重新启动构建器,但我还没有研究过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top