2012-04-18 10 views
17

Ich bin neu in Jenkins CI. Ich installiere RVM in meinem Remote Jenkins und wenn ich unter Shell ausführe.RVM und Jenkins Setup

#!/bin/bash -x 
source ~/.bashrc 
rvm use [email protected] 

Ich bekomme folgende Fehler.

+ 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 [email protected] 

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. 

Was bedeutet das? Ich habe keine Ahnung. Bitte hilf mir.

AKTUALISIERT: Ich bin unten Skript versucht, aber ich immer noch Fehler erhalten:

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

Fehler:

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

Jenkins bauen Schale erkennen kann nicht RVM, gemsets und Edelsteine. Was soll ich machen?

AKTUALISIERT 2: Daher können Jenkins Rubin nicht erkennen.

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

Ich bin keine jenkins mit plugn und ich bin nur Skript von Build-> Ausführen Schalenabschnitt ausgeführt werden.

+0

Zeck, ich bin verrückt, dieses Problem zu lösen, wie hast du es repariert ??? – Farooq

Antwort

11

Versuch:

. $(/home/RVM_USER/.rvm/bin/rvm env [email protected] --path) 

stellen Sie sicher, die stabile RVM laufen:

rvm get stable 

HINWEIS: Letzte Jenkins Version nicht immer akzeptieren "Quelle", aber "". RVM_USER ist der Benutzer, der RVM installiert hat. Alternativ können Sie auch den RVM-Befehl im Hauptpfad exportieren.

+0

Sehr zuerst danke für den Versuch zu helfen. Aber ich bekomme 'rvm: Befehl nicht gefunden'. Bitte sehen Sie meine Updates – Zeck

+0

es ist, weil Sie verschiedene Benutzer für eine Rvm-Installation verwenden, stellen Sie sicher, dass der zweite Benutzer 'zeck' das gleiche RVM verwendet - in'/home/zeck/.bashrc' add: 'export PATH = $ PATH:/var/lib/jenkins/.rvm/bin' – mpapis

27

Wie die Fehlermeldung suggeriert, erwartet RVM eine Login-Shell. Das Ändern der Hashbang-Zeile zu #!/bin/bash -xl sollte das beheben.

+5

Übrigens, das Sourcing von .rvmrc kann sehr viel auf das Terminal drucken. Vielleicht möchten Sie stattdessen eine '#!/Bin/bash -l' verwenden, dann' set -x' nach dem Sourcen von .rvmrc. – disrupt

+0

Gibt es eine Erklärung, wofür -l und -x verwendet werden? –

+0

Die Option -l gibt Ihnen eine Login-Shell und -x startet bash im Debug-Modus. Ich konnte nur -l verwenden, so dass die Jenkins-Ausgabe nicht so ausführlich war. – bruz

9

Ja, offensichtlich vermissen Sie die $HOME/.rvm/bin in Ihrem PATH. Ich benutze rvm erfolgreich von Hudson auf Mac OS X. Die erste Sache zu bemerken ist, dass, wenn Sie BASH_ENV Umgebungsvariable (ENV für SH) definieren, .bashrc wird automatisch nur mit interaktiven Nicht-Login-Shell aufgerufen. Eine solche Shell gestartet wird, wenn Sie zu tun - zum Beispiel - die folgenden von der Kommandozeile:

$ /bin/bash 

Wenn Sie #!/bin/bash in Ihrem Skript verwenden, .bashrc wird nicht aufgerufen werden.

Um rvm Arbeit mit Hudson, ich habe folgendes in meinem .bash_profile zu machen:

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

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

Dank [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" Ich habe rvm jedes Mal aktiviert Ich beginne neues Terminal-Fenster (interactive, Login-Shell).

Ich gebe nichts in meine .bashrc, vor allem ich bin nicht Sourcing Rvm-Skripte dort. Nichts falsch daran, aber wenn andere Skripte etwas dummes machen, wie das Setzen von `export BASH_ENV = $ HOME /.Bashrc 'und dann nicht-interaktive Shell aufrufen, sehen Sie, was passieren kann - es ist eigentlich leicht zu vergessen.

Daher ist es besser, das Skript unabhängig von einer Shell-Startdatei zu halten und sicherzustellen, dass die richtige Umgebung innerhalb des Skripts eingerichtet wird, anstatt Dinge in Ihre .bashrc zu laden. Ich halte nach wie vor $HOME/.rvm/bin in meinem .bash_profile, aber dann schließe ich die folgend am Anfang meines Skripts:

#!/bin/bash 

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

rvm use [email protected] 

set -ex 
cucumber # just an example 

Beachten Sie die -e Option, die das Skript zwingt mit dem Fehlercode zu beenden, wenn ein Befehl folgenden set -ex ausfällt. Dies ist das gewünschte Verhalten, wenn Sie das Skript mit Hudson verwenden. Es ist falsch zu sagen, dass RVM eine Login-Shell erwartet. Obwohl die Verwendung von #!/bin/bash -l in Ihrem Skript funktioniert, scheint es nicht der beste Ansatz zu sein.

+0

Ja, das hat geholfen. Der Speicherort von RVM kann sich unterscheiden, in meinem Fall war es '[[-s"/usr/local/rvm/scripts/rvm "]] && source"/usr/local/rvm/scripts/rvm "' was funktionierte, zusammen mit 'rvm verwenden ruby_name @ gemset_name' – 0x4a6f4672

1

eine shebang zu den Build-Befehle in jenkins Hinzufügen dieses für mich fixiert

#!/usr/bin/env bash 

    rvm use 2.0.0 
    bundle install 
    rake test 
    ... 
+0

Sie Sir, machte meinen Tag :) – ncuesta

3

einfach diesen Code in Ihrer Shell-Skript hinzufügen, ich glaube, rvm von der Quelle wird geladen, so sollte es sonst PATH exportieren müssen arbeiten Variable

#!/bin/bash -l 
source ~/.bashrc 
rvm use [email protected] 

l ist für Login shel, wenn Sie x dann wäre es auch zum Debuggen.

0

Jenkins-Knoten laden Pfade nicht auf die gleiche Weise, daher wird nicht der richtige Pfad verwendet, um die Version von rvm von rvm zu finden. Sie können den Pfad für einen bestimmten Agenten festlegen.

  1. Finden Sie Ihren aktuellen PATH von echo $PATH
  2. tun Angenommen, Sie rvm richtig eingerichtet haben, wo Version RVM von Rubin von which ruby Lauf befindet
  3. Es gibt eine Einstellung in der Konfiguration Ihres Agenten, wo Sie kann Umgebungsvariablen setzen. Setzen Sie PATH auf 1 und 2 verkettet.