2016-11-01 2 views
0

(Git Newcomer hier) Ich versuche, ein System zu implementieren, wodurch ein Jenkins-Build ausgelöst wird, wenn ein Tag zu einem bestimmten Zweig geschoben wird. Derzeit hat mein Vorgesetzter eine einfache PoC installiert, wo auf unsere API-Server (die laufen node.js), einen cron-Job alle 5 Minuten lief ist, die ausgeführt wird:Jenkins: Build, wenn ein Zweig markiert ist

git checkout production 
git pull 
git checkout `git describe --abbrev=0 --tags` 

Also, wenn ein Entwickler möchte eine Änderung schieben Zur Produktion führen sie einfach npm version patch aus, die den letzten Commit mit einer neuen Versionsnummer kennzeichnet und dann die Änderung mit git push origin --tags verschiebt. Dann führen sie über Jenkins ein Skript aus, das alle API-Dienste in API-Boxen neu startet.

Also, um es zu emulieren und vollständig zu automatisieren, möchte ich einen Jenkins-Job haben, der all dies tut (plus ein paar Extras), wenn er erkennt, dass unsere production Zweigstelle mit einer neuen Version getaggt wurde.

Ist das möglich? Die meiste Dokumentation, die ich gefunden habe, beinhaltet das Auslösen eines Builds auf einem beliebigen Tag, der an einen Repo-Dienst gesendet wird. Ich möchte einen Tag auslösen, der auf einen Commit für einen bestimmten Repo verweist.

Ich bin ziemlich sicher, dass dies ein fortgeschrittener Fall ist, und ich könnte stattdessen ein Skript schreiben, aber ich versuche Best Practices für Jenkins und Git zu lernen, und ich möchte nicht am Ende bleiben zu einigen Anti-Muster.

Antwort

0

Ich habe keine Ahnung wie Jenkins tatsächlich verwendet wird, so dass diese Antwort ziemlich nutzlos sein kann.

In Git, aber wenn Sie eine freistehende HEAD wie diese verwenden möchten, alles, was Sie brauchen, ist git describe zweimal zu laufen, einmal vor dem Abruf, und einmal nach:

otag=$(git describe --tags --abbrev=0 origin/production) || 
    die "help, no initial tag" 
git fetch origin 
ntag=$(git describe --tags --abbrev=0 origin/production) || 
    die "help, no new tag" 
if [ "$otag" = "$ntag" ]; then 
    echo the tag we would check out now is the same as the one 
    echo we checked out last time, so we do nothing 
else 
    echo moving from tag: $otag to tag: $ntag 
    git checkout $ntag 
    ... build ... 
fi 

git describe ermöglicht es Ihnen, die angeben, commit Sie wollen beschrieben werden, so dass es keine Notwendigkeit gibt, einen Zweig zu überprüfen, holen, und merge-and-hope-it's-a-fast-forward.

Beachten Sie, dass dies die lokale Niederlassung ermöglicht production zunehmend mehr und mehr zu erhalten veraltet oder sogar einfach nicht existieren, weil die lokale Niederlassung ist nie verwendet wirklich. Das einzige, was Sie in Ihrem Beispielcode angeben, ist seine Upstream-Einstellung.

Verwandte Themen