Wie lässt man Jenkins Git nur dann committen, wenn es Änderungen gibt?

Lesezeit: 3 Minuten

Benutzer-Avatar
SD

Ich habe einen Jenkins-Job, der mit Maven (mvn clean install), sucht dann nach Lizenzheadern in Java-Dateien und fehlenden NOTICE-Dateien und fügt sie bei Bedarf hinzu (mvn license:format notice:generate). Manchmal führt dies zu geänderten oder hinzugefügten Dateien, manchmal nicht.

Immer wenn Änderungen vorgenommen wurden (durch das Lizenz-Plugin), möchte ich die Änderungen in das Github-Repo übertragen.

Jetzt habe ich Probleme herauszufinden, wie ich das am besten erreichen kann. Ich habe nach dem Maven-Lizenz-Plugin einen Shell-Build-Schritt hinzugefügt, in dem ich Git-Befehle ausführe:

git add . # Just in case any NOTICE files have been added
git commit -m "Added license headers"

git add . allein funktioniert, dh unterbricht den Build nicht, auch wenn keine Dateien hinzugefügt wurden. Jedoch, git commit bricht den Build ab, wenn es überhaupt keine Änderungen gibt.

Ich mache mir keine Sorgen darüber, zu Github zurückzukehren, da ich glaube, dass die Post-Build-Aktion von Git Publisher dies für mich tun kann. Kann mir bitte jemand die richtige Richtung für den Git-Commit weisen?

  • Gibt es keine Möglichkeit, den Zeitstempel der letzten Änderung abzurufen?

    – Ratschenfreak

    26. Februar 2014 um 11:36 Uhr

  • @ratchetfreak Danke. Sie meinen wie in a) die Zeitstempel speichern, bevor das Lizenz-Plug-in ausgeführt wird, und mit den Zeitstempeln vergleichen, nachdem es ausgeführt wurde? Klingt für mich etwas teuer. Es sei denn, jemand weiß es besser :).

    – SD

    26. Februar 2014 um 11:44 Uhr

Benutzer-Avatar
Kimamula

git diff --quiet && git diff --staged --quiet || git commit -am 'Added license headers'

Dieser Befehl macht genau das, was erforderlich ist, ‘git commit only if there are changes’, während die Befehle in den anderen Antworten dies nicht tun: Sie ignorieren nur alle Fehler von git commit.

  • Es wäre hilfreich, hier Klammern hinzuzufügen, falls ich den Vorrang des Bash-Operators nicht aus dem Kopf weiß

    – MichaelChirico

    17. Dezember 2019 um 9:10 Uhr

  • Falls es eine gibt git add davor (wie in der Frage) sollte es ausreichen, einfach zu laufen git diff --staged --quiet || git commit -m '…'. Andernfalls, git diff --quiet HEAD || git commit -am '…' vereinfacht diese Lösung.

    – Lars Kiesow

    26. Februar 2021 um 10:55 Uhr

  • git add . && git diff --staged --quiet || git commit -m '...' funktioniert auch auf einem neu initialisierten Repo

    – Dinvlad

    25. Oktober 2021 um 5:07 Uhr

Sie können den Fehlercode auch einfach mit einem ODER-Operator abfangen:

git commit -m "Added license headers" || echo "No changes to commit"

  • Das ist sehr schön für die CI-Einstellung. Hinterlässt etwas Nützliches in den Protokollen, nach dem gesucht werden kann.

    – MichaelChirico

    17. Dezember 2019 um 9:12 Uhr


  • Dies ist, was ich brauchte, um Git-Probleme in Jenkins zu lösen.

    – Nainesh Patel

    4. Juni 2021 um 15:40 Uhr

Um zu verhindern, dass der Build beim Shell-Build-Schritt unterbrochen wird, der den Exit-Code zurückgibt 1 An einem beliebigen Punkt, zB wenn Sie versuchen, einen Git-Commit durchzuführen, obwohl es nichts zu übergeben gibt, können Sie die entsprechenden Befehle einfach in ein Echo verpacken.

echo `git add -A && git commit -m "Added license headers"`

Unabhängig davon, ob es nicht nachverfolgte Dateien zum Hinzufügen zum Index gibt oder nicht, und ob der Arbeitsbaum schmutzig oder sauber ist, gibt echo den Exit-Code zurück 0da es eine Zeichenfolge geben wird echoed.

1245130cookie-checkWie lässt man Jenkins Git nur dann committen, wenn es Änderungen gibt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy