Jenkins CI: So lösen Sie Builds auf SVN-Commit aus

79

Welche Plugins und Plugin-Funktionen muss ich festlegen, damit mein Jenkins-Job einen Build auslöst, wenn Code für ein SVN-Projekt festgeschrieben wird?

Ich habe sowohl das Standard-SVN-Plugin als auch das SVN-Tagging-Plugin installiert, sehe jedoch keine neuen Funktionen, die eine Trigger-Konfiguration ermöglichen.

IAmYourFaja
quelle
1
Mögliches Duplikat von Trigger Hudson Build, wenn SVN Commit
koffeinhaltig

Antworten:

86

Hierfür gibt es zwei Möglichkeiten:

Ich empfehle die erste Option zunächst, da sie einfach zu implementieren ist. Sobald Sie in Ihren Build-Prozessen ausgereift sind, wechseln Sie zum zweiten.

  1. Fragen Sie das Repository ab, um festzustellen, ob Änderungen aufgetreten sind. Dies kann ein Commit "überspringen", wenn zwei Commits innerhalb desselben Abfrageintervalls eingehen. Beschreibung der Vorgehensweise finden Sie hier im vierten Screenshot, in dem Sie im Job einen "Build-Trigger" konfigurieren, der auf der Abfrage des Repositorys basiert (mit einer crontab-ähnlichen Konfiguration).

  2. Konfigurieren Sie Ihr Repository so, dass es einen Post-Commit-Hook hat, der Jenkins benachrichtigt, dass ein Build gestartet werden muss. Beschreibung dazu hier im Abschnitt "Post-Commit-Hooks"

Die SVN-Tag-Funktion ist nicht Teil der Abfrage, sondern Teil der Heraufstufung des aktuellen "Kopfes" des Quellcodes zu einem Tag, um einen Snapshot eines Builds zu erstellen. Auf diese Weise können Sie Jenkins buid # 32 als SVN-Tag / tags / build-32 (oder ähnliches) bezeichnen.

Edwin Buck
quelle
Post-Commit-Hooks rocken. Schnellere Antwortzeiten und (im Maßstab) Ihr CI-System zerstört das Quell-Repo nicht mit Hunderten von Änderungsprotokollanforderungen.
EricMinick
5
@EricMinick Sie sind großartig, aber manchmal können sie den CI-Server zum Schmelzen bringen, wenn Sie in kurzer Zeit viele kleine Commits erhalten. Es sind alles Pferde für Kurse, und es ist schwer zu wissen, welche Methode günstig ist, ohne zu analysieren, wie Ihr Entwicklungsprozess derzeit funktioniert.
Edwin Buck
1
@EdwinBuck: Wissen Sie, ob es eine Möglichkeit gibt, Jenkins so zu konfigurieren, dass nur selektive Commits erstellt werden? Ich werde erklären, ich habe ein tortoiseSVN und ein Jenkins-Projekt, das das Repository ständig abfragt. Wenn ich möchte, dass das Commit, das ich mache, Jenkins nicht auslöst, gibt es eine Möglichkeit, dies zu tun?
SandBag_1996
@UnderDog Wenn Sie bis zu dem Punkt gereift sind, an dem Sie einen Post-Commit-Trigger in Maven haben, dann bevorzuge ich eine Lösung, die nach speziellen "Schlüsselwörtern" im Post-Commit-Trigger sucht und diese nach dem Erkennen NICHT den Jenkins mitteilt Server, um einen neuen Build zu starten. Zum Beispiel könnte "^ DONTBUILD -. *" Als "Nicht erstellen" -Flag verwendet werden, wenn es in der ersten Zeile des Commits angegeben wird.
Edwin Buck
@mxdsp Link aktualisiert. Es ist nicht so hübsch wie das alte Wandisco, aber es wird den Job erledigen. Vielen Dank!
Edwin Buck
2

Sie benötigen nur ein Plugin, nämlich das Subversion-Plugin.

Gehen Sie dann einfach zu Jenkins → Jobname → Build-Trigger- Abschnitt → (i) Trigger-Build remote (dh aus Skripten). Authentifizierungstoken: Token-Name

Wechseln Sie in das Hooks-Verzeichnis des SVN-Servers und führen Sie nach dem Auslösen die folgenden Befehle aus:

  1. cp post-commit.tmpl post-commit
  2. chmod 777 post-commit
  3. chown -R www-data:www-data post-commit
  4. vi post-commit

    Hinweis: Alle Zeilen sollten kommentiert werden. Fügen Sie zuletzt die folgende Zeile hinzu

Syntax (für Linux-Benutzer):

/usr/bin/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name

Syntax (für Windows-Benutzer):

C:/curl_for_win/curl http://username:API_token@localhost:8081/job/job_name/build?token=Token_name
Hemin Patel
quelle
Diese Antwort ist mehr oder weniger identisch mit dieser Antwort .
Peter Mortensen
1

Ich habe ein Tool mit Python mit etwas Bash erstellt, um einen Jenkins-Build auszulösen. Grundsätzlich müssen Sie diese beiden Werte aus dem Post-Commit erfassen, wenn ein Commit den SVN-Server erreicht:

REPOS="$1"
REV="$2"

Dann verwenden Sie "svnlook dirs-changed $ 1 -r $ 2", um den Pfad zu erhalten, der gerade festgeschrieben wurde. Anschließend können Sie überprüfen, welches Repository Sie erstellen möchten. Stellen Sie sich vor, Sie haben hunderttausend Projekte. Sie können nicht das gesamte Repository überprüfen, oder?

Sie können mein Skript von GitHub aus überprüfen .

Phan Dolphy
quelle
-1

Sie können einen Post-Commit-Hook verwenden.

Legen Sie das Post-Commit-Hook-Skript in den hooksOrdner, erstellen Sie ein wget_folderin Ihrem Laufwerk C: \ und legen Sie die wget.exeDatei in diesem Ordner ab. Fügen Sie der aufgerufenen Datei den folgenden Code hinzupost-commit.bat

SET REPOS=%1   
SET REV=%2

FOR /f "tokens=*" %%a IN (  
'svnlook uuid %REPOS%'  
) DO (  
SET UUID=%%a  
)  

FOR /f "tokens=*" %%b IN (  
'svnlook changed --revision %REV% %REPOS%'  
) DO (  
SET POST=%%b   
)

echo %REPOS% ----- 1>&2

echo %REV% -- 1>&2

echo %UUID% --1>&2

echo %POST% --1>&2

C:\wget_folder\wget ^   
    --header="Content-Type:text/plain" ^   
    --post-data="%POST%" ^   
    --output-document="-" ^   
    --timeout=2 ^     
    http://localhost:9090/job/Test/build/%UUID%/notifyCommit?rev=%REV%    

Dabei ist Test = Name des Jobs

echowird verwendet, um den Wert anzuzeigen, und Sie können exit 2am Ende auch hinzufügen, um zu erfahren, ob das Problem vorliegt und ob das Hook-Skript nach dem Festschreiben ausgeführt wird oder nicht.

Megha
quelle