2017-04-25 11 views
5

Ich möchte etwas sagen können, wie:Jenkins Pipeline: Kasse explizite git commit

git branch: commitHash, credentialsId: credentialsId, url: url 

Die usecase: Ich läuft parallel Build und Test auf verschiedenen Plattformen mache, und wollen sicherstellen, jeder der bekommt gleicher Code Es ist C++ und wir bauen auf separaten Plattformen auf und bauen darauf auf.

Wenn ich die oben tun, ist es nicht - der zugrunde liegende Code übernimmt eigentlich die gegebene Zweig ein Zweig ist, oder Sie bekommen so etwas wie:

[Linux64 Build] > git rev-parse origin/e4b6c976a0a986c348a211579f1e8fd32cf29567^{commit} # timeout=10 
[Pipeline] [Linux64 Build] } 
[Pipeline] [Linux64 Build] // dir 
[Pipeline] [Linux64 Build] } 
[Pipeline] [Linux64 Build] // node 
[Pipeline] [Linux64 Build] } 
[Linux64 Build] Failed in branch Linux64 Build 

Ich habe auf diese Frage gesehen Variationen vor gefragt, obwohl keine tatsächlichen Antworten - nur Vorschläge, die den Quellcode stattdessen verstauen, usw. Nicht wirklich, was ich suche.

Die Dokumentation schlägt vor, dass es möglich sein sollte, explizite Commit-Hashes zu geben, möglicherweise mit Hilfe von Verzweigungen, aber ich kann die Syntax nicht herausfinden und kann keine Beispiele finden. Wenn ich es mache, bekomme ich den Meisterzweig, denke ich - in unserem Setup funktioniert Master nicht.

Bisher war die einzige Lösung, die ich gefunden habe war, den Zweig und dann explizit aufrufen git zur Kasse das bekommen begehen:

   git branch: branch, credentialsId: credentialsId, url: url 
       sh 'git checkout ' + commitHash 

(wo Zweig ist der Zweig Ich habe ursprünglich den Hash für an der obere Teil der Arbeit geleistet. Es funktioniert, ist aber nicht das sauberste.

Wer einen besseren Weg bekam?

+0

Siehe Anmerkungen von 2017.07.12 und 2017.07.13 in [JENKINS-31826] (https://issues.jenkins-ci.org/browse/JENKINS-31826) –

Antwort

7

Verwenden Sie ein general scm Schritt

checkout([$class: 'GitSCM', branches: [[name: commitHash ]], 
    userRemoteConfigs: [[url: 'http://git-server/user/repository.git']]]) 
+0

Sie zufällig, wissen, wie man das credentialsId bit hinzufügt? – johnfo

+0

Ich verlasse mich auf den ssh-Schlüssel des Jenkins-Benutzers –

+1

Ich denke, ich habe es geschafft, es auszuarbeiten - nicht zuletzt habe ich gerade bemerkt, dass es einen Schnipsel "Editor" dafür gibt. Es wäre etwa so: checkout ([$ class: 'GitSCM', Zweige: [[Name: commitHash]], userRemoteConfigs: [[credentialsId: credentialsId, URL: 'http: // git-server/user/repository.git ']]]) – johnfo

2

Yuri Gs Beispiel funktionierte nicht für mich, als jenkins wegen des anfänglichen Checkouts keinen Arbeitsbereich hatte. Folgendes funktioniert in diesem Fall. Ich verstehe nicht, warum sie so unterschiedlich sind.

def commitId = "<insert sha here>" 

    checkout ([$class: 'GitSCM', 
     branches: [[name: commitId ]], 
     userRemoteConfigs: [[ 
      credentialsId: 'deploy key for your repo', 
      url: 'repo url']]]) 
+0

Ich habe verwendet: steps.checkout ([$ Klasse: 'GitSCM', Zweige: [[Name: Hash]], userRemoteConfigs: [[url: url, credentialsId: 'Schlüssel von Anmeldeinformationen ']]]) – johnfo

+0

das ist so ziemlich das Gleiche wie ich habe. Ich habe nur die Zeilen aufgeteilt und eine andere Reihenfolge verwendet. Die Reihenfolge sollte keine Rolle spielen –

+0

Der Unterschied zwischen uns und Yuri ist die Cred ID - das ist es wahrscheinlich. Öffentlicher Repo gegen Privat. Wie dumm von mir –