【问题标题】:RVM and Jenkins setupRVM 和 Jenkins 设置
【发布时间】:2012-04-18 12:19:15
【问题描述】:

我是 Jenkins CI 的新手。我在远程 Jenkins 中安装 RVM,当我在 shell 下执行时。

#!/bin/bash -x
source ~/.bashrc
rvm use 1.9.3@rails-3.2.3

我收到以下错误。

+ source /var/lib/jenkins/.bashrc
++ PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/var/lib/jenkins/.rvm/bin:/var/lib/jenkins/.rvm/bin
+ rvm use 1.9.3@rails-3.2.3

RVM is not a function, selecting rubies with 'rvm use ...' will not work.
You need to change your terminal settings to allow shell login.
Please visit https://rvm.io/workflow/screen/ for example.

这是什么意思?我没有任何想法。请帮帮我。

更新:我在下面的脚本中尝试过,但我仍然收到错误:

#!/bin/bash -x
source /home/zeck/.bashrc
[[ -s ".rvmrc" ]] && source .rvmrc
export RAILS_ENV=test
bundle install

错误:

/tmp/hudson457106939700368111.sh: line 5: bundle: command not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE

Jenkins 构建 shell 无法检测 RVM、gemset 和 gem。我该怎么办?

更新 2:因此 jenkins 无法检测到 ruby​​。

+ ruby -v
/tmp/hudson2505951775163045158.sh: line 5: ruby: command not found
Build step 'Execute shell' marked build as failure
Finished: FAILUR

我没有使用任何 jenkins 插件,我只是从 Build->Execute shell 部分运行脚本。

【问题讨论】:

  • Zeck,这个问题我也快疯了,你是怎么解决的???

标签: ruby ruby-on-rails-3 continuous-integration jenkins rvm


【解决方案1】:

正如错误消息所示,RVM 需要一个登录 shell。将 hashbang 行更改为 #!/bin/bash -xl 应该可以解决此问题。

【讨论】:

  • 顺便说一下,sourcing .rvmrc 可以打印很多到终端。您可能想改用 #!/bin/bash -l,然后在获取 .rvmrc 后执行 set -x
  • 对 -l 和 -x 的用途有什么解释吗?
  • -l 选项为您提供登录 shell,-x 以调试模式启动 bash。我能够只使用 -l ,这样 Jenkins 的输出就不会那么冗长了。
【解决方案2】:

尝试:

. $(/home/RVM_USER/.rvm/bin/rvm env 1.9.3@rails-3.2.3 --path)

确保运行稳定的 RVM:

rvm get stable

注意: 最后一个 Jenkins 版本并不总是接受“source”,而是“.”。 RVM_USER 是安装 RVM 的用户。 或者,您也可以在主 PATH 中导出 RVM 命令。

【讨论】:

  • 首先感谢您的帮助。但我得到'rvm:找不到命令'。请查看我的更新
  • 这是因为您在一个 rvm 安装中使用了不同的用户,请确保第二个用户 zeck 使用相同的 RVM - 在 /home/zeck/.bashrc 添加:export PATH=$PATH:/var/lib/jenkins/.rvm/bin
  • 。 $($HOME/.rvm/bin/rvm env --path) 也对我有用。
【解决方案3】:

是的,显然您错过了PATH 中的$HOME/.rvm/bin。我在 Mac OS X 上成功地从 Hudson 使用 rvm。首先要注意的是,除非您定义 BASH_ENV 环境变量(ENV 用于 sh),否则 .bashrc 只会在交互式非登录 shell 中自动调用。当您从命令行执行以下操作时,就会启动这样的 shell:

$ /bin/bash

当您在脚本中使用#!/bin/bash 时,.bashrc 将不会被调用。

为了使 rvm 与 Hudson 一起工作,我的 .bash_profile 中有以下内容:

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
export PATH

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

感谢[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm",我每次启动新终端窗口(交互式,登录 shell)时都启用了 rvm。

我没有在我的.bashrc 中添加任何内容,尤其是我没有在那里采购 rvm 脚本。这并没有错,但是如果任何其他脚本做出了一些愚蠢的事情,比如设置 `export BASH_ENV=$HOME/.bashrc' 然后调用非交互式 shell,你就会看到可能发生的事情 - 实际上很容易忘记。

因此,与其将内容加载到您的 .bashrc 中,不如让您的脚本独立于任何 shell 启动文件,并确保在脚本中设置了正确的环境。我仍然将$HOME/.rvm/bin 保留在我的.bash_profile 中,但是我在脚本的开头包含以下内容:

#!/bin/bash

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

rvm use 1.9.3-head@MyGemSet

set -ex
cucumber # just an example

注意-e 选项,如果set -ex 后面的任何命令失败,该选项会强制脚本退出并显示错误代码。这是您在将脚本与 Hudson 一起使用时可能需要的行为。 说 RVM 需要登录 shell 是不正确的。尽管在您的脚本中使用 #!/bin/bash -l 会起作用,但这似乎不是最好的方法。

【讨论】:

  • 是的,这有帮助。 RVM 的位置可能不同,在我的例子中是 [[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"rvm use ruby_name@gemset_name
【解决方案4】:

只需将此代码添加到您的 shell 脚本中,我认为 rvm 是从您的源代码加载的,因此它应该可以工作,否则需要导出 PATH 变量

#!/bin/bash -l
source ~/.bashrc
rvm use 1.9.3@rails-3.2.3

l 用于登录 shel,如果包含 x 则也用于调试。

【讨论】:

    【解决方案5】:

    在 jenkins 的构建命令中添加一个 shebang 为我解决了这个问题

        #!/usr/bin/env bash
    
        rvm use 2.0.0
        bundle install
        rake test
        ...
    

    【讨论】:

    • 你先生,让我开心:)
    【解决方案6】:

    Jenkins 节点不会以相同的方式加载路径,因此它没有使用正确的路径来查找 rvm 的 ruby​​ 版本。您可以为给定的代理设置路径。

    1. 通过echo $PATH 查找您当前的路径
    2. 假设您已经正确设置了 rvm,通过运行which ruby 找到 rvm 的 ruby​​ 版本所在的位置
    3. 代理的配置中有一个设置,您可以在其中设置环境变量。将 PATH 设置为 1 和 2 连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2013-02-24
      相关资源
      最近更新 更多