2017-01-30 7 views
1

私は現在、JenkinsGitLabを使用してプロジェクトのビルドをトリガするビルドパイプラインに取り組んでいます。基本的には、誰かがリポジトリにプッシュするとビルドがトリガされます。また、いくつかのRubyスクリプトはビルドプロセスの一部として実行されます。これらのスクリプトは、Xcodeプロジェクトとソースディレクトリの追加または削除されたファイルとの同期化など、いくつかのプロジェクトのチェックを実行し、いくつかの修正を行います。Rubyの正しいバージョンを見つける方法

私はいくつかのツールを使用してパイプラインを設定しています。ビルドは物理的にビルドスレーブ上にあるマシン上で実行されます。 JenkinsはAWSマシンに導入されています。このため、私はpritunlを使って2つを仮想ネットワーク上で接続しました。ローカルIPを使用してマシン間の通信を行うことができ、SSHは両方の方法でうまく動作します。

リモートにプッシュすると、ビルドはスレーブで正しく開始されますが、完了に失敗します。しかし、SSHを使って手動で端末からアクセスすると、ビルドは正常に動作します。あなたが見ることができるように

/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環境用の宝石をインストールすることです。何か案は?


JenkinsにはリモートスレーブでGroovyスクリプトを実行するコンソールがあります。私はそれを少しでも演奏してきましたが、これまでのところ多くの結論は出ていません。多分それは助けます。


これは重要です。これは私がRubyスクリプトのために使用していシェバングです:#!/usr/bin/env ruby端末に


、ジェンキンスは、スレーブマシンにアクセスすることであると私は同じユーザーを使用しています。それは "ジェンキンス"と呼ばれています。 /Users/jenkins/.rvm/rubies/ruby-2.4.0:私は言及を忘れてしまった


一つは、出力は私の右のバージョンを語っているということです。少なくともそれはそれが宝石を積み込もうとしていることを示す道です。そこで、私は次のように試しました:

次に、私はctrl + Dを押して出力を得ません。ルビーのインストールによってgemが正しく見つかっています。

+0

テキストに「編集」タグまたは「更新」タグを使用する必要はありません。代わりに、元の情報を追加した場合はその情報をテキストに入れます。必要に応じてテキストをどこでいつ変更したのかがわかります。 –

+0

'/ usr/bin/env ruby​​'を使用したり、異なるアカウントやシステム間で一貫性のある結果を得ることはできません。それらが同じように設定されていなければJenkinsを使用することはできません。 'env'はPATHの内部を見てRubyを見つけ、見つかった最初のRubyを返します。あなたのPATHを設定していて、ローカルのオッズを使用するのと同じRubyをインストールしていない限り、良いJenkinsはOSによって/ usr/bin/ruby​​にインストールされたRubyを見つけています。手動でビルドするとき、Jenkinsがローカルシステムと何を使用しているかを確認する必要があります。 –

+0

さて、はい、どうですか?私はJenkinsがどのインストールを実行しているのか知る必要があることを理解しています。アイデア? –

答えて

2

Jenkins Slaveプラグインを使用してJenkins MasterとJenkins Slave間で通信する場合、指定するすべてのコマンドは非対話型シェルで実行されます。つまり、Jenkinsはあなたのケースではシステムルビーにしかアクセスできません。

インストールする必要があるものをインストールするには、システムのルビーで行う必要があります。あなたはrvm so:rvm use systemを使用しており、gemをsystem ruby​​にインストールすることができます。

システムRuby以外のRubyバージョンを使用する場合は、非対話シェルのためにRVMを$ PATHに追加する必要があります。ここでは助けるべき基本的な設定です:https://rvm.io/rvm/basics

+0

ああ!完璧な意味合いを持つ。だから私は何をすべきか知っている。私はそれを試してみましょう。私が気づいたことの1つは、私のシステムのルビーが2.0.0だが、私が必要とするものは2.2.2が必要だということだ。それはすべてのことの引き金になったに違いない。私はまた 'gem'(' gem env'を使って)が全く異なる結果を出すことに気付きました。私は試して、システムのインストールを更新し、結果を得る。ありがとうございました! –

+0

問題は続く...私は '〜/ .bash_profile'と'〜/ .bashrc'の両方を編集しましたが、どちらもJenkinsランナーによってロードされていないようです。私は 'rvm --default use 2.4'も試みました。ルビーのシステムバージョンを変更する方法はありますか? –

+1

@AndréFratelliGradleとJenkinsのような問題がありました.Gradleへのパスを含めるために '/ etc/environment'を編集し、Jenkinsは非対話シェルのPipelineステップでそれを使用できます。 – Cosaquee

1

私はそれを最終的に管理しました。 @Cosaqueeは別の応答で示されているように、対話シェルと非対話シェルを区別することが重要です。これの主な理由は、SSHをどのように呼び出すかによって異なります。 man pageが示すように:コマンドが指定されている場合は

、それが代わりに ログインシェルのリモートホスト上で実行されます。

私はジェンキンスのために設定したノードのための起動コマンドはこの1つであるので、これは、意味がある:ところで

ssh [email protected] java -jar ~/bin/slave.jar 

、私は端末から標準ssh [email protected]でログインして、ログインシェルを開始します。 2つの殻load different initial scriptsが異なる結果を得ていたことは意味があります。基本的に、ssh [email protected]を使用してマシン~/.bash_profileにログインすると、ssh [email protected] whateverなどのコマンドを指定すると、代わりに~/.bashrcがロードされます。そのため、私は~/.bashrcに次の行を追加:それなし

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

は、私が得た:

RVMを持つルビー選択し、関数ではありません 'RVMの使用を...' 動作しません。

利点は、Jenkinsが使用していたのと同じ環境のRVMを使用できることでした。残りは簡単です:

ssh [email protected] rvm --default use 2.3 

そして:

ssh [email protected] 
rvm --default use 2.3 

そして、両方は今ルビーの同じバージョンを使用しています。

関連する問題