2016-07-20 14 views
1

Ich möchte einen Jenkins-Build automatisch auslösen, wenn es einen Push zu Github gibt. Darüber hinaus möchte ich basierend auf der Verzweigung und den modifizierten Dateien die Argumente einer anderen Funktion an die API SaltStack senden und auf anderen Ziel-VMs ausführen."fatal: bad object" beim Aufruf von `git diff-tree` über grooviges Skript?

Hier ist mein Code in der "Umwelt Bauen" - "Umgebungsvariablen an den Build-Prozess Inject" Schritt:

def map = [:] 

println "env:" 
def env = System.getenv() 
env.each{ 
    println it 
} 

println "envVarsMap:" 
def thr = Thread.currentThread() 
def build = thr?.executable 
def envVarsMap = build.parent.builds[0].properties.get("envVars") 
envVarsMap.each{ 
    println it 
} 

def envlist = []; 
env.each() { k,v -> envlist.push("$k=$v") } 
envVarsMap.each { k,v -> envlist.push("$k=$v") } 

switch (envVarsMap['GIT_BRANCH']) { 
    case "origin/development": 
     map['DEPLOY_SERVER'] = "admin-dev-1,admin-staging-2" 
     break 
    case "origin/master": 
     map['DEPLOY_SERVER'] = "admin-prod-1" 
     break 
} 

println "GIT_COMMIT: ${envVarsMap['GIT_COMMIT']}" 
println "WORKSPACE: ${envVarsMap['WORKSPACE']}" 

def sout = new StringBuilder() 
def serr = new StringBuilder() 
proc1 = "git diff-tree --no-commit-id --name-only -r ${envVarsMap['GIT_COMMIT']}".execute(envlist, new File("${envVarsMap['WORKSPACE']}")) 
proc1.waitForProcessOutput(sout, serr) 
println "sout: $sout" 
println "serr: $serr" 
println "proc1: ${proc1.text}" 

und den Fehler:

GIT_COMMIT: c56ba02156bcf23598db09b9a02407316bf554dc 
WORKSPACE: /var/lib/jenkins/workspace/deploy-admin-app 
sout: 
serr: fatal: bad object c56ba02156bcf23598db09b9a02407316bf554dc 

Das Ausführen dieses Befehls manuell jenkins Benutzer auf dem CI-Server hat einwandfrei funktioniert:

su - jenkins -s /bin/bash -c 'cd /var/lib/jenkins/workspace/deploy-admin-app; git diff-tree --no-commit-id --name-only -r c56ba02156bcf23598db09b9a02407316bf554dc' 
package.json 

Meine Frage ist also: Warum habe ich diesen Fehler? Wie kann ich dies reproduzieren, wenn es manuell ausgeführt wird?

Wenn die Revision nicht existiert, sollten wir eine "unbekannte Version" Fehler:

fatal: ambiguous argument 'c56ba02156bcf23598db09b9a02407316bf554dx': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 
+1

> Wenn die Revision nicht existiert, sollten wir eine „unbekannte Revision“ Nicht wahr, in Ihrem Beispiel 'c56ba02156bcf23598db09b9a02407316bf554dx' ist keine gültige git commit Hash bekommen, weil es' x' Zeichen enthält, versuchen Sie mit einem beliebigen gültigen git commit hash und es wird einen fehlerhaften Objektfehler in der Ausgabe zurückgeben (ersetzen Sie 'x' durch ein Zeichen von af). – favadi

+0

OK, danke. Upvoted. Aber die Frage ist: Warum ist es passiert mit 'c56ba02156bcf23598db09b9a02407316bf554dc'? – quanta

+0

Ich sehe eine Variable mit dem Namen WORKSPACE, aber es ist nicht klar, dass Ihr aktuelles Arbeitsverzeichnis etwas mit dieser Variablen zu tun hat, und selbst wenn es in Ihrer Umgebung ist, ist es keine Variable, die Git verwendet (Git verwendet $ GIT_DIR und $ GIT_WORK_TREE oder '--git-dir' und' --work-tree' Argumente. Andererseits kenne ich keine Details von Jenkins. – torek

Antwort

0

Es tut mir leid.

Wir haben einen Master und ein paar Slave-Knoten. Durch nicht überprüfen "Einschränken, wo dieses Projekt ausgeführt werden kann" kann der Build auf jedem Knoten ausgeführt werden. Das Problem ist, wurde der Bau auf dem Slave ausgeführt:

[EnvInject] - Loading node environment variables.

Building remotely on jenkins-slave-go-1 (golang) in workspace /var/lib/jenkins/workspace/deploy-admin-app

aber dann die git diff-tree wurde auf dem Master geprüft. Ich habe das herausgefunden, indem ich stattdessen git log -1 ausgeführt habe.

Also, ich habe zu überprüfen „beschränken, in denen das Projekt ausgeführt werden kann“ und gefüllt Master als Label.