如何找到正确的Ruby版本

时间:2017-01-30 18:27:32

标签: ruby macos jenkins

我目前正在开发一个使用JenkinsGitLab来触发项目构建的构建管道。基本上,当有人推送到存储库时会触发构建。此外,一些Ruby脚本作为构建过程的一部分执行。这些脚本对项目执行一些检查并执行一些修复,例如将Xcode项目与源目录中添加和删除的文件同步 - 在这种情况下它们不相同。

我正在使用多种工具来配置管道。构建在物理上位于构建从属的机器上运行。 Jenkins部署到AWS计算机。出于这个原因,我使用pritunl连接虚拟网络上的两个。我可以使用本地IP在机器之间进行通信,SSH可以正常工作。

当我推送到远程时,构建在从属服务器上正确启动,但无法完成。但是,如果我通过终端使用SSH手动访问,则构建执行正常。这是我从Jenkins得到的输出:

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- xcodeproj (LoadError)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Users/jenkins/workspace/Core/platform/ios/scripts/pbxsync.rb:58:in `<main>'

如您所见,它无法Xcodeproj,导致构建失败。但是,只有在Jenkins触发构建时才会发生这种情况,而不是手动。

这让我觉得Jenkins正在使用一些不同的Ruby安装,或者至少是一个不同的环境。基本上我需要的是为Jenkins使用的相同Ruby环境安装gem,但我不知道是哪一个。有什么想法吗?

Jenkins有一个控制台,可以在远程从站上运行Groovy脚本。到目前为止,我一直在玩它,但结论并不多。也许这有帮助。

这可能很重要;这是我用于Ruby脚本的shebang:#!/usr/bin/env ruby

在终端上,我使用与Jenkins相同的用户来访问从机。它被称为“詹金斯”。

我忘记提到的一件事是输出告诉我正确的版本:/Users/jenkins/.rvm/rubies/ruby-2.4.0。至少那是它表明它试图从中加载宝石的路径。所以我尝试了以下内容:

: /Users/jenkins/.rvm/rubies/ruby-2.4.0/bin/ruby
require 'xcodeproj'

然后我按ctrl + D并且没有输出 - ruby​​的安装正在找到宝石。

2 个答案:

答案 0 :(得分:2)

如果您使用Jenkins Slave插件在Jenkins Master和Jenkins Slave之间进行通信,那么您指定的每个命令都将在非交互式shell中运行。这意味着Jenkins只能访问您的情况下的系统ruby。

因此,如果您想安装需要安装的东西,您必须在系统ruby中执行此操作。您正在使用rvm:rvm use system并且您可以将gem安装到系统ruby。

如果要使用与系统ruby不同的Ruby版本,则需要将RVM添加到$ PATH以用于非交互式shell。以下是应该提供帮助的基本设置:https://rvm.io/rvm/basics

答案 1 :(得分:1)

我终于成功了。正如@Cosaquee在另一个响应中指出的那样,区分交互式shell和非交互式shell非常重要。这样做的主要原因是,根据您调用SSH的方式,它会产生影响。正如man page表示:

  

如果指定了命令,则在远程主机上执行,而不是   登录shell。

这很有意义,因为我为Jenkins设置的节点的Launch Command就是这个:

ssh jenkins@x.x.x.x java -jar ~/bin/slave.jar

同时,我使用终端的标准ssh jenkins@x.x.x.x登录,启动登录shell。因为两个shell load different initial scripts,我得到了不同的结果。基本上,如果您使用ssh jenkins@x.x.x.x登录计算机~/.bash_profile已加载,而如果您指定命令(例如ssh jenkins@x.x.x.x whatever),则会加载~/.bashrc。因此,我将此行添加到~/.bashrc

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

没有它,我得到了:

  

RVM不是一个功能,选择'rvm use ...'的红宝石不会   工作

优点是我现在可以使用Jenkins使用的相同环境中的RVM。其余的很简单:

ssh jenkins@x.x.x.x rvm --default use 2.3

ssh jenkins@x.x.x.x
rvm --default use 2.3

两者现在都使用相同版本的ruby。