Ένα παράδειγμα υλοποίησης της Συνεχούς Ενοποίησης με το BuildBot

Ένα παράδειγμα υλοποίησης της Συνεχούς Ενοποίησης με το BuildBot
(Εικόνα από Υπολογιστής από Pixabay)

Γεια σας!

Το όνομά μου Evgeniy Cherkin, είμαι προγραμματιστής σε μια ομάδα ανάπτυξης σε μια εταιρεία εξόρυξης Πολυμεταλλικό.

Όταν ξεκινάτε ένα μεγάλο έργο, αρχίζετε να σκέφτεστε: «Ποιο λογισμικό είναι καλύτερο να χρησιμοποιηθεί για την εξυπηρέτηση του;» Ένα έργο πληροφορικής περνά από διάφορα στάδια πριν κυκλοφορήσει την επόμενη έκδοση. Είναι καλό όταν η αλυσίδα αυτών των σταδίων είναι αυτοματοποιημένη. Ονομάζεται η αυτοματοποιημένη διαδικασία κυκλοφορίας μιας νέας έκδοσης ενός έργου πληροφορικής Συνεχής ολοκλήρωση. BuildBot αποδείχθηκε καλός βοηθός για εμάς στην υλοποίηση αυτής της διαδικασίας.

Σε αυτό το άρθρο αποφάσισα να δώσω μια επισκόπηση των δυνατοτήτων BuildBot. Τι είναι ικανό αυτό το λογισμικό; Πώς να τον προσεγγίσετε και πώς να χτίσετε μια κανονική ΑΠΟΤΕΛΕΣΜΑΤΙΚΗ ΣΧΕΣΗ ΕΡΓΑΣΙΑΣ μαζί του; Μπορείτε να εφαρμόσετε την εμπειρία μας μόνοι σας δημιουργώντας μια υπηρεσία εργασίας για την κατασκευή και τη δοκιμή του έργου σας στο μηχάνημά σας.

περιεχόμενο

περιεχόμενο

1. Γιατί το BuildBot;
2. Έννοια με επικεφαλής τον BuildMaster
3. Εγκατάσταση
4. Πρώτα βήματα

5. Διαμόρφωση. Βήμα προς βήμα συνταγή

5.1 BuildmasterConfig
εργαζομένων 5.2
5.3 change_source
5.4 χρονοπρογραμματιστές

5.5 BuildFactory
5.6 οικοδόμοι

6. Παράδειγμα της δικής σας διαμόρφωσης

6.1 Στο δρόμο για τον κύριο σας.cfg
6.2 Εργασία με svn
6.3 Επιστολή προς εσάς: οι δημοσιογράφοι είναι εξουσιοδοτημένοι να δηλώσουν

Τα καταφέραμε! Συγχαρητήρια

1. Γιατί το BuildBot;

Παλαιότερα στο habr-e συνάντησα άρθρα σχετικά με την εφαρμογή Συνεχής ολοκλήρωση χρησιμοποιώντας BuildBot. Π.χ, Αυτό Το βρήκα το πιο κατατοπιστικό. Υπάρχει ένα άλλο παράδειγμα - απλούστερη. Αυτά τα άρθρα μπορούν να καρυκευτούν παράδειγμα από το εγχειρίδιοΚαι αυτό μετά από αυτό, στα αγγλικά. Το κουπέ κάνει μια καλή αφετηρία. Αφού διαβάσετε αυτά τα άρθρα, πιθανότατα θα θέλετε αμέσως κάτι BuildBot να κάνει.

Να σταματήσει! Το έχει χρησιμοποιήσει κανείς πραγματικά στα έργα του; Αποδεικνύεται ναι πολλοί το εφάρμοσαν στα καθήκοντά τους. Μπορεί να βρεθεί παραδείγματα χρήση BuildBot και στα αρχεία κώδικα της Google.

Ποια είναι λοιπόν η λογική των ανθρώπων που χρησιμοποιούν Buildbot? Μετά από όλα, υπάρχουν και άλλα εργαλεία: CruiseControl и Jenkins. Θα απαντήσω έτσι. Για τις περισσότερες εργασίες Jenkins και η αλήθεια θα είναι αρκετή. Με τη σειρά του, BuildBot - πιο προσαρμοστικό, ενώ τα προβλήματα λύνονται εκεί τόσο απλά όσο και μέσα Jenkins. Η επιλογή είναι δική σου. Επειδή όμως αναζητούμε ένα εργαλείο για ένα αναπτυσσόμενο έργο-στόχο, γιατί να μην επιλέξουμε αυτό που θα επιτρέψει, ξεκινώντας από απλά βήματα, να αποκτήσουμε ένα σύστημα κατασκευής που έχει διαδραστικότητα και μοναδική διεπαφή.

Για εκείνους των οποίων το έργο-στόχος είναι γραμμένο σε python, τίθεται το ερώτημα: "Γιατί να μην επιλέξετε ένα σύστημα ολοκλήρωσης που έχει μια σαφή διεπαφή όσον αφορά τη γλώσσα που χρησιμοποιείται στο έργο;" Και τώρα ήρθε η ώρα να παρουσιάσουμε τα οφέλη BuildBot.

Λοιπόν, το «ενόργανο κουαρτέτο» μας. Για τον εαυτό μου, έχω εντοπίσει τέσσερα χαρακτηριστικά BuildBot:

  1. Είναι ένα πλαίσιο ανοιχτού κώδικα με άδεια GPL
  2. Αυτή είναι η χρήση του python ως εργαλείο διαμόρφωσης και περιγραφή των απαιτούμενων ενεργειών
  3. Αυτή είναι μια ευκαιρία να λάβετε απάντηση από το μηχάνημα στο οποίο πραγματοποιείται η συναρμολόγηση
  4. Αυτές είναι, τέλος, οι ελάχιστες απαιτήσεις για έναν κεντρικό υπολογιστή. Η ανάπτυξη απαιτεί python και twisted και δεν απαιτεί εικονική μηχανή και μηχανή java.

2. Έννοια με επικεφαλής τον BuildMaster

Ένα παράδειγμα υλοποίησης της Συνεχούς Ενοποίησης με το BuildBot

Κεντρικό στοιχείο στην αρχιτεκτονική διανομής εργασιών είναι BuildMaster. Είναι μια υπηρεσία που:

  • παρακολουθεί αλλαγές στο δέντρο προέλευσης του έργου
  • στέλνει εντολές που πρέπει να εκτελεστούν από την υπηρεσία Worker για την κατασκευή του έργου και τη δοκιμή του
  • ειδοποιεί χρήστες σχετικά με τα αποτελέσματα των ενεργειών που έγιναν

BuildMaster ρυθμίζεται μέσω αρχείου master.cfg. Αυτό το αρχείο βρίσκεται στη ρίζα BuildMaster. Αργότερα θα δείξω πώς δημιουργείται αυτή η ρίζα. Το ίδιο το αρχείο master.cfg περιέχει ένα σενάριο python που χρησιμοποιεί κλήσεις BuildBot.

Επόμενο πιο σημαντικό αντικείμενο BuildBot Έχει το όνομα Εργάτης. Αυτή η υπηρεσία μπορεί να ξεκινήσει σε άλλο κεντρικό υπολογιστή με διαφορετικό λειτουργικό σύστημα ή ίσως σε αυτόν όπου BuildMaster. Μπορεί επίσης να υπάρχει σε ένα ειδικά προετοιμασμένο εικονικό περιβάλλον με δικά του πακέτα και μεταβλητές. Αυτά τα εικονικά περιβάλλοντα μπορούν να προετοιμαστούν χρησιμοποιώντας βοηθητικά προγράμματα python όπως virtualenv, venv.

BuildMaster εκπέμπει εντολές σε όλους Εργάτης-υ, και αυτός με τη σειρά του τα εκπληρώνει. Δηλαδή, αποδεικνύεται ότι η διαδικασία κατασκευής και δοκιμής ενός έργου μπορεί να συνεχιστεί Εργάτης-e με Windows και σε άλλο Worker με Linux.

Ολοκλήρωση αγοράς Οι πηγαίοι κώδικες του έργου εμφανίζονται σε κάθε ένα Εργάτης-μι.

3. Εγκατάσταση

Λοιπόν πάμε. Θα χρησιμοποιήσω το Ubuntu 18.04 ως κεντρικό υπολογιστή. Θα βάλω ένα πάνω του BuildMaster-α και ένα Εργάτης-ένα. Αλλά πρώτα πρέπει να εγκαταστήσετε το python3.7:

sudo apt-get update
sudo apt-get install python3.7

Για όσους χρειάζονται python3.7.2 αντί για 3.7.1, μπορείτε να κάνετε τα εξής:


sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip

Το επόμενο βήμα είναι η εγκατάσταση Tweeted и BuildBot, καθώς και πακέτα που σας επιτρέπουν να χρησιμοποιήσετε πρόσθετη λειτουργικότητα BuildBot-Και.


/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/

#На хосте который производит мониторинг Worker-ов 
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование 
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда 

4. Πρώτα βήματα

Ώρα για δημιουργία BuildMaster. Θα είναι στον φάκελο μας /home/habr/master.

mkdir master
buildbot create-master master # Собственно сдесь и создаем

Επόμενο βήμα. Ας δημιουργήσουμε Εργάτης. Θα είναι στον φάκελο μας /σπίτι/habr/εργάτης.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

Όταν τρέχεις Εργάτης, τότε από προεπιλογή θα δημιουργήσει στο /σπίτι/habr/εργάτης φάκελο με το όνομα του έργου, το οποίο καθορίζεται στο master.cfg. Και στο φάκελο με το όνομα του έργου θα δημιουργήσει έναν κατάλογο χτίζω, και θα συνεχίσει να το κάνει checkout. Κατάλογος εργασίας για Εργάτης-και θα γίνει κατάλογος /home/habr/yourProject/build.

«Χρυσό κλειδί
Και τώρα αυτό για το οποίο έγραψα την προηγούμενη παράγραφο: ένα σενάριο που Κύριος θα απαιτήσει από Εργάτης-και γίνεται από απόσταση σε αυτόν τον κατάλογο δεν θα εκτελεστεί επειδή το σενάριο δεν έχει δικαιώματα για εκτέλεση. Για να διορθώσετε την κατάσταση, θα χρειαστείτε ένα κλειδί --umask=0o22, το οποίο απαγορεύει την εγγραφή σε αυτόν τον κατάλογο, αλλά θα διατηρήσει τα δικαιώματα εκκίνησης. Και αυτό είναι το μόνο που χρειαζόμαστε.

BuildMaster и Εργάτης δημιουργήσουν μια σύνδεση μεταξύ τους. Συμβαίνει να σπάσει και Εργάτης περιμένοντας λίγο χρόνο για απάντηση από BuildMaster-ΕΝΑ. Εάν δεν υπάρχει απόκριση, η σύνδεση επανεκκινείται. Κλειδί --keepalive=60 έπρεπε απλώς να υποδείξετε την ώρα μετά την οποία connect επανεκκινήσεις.

5. Διαμόρφωση. Βήμα προς βήμα συνταγή

Διαμόρφωση BuildMaster εκτελείται στην πλευρά του μηχανήματος όπου εκτελέσαμε την εντολή δημιουργία-κύριος. Στην περίπτωσή μας, αυτός είναι ένας κατάλογος /home/habr/master. Αρχείο διαμόρφωσης master.cfg δεν υπάρχει ακόμα, αλλά η ίδια η εντολή έχει ήδη δημιουργήσει το αρχείο master.cmg.δείγμα. Πρέπει να το μετονομάσετε σε master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Ας ανοίξουμε αυτό master.cfg. Και ας δούμε από τι αποτελείται. Και μετά από αυτό, ας προσπαθήσουμε να φτιάξουμε το δικό μας αρχείο ρυθμίσεων.

master.cfg

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
    'git://github.com/buildbot/hello-world.git',
         workdir='gitpoller-workdir', branch='master',
         pollInterval=300))
                        
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))
                        
factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))
                        
c['builders'] = []
c['builders'].append(
    util.BuilderConfig(name="runtests",
    workernames=["example-worker"],
    factory=factory))
                         
c['services'] = []
                        
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
                        
                        
c['buildbotURL'] = "http://localhost:8010/"
                        
c['www'] = dict(port=8010,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
                        
c['db'] = {
    'db_url' : "sqlite:///state.sqlite",
}

5.1 BuildmasterConfig

c = BuildmasterConfig = {} 

BuildmasterConfig — βασικό λεξικό του αρχείου διαμόρφωσης. Πρέπει να περιλαμβάνεται στο αρχείο ρυθμίσεων. Για ευκολία στη χρήση, εισάγεται ένα ψευδώνυμο στον κώδικα διαμόρφωσης "εναντίον". Τίτλοι των κλειδιών в c["keyFromDist"] είναι σταθερά στοιχεία για αλληλεπίδραση με BuildMaster. Για κάθε κλειδί, το αντίστοιχο αντικείμενο αντικαθίσταται ως τιμή.

εργαζομένων 5.2

c['workers'] = [worker.Worker("example-worker", "pass")]

Αυτή τη φορά υποδεικνύουμε BuildMaster-y κατάλογος των Εργάτης-μικρό. Εγώ ο ίδιος Εργάτης δημιουργήσαμε πάνω από, υποδεικνύοντας εσύ-εργάτης-όνομα и κωδικό πρόσβασης. Τώρα πρέπει να καθοριστούν αντ' αυτού παράδειγμα-εργάτης и passieren .

5.3 change_source

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

Με κλειδί change_source λεξικό γ αποκτάμε πρόσβαση στη λίστα όπου θέλουμε να τοποθετήσουμε ένα αντικείμενο που δημοσκοπεί το αποθετήριο με τον πηγαίο κώδικα του έργου. Το παράδειγμα χρησιμοποιεί ένα αποθετήριο Git που ελέγχεται σε συγκεκριμένα χρονικά διαστήματα.

Το πρώτο επιχείρημα είναι η διαδρομή προς το αποθετήριο σας.

σκηνοθεσία εργασίας αντιπροσωπεύει τη διαδρομή προς το φάκελο στο πλάι Εργάτης-ένας συγγενής με το μονοπάτι /home/habr/worker/yourProject/build Το git θα αποθηκεύσει την τοπική έκδοση του αποθετηρίου.

υποκατάστημα περιέχει ένα συγκεκριμένο κλάδο στο αποθετήριο που πρέπει να ακολουθηθεί.

pollInterval περιέχει τον αριθμό των δευτερολέπτων μετά τα οποία BuildMaster θα κάνει δημοσκόπηση στο αποθετήριο για αλλαγές.

Υπάρχουν πολλές μέθοδοι παρακολούθησης αλλαγών στο χώρο αποθήκευσης ενός έργου.

Η απλούστερη μέθοδος είναι Polling, πράγμα που σημαίνει ότι BuildMaster περιοδικά δημοσκοπήσεις στον διακομιστή με το αποθετήριο. Αν διαπράττουν αντανακλούσε τις αλλαγές στο αποθετήριο, λοιπόν BuildMaster θα δημιουργήσει ένα εσωτερικό αντικείμενο με κάποια καθυστέρηση Αλλαγή και στείλτε το στον χειριστή συμβάντων Scheduler, το οποίο θα ξεκινήσει τα βήματα για την κατασκευή και τη δοκιμή του έργου Εργάτης-μι. Μεταξύ αυτών των βημάτων θα αναφέρεται ενημέρωση αποθήκη. Ακριβώς επάνω ΕργάτηςΑυτό θα δημιουργήσει ένα τοπικό αντίγραφο του αποθετηρίου. Οι λεπτομέρειες αυτής της διαδικασίας θα καλυφθούν παρακάτω στις επόμενες δύο ενότητες. (5.4 и 5.5).

Μια ακόμη πιο κομψή μέθοδος παρακολούθησης αλλαγών σε ένα αποθετήριο είναι η αποστολή μηνυμάτων απευθείας από τον διακομιστή που το φιλοξενεί στο BuildMaster- σχετικά με την αλλαγή των πηγαίων κωδικών του έργου. Σε αυτήν την περίπτωση, μόλις ο προγραμματιστής κάνει διαπράττουν, ο διακομιστής με το αποθετήριο του έργου θα στείλει ένα μήνυμα BuildMaster-υ. Και αυτός με τη σειρά του θα το υποκλέψει δημιουργώντας ένα αντικείμενο PBChangeSource. Στη συνέχεια, αυτό το αντικείμενο θα μεταφερθεί στο Scheduler, το οποίο ενεργοποιεί τα βήματα για την κατασκευή του έργου και τη δοκιμή του. Ένα σημαντικό μέρος αυτής της μεθόδου είναι η εργασία με άγκιστρο-σενάρια διακομιστή στο αποθετήριο. Στο σενάριο άγκιστρο-α, υπεύθυνος επεξεργασίας ενεργειών όταν διαπράττουν-ε, πρέπει να καλέσετε το βοηθητικό πρόγραμμα αποστολή αλλαγής και καθορίστε τη διεύθυνση δικτύου BuildMaster-ΕΝΑ. Πρέπει επίσης να καθορίσετε τη θύρα δικτύου που θα ακούει PBChangeSource. PBChangeSource, παρεμπιπτόντως, είναι μέρος BuildMaster-ΕΝΑ. Αυτή η μέθοδος απαιτεί άδεια διαχειριστής-a στον διακομιστή όπου βρίσκεται το αποθετήριο του έργου. Πρώτα θα χρειαστεί να δημιουργήσετε ένα αντίγραφο ασφαλείας του αποθετηρίου.

5.4 χρονοπρογραμματιστές


c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))

προγραμματιστές – αυτό είναι ένα στοιχείο που λειτουργεί ως έναυσμα που ξεκινά ολόκληρη την αλυσίδα συναρμολόγησης και δοκιμών του έργου.
Ένα παράδειγμα υλοποίησης της Συνεχούς Ενοποίησης με το BuildBot

Αυτές οι αλλαγές που καταγράφηκαν change_source, μεταμορφώθηκε στη διαδικασία της εργασίας BuildBot-a να αντιταχθώ Αλλαγή και τώρα κάθε Σιδερωτής βάσει αυτών, δημιουργεί αιτήματα για να ξεκινήσει η διαδικασία κατασκευής έργου. Ωστόσο, καθορίζει επίσης πότε αυτά τα αιτήματα μεταφέρονται περαιτέρω στην ουρά. Ενα αντικείμενο Οικοδόμος αποθηκεύει μια ουρά αιτημάτων και παρακολουθεί την κατάσταση της τρέχουσας διάταξης σε ξεχωριστό Εργάτης-και. Οικοδόμος υπάρχει στις BuildMaster-ε και επάνω Εργάτης-μι. Στέλνει με BuildMaster-a on Εργάτης-και ήδη συγκεκριμένο χτίζω - μια σειρά βημάτων που πρέπει να ακολουθηθούν.
Βλέπουμε ότι στο σημερινό παράδειγμα τέτοια προγραμματιστές Δημιουργούνται 2 κομμάτια. Επιπλέον, το καθένα έχει τον δικό του τύπο.

SingleBranchScheduler – ένα από τα πιο δημοφιλή μαθήματα στο πρόγραμμα. Παρακολουθεί έναν κλάδο και ενεργοποιείται από μια καταγεγραμμένη αλλαγή σε αυτό. Όταν δει αλλαγές, μπορεί να καθυστερήσει την αποστολή του αιτήματος κατασκευής (αναβολή για την περίοδο που καθορίζεται στην ειδική παράμετρο treeStableTimer) Στο όνομα ορίζει το όνομα του χρονοδιαγράμματος που θα εμφανίζεται BuildBot-διασύνδεση ιστού. ΣΕ Αλλαγή φίλτρου ορίζεται ένα φίλτρο, αφού περάσει το οποίο αλλαγές στον κλάδο ζητούν από το χρονοδιάγραμμα να στείλει αίτημα για κατασκευή. ΣΕ οικοδόμοι ονόματα αναφέρεται το όνομα Builder-α, που θα ρυθμίσουμε λίγο αργότερα. Το όνομα στην περίπτωσή μας θα είναι το ίδιο με το όνομα του έργου: το έργο σας.

ForceScheduler ένα πολύ απλό πράγμα. Αυτός ο τύπος χρονοδιαγράμματος ενεργοποιείται με ένα κλικ του ποντικιού BuildBot-διασύνδεση ιστού. Οι παράμετροι έχουν την ίδια ουσία όπως στο SingleBranchScheduler.

ΥΓ Νο 3. Ίσως σας φανεί χρήσιμο
Περιοδικά είναι ένα πρόγραμμα που εκτελείται σε μια συγκεκριμένη χρονικά καθορισμένη συχνότητα. Η κλήση μοιάζει κάπως έτσι


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 BuildFactory


factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))

periodicBuildTimer καθορίζει το χρόνο αυτής της περιοδικότητας σε δευτερόλεπτα.

BuildFactory δημιουργεί ένα συγκεκριμένο χτίζω, που στη συνέχεια Builder στέλνει σε Εργάτης. Σε BuildFactory υποδεικνύει τα βήματα που πρέπει να ακολουθηθούν Εργάτης-υ. Τα βήματα προστίθενται καλώντας τη μέθοδο addStep

Το πρώτο βήμα που προστέθηκε σε αυτό το παράδειγμα είναι git καθαρός -d -f -f –xτότε git ολοκλήρωση αγοράς. Αυτές οι ενέργειες περιλαμβάνονται στην παράμετρο μέθοδος, το οποίο δεν δηλώνεται ξεκάθαρα αλλά υποδηλώνει μια προεπιλεγμένη τιμή φρέσκο. Παράμετρος mode='incremental' υποδεικνύει ότι τα αρχεία προέρχονται από τον κατάλογο όπου το chechout, ενώ λείπει από το αποθετήριο, παραμένουν ανέγγιχτα.

Το δεύτερο βήμα που προστέθηκε είναι η κλήση του σεναρίου δίκη με παράμετρο γειά σου στην άκρη Εργάτης-α από κατάλογο /home/habr/worker/yourProject/build με τη μεταβλητή περιβάλλοντος PATHONPATH=... Έτσι, μπορείτε να γράψετε τα δικά σας σενάρια και να τα εκτελέσετε στο πλάι Εργάτης- κάθε βήμα Util.ShellCommand. Αυτά τα σενάρια μπορούν να τοποθετηθούν απευθείας στο αποθετήριο. Στη συνέχεια στο chechout-ε θα πέσουν μέσα /home/habr/worker/yourProject/build. Ωστόσο, τότε υπάρχουν δύο «αλλά»:

  1. Εργάτης πρέπει να δημιουργηθεί με κλειδί --umask έτσι ώστε να μην μπλοκάρει τα δικαιώματα εκτέλεσης μετά checkout-Και.
  2. Στο git push-e από αυτά τα σενάρια πρέπει να καθορίσετε την ιδιότητα διεγέρσιμοςέτσι ώστε αργότερα chechout-e δεν έχασε το δικαίωμα εκτέλεσης του σεναρίου Git.

5.6 οικοδόμοι


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

Σχετικά με το τι είναι Οικοδόμος ειπώθηκε εδώ. Τώρα θα σας πω με περισσότερες λεπτομέρειες πώς να το δημιουργήσετε. BuilderConfig είναι κατασκευαστής Builder. Τέτοιοι σχεδιαστές σε γ['οικοδόμοι'] μπορείτε να καθορίσετε πολλά, καθώς αυτό είναι ένα φύλλο αντικειμένων Builder τύπος. Τώρα ας ξαναγράψουμε το παράδειγμα από BuildBot, φέρνοντάς το πιο κοντά στο έργο μας.


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

Τώρα θα σας πω για τις παραμέτρους BuilderConfig.

όνομα καθορίζει το όνομα Builder-ένα. Εδώ το ονομάσαμε το έργο σας. Αυτό σημαίνει ότι στις Εργάτης- αυτό ακριβώς το μονοπάτι θα δημιουργηθεί /home/habr/worker/yourProject/build. Σιδερωτής ψάχνω Builder μόνο με αυτό το όνομα.

ονόματα εργαζομένων περιέχει φύλλο Εργάτης-μικρό. Καθένα από τα οποία πρέπει να προστεθεί γ['εργάτες'].

εργοστάσιο - συγκεκριμένος χτίζω, με το οποίο συνδέεται Builder. Θα στείλει το αντικείμενο χτίζω επί Εργάτης για να ολοκληρώσετε όλα τα βήματα που περιλαμβάνονται σε αυτό χτίζω-Και.

6. Παράδειγμα της δικής σας διαμόρφωσης

Εδώ είναι το παράδειγμα αρχιτεκτονικής έργου που προτείνω να υλοποιηθεί μέσω BuildBot
.

Θα χρησιμοποιήσουμε ως σύστημα ελέγχου έκδοσης svn. Το ίδιο το αποθετήριο θα βρίσκεται σε κάποιο είδος σύννεφου. Εδώ είναι η διεύθυνση αυτού του σύννεφου svn.host/svn/yourProject/trunk. Στο σύννεφο από κάτω svn υπάρχει ένα όνομα χρήστη λογαριασμού: χρήστη, passwd: κωδικό πρόσβασης. Σενάρια που αντιπροσωπεύουν βήματα χτίζω-α θα είναι και στο υποκατάστημα svn, σε ξεχωριστό φάκελο buildbot/worker_linux. Αυτά τα σενάρια βρίσκονται στο αποθετήριο με την αποθηκευμένη ιδιότητα εκτελέσιμο.

BuildMaster и Εργάτης τρέξτε στον ίδιο κεντρικό υπολογιστή έργο.οικοδεσπότης .BuildMaster αποθηκεύει τα αρχεία του σε ένα φάκελο /home/habr/master. Εργάτης αποθηκεύεται στην παρακάτω διαδρομή /σπίτι/habr/εργάτης. Διαδικασία επικοινωνίας BuildMaster-α και Εργάτης-a πραγματοποιείται μέσω της θύρας 4000 σύμφωνα με το πρωτόκολλο BuildBot-α, δηλαδή 'pb' πρωτόκολλο.

Το έργο-στόχος είναι γραμμένο εξ ολοκλήρου σε Python. Το καθήκον είναι να παρακολουθείτε τις αλλαγές του, να δημιουργήσετε ένα εκτελέσιμο αρχείο, να δημιουργήσετε τεκμηρίωση και να πραγματοποιήσετε δοκιμές. Σε περίπτωση αποτυχίας, όλοι οι προγραμματιστές πρέπει να στείλουν ένα μήνυμα μέσω email δηλώνοντας ότι υπάρχει μια ανεπιτυχής ενέργεια.

Εμφάνιση Ιστού BuildBot θα συνδεθούμε στη θύρα 80 για έργο.οικοδεσπότης. Δεν είναι απαραίτητο να εγκαταστήσετε το Apatch. Ως μέρος της βιβλιοθήκης στριμμένα υπάρχει ήδη διακομιστής web, BuildBot το χρησιμοποιεί.

Για αποθήκευση εσωτερικών πληροφοριών για BuildBot θα το χρησιμοποιησουμε sqlite.

Απαιτείται κεντρικός υπολογιστής για την αποστολή smtp.your.domain - επιτρέπει την αποστολή επιστολών από το ταχυδρομείο [προστασία μέσω email] χωρίς έλεγχο ταυτότητας. Επίσης στον οικοδεσπότη'smtp Τα πρακτικά ακούγονται στο ταχυδρομείο 1025.

Στη διαδικασία συμμετέχουν δύο άτομα: διαχειριστής и χρήστη. ο διαχειριστής διαχειρίζεται BuildBot. χρήστης είναι το άτομο που δεσμεύεται διαπράττουν-μικρό.

Το εκτελέσιμο αρχείο δημιουργείται μέσω pyinstaller. Η τεκμηρίωση δημιουργείται μέσω οξυγόνο.

Για αυτήν την αρχιτεκτονική έγραψα αυτό: master.cfg:

master.cfg


import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters

c= BuildmasterConfig ={}

c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}} 


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                                svnuser="user",
                                svnpasswd="password",
                                pollinterval=60,
				split_file=util.svn.split_file_alwaystrunk
                                )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                                name="your-project-schedulers",
				change_filter=util.ChangeFilter(branch=None),
                                builderNames=["yourProject"],
				properties = {'owner': 'admin'}
                                )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                        mode='full',
                        method='fresh',
                        username="user",
                        password="password",
                        haltOnFailure=True)

	
projectHost_build = util.BuildFactory()  


cleanProject = steps.ShellCommand(name="Clean",
                 command=["buildbot/worker_linux/pyinstaller_project", "clean"]
                                )
buildProject = steps.ShellCommand(name="Build",
                 command=["buildbot/worker_linux/pyinstaller_project", "build"]
                                )
doxyProject = steps.ShellCommand(name="Update Docs",
                                command=["buildbot/worker_linux/gendoc", []]
                                )
testProject = steps.ShellCommand(name="Tests",
                                command=["python","tests/utest.py"],
                                env={'PYTHONPATH': '.'}
                                )

projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)


c['builders'] = [
        util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''

sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
					sendToInterestedUsers=True,
					lookup="your.domain",
					relayhost="smtp.your.domain",
					smtpPort=1025,
					mode="warnings",
					extraRecipients=['[email protected]'],
              messageFormatter=reporters.MessageFormatter(
						template=template_html,
						template_type='html',
						wantProperties=True, 
                                                wantSteps=True)
					)
c['services'] = [sendMessageToAll]

c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"

c['buildbotURL'] = "http://project.host"

c['www'] = dict(port=80,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))


c['db'] = {
    'db_url' : "sqlite:///state.sqlite"
}

Πρώτα χρειάζεστε δημιουργήστε BuildMaster-α και Εργάτης-ένα. Στη συνέχεια, επικολλήστε αυτό το αρχείο master.cfg в /home/habr/master.

Το επόμενο βήμα είναι να ξεκινήσετε την υπηρεσία BuildMasterα


sudo buildbot start /home/habr/master

Στη συνέχεια ξεκινήστε την υπηρεσία Εργάτης-a


buildbot-worker start /home/habr/worker

Ετοιμος! Τώρα Buildbot θα παρακολουθεί τις αλλαγές και θα ενεργοποιεί διαπράττουν-υ σε svn, εκτελώντας τα βήματα κατασκευής και δοκιμής έργου με την παραπάνω αρχιτεκτονική.

Παρακάτω θα περιγράψω μερικά χαρακτηριστικά των παραπάνω master.cfg.

6.1 Στο δρόμο για τον κύριο σας.cfg


Ενώ έγραφα το δικό μου master.cfg Θα γίνουν πολλά σφάλματα, επομένως θα χρειαστεί να διαβάσετε το αρχείο καταγραφής. Αποθηκεύεται ως BuildMaster-ec απόλυτη διαδρομή /home/habr/master/twistd.log, και στο πλάι Εργάτης-α με απόλυτη διαδρομή /home/habr/worker/twistd.log. Καθώς διαβάζετε το σφάλμα και το διορθώνετε, θα πρέπει να επανεκκινήσετε την υπηρεσία BuildMaster-ένα. Δείτε πώς γίνεται:


sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master

6.2 Εργασία με svn


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                               svnuser="user",
                               svnpasswd="password",
                               pollinterval=60,
                               split_file=util.svn.split_file_alwaystrunk
                        )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                            name="your-project-schedulers",
                            change_filter=util.ChangeFilter(branch=None),
                            builderNames=["yourProject"],
                            properties = {'owner': 'admin'}
                        )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                     mode='full',
                     method='fresh',
                     username="user",
                     password="password",
                     haltOnFailure=True)

Αρχικά, ας ρίξουμε μια ματιά svn_poller. Αυτή εξακολουθεί να είναι η ίδια διεπαφή, η οποία εξετάζει τακτικά το αποθετήριο μία φορά το λεπτό. Σε αυτήν την περίπτωση svn_poller έχει πρόσβαση μόνο στο υποκατάστημα πορτ-μπαγκάζ. Μυστηριώδης παράμετρος split_file=util.svn.split_file_alwaystrunk ορίζει τους κανόνες: πώς να διασπάσετε τη δομή του φακέλου svn στα κλαδιά. Τους προσφέρει και σχετικούς δρόμους. Με τη σειρά του split_file_alwaystrunk απλοποιεί τη διαδικασία λέγοντας ότι το αποθετήριο περιέχει μόνο πορτ-μπαγκάζ.

В Προγραμματιστές υποδεικνύεται Αλλαγή φίλτρουποιος βλέπει Κανένας και συσχετίζει ένα υποκατάστημα με αυτό πορτ-μπαγκάζ σύμφωνα με μια δεδομένη συσχέτιση μέσω split_file_alwaystrunk. Ανταπόκριση σε αλλαγές σε πορτ-μπαγκάζ, Εκκινήσεις Builder με όνομα το έργο σας.

ιδιότητες Εδώ είναι απαραίτητο ώστε ο διαχειριστής να λαμβάνει λίστες αλληλογραφίας με αποτελέσματα κατασκευής και δοκιμών ως κάτοχος της διαδικασίας.

Βήμα χτίζω-a checkout μπορεί να διαγράψει πλήρως όλα τα αρχεία που βρίσκονται στην τοπική έκδοση του αποθετηρίου Εργάτης-ΕΝΑ. Και μετά κάντε το πλήρες svn ενημέρωση. Η λειτουργία διαμορφώνεται μέσω της παραμέτρου λειτουργία=πλήρης, μέθοδος=φρέσκος. Παράμετρος haltOnTailure λέει ότι αν svn ενημέρωση θα εκτελεστεί με σφάλμα, τότε η όλη διαδικασία κατασκευής και δοκιμής θα πρέπει να ανασταλεί, αφού περαιτέρω ενέργειες δεν έχουν νόημα.

6.3 Επιστολή προς εσάς: οι δημοσιογράφοι είναι εξουσιοδοτημένοι να δηλώσουν


δημοσιογράφους είναι μια υπηρεσία για την αποστολή ειδοποιήσεων μέσω email.


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
                        
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
                                          sendToInterestedUsers=True,
                                          lookup="your.domain",
                                          relayhost="smtp.your.domain",
                                          smtpPort=1025,
                                          mode="warnings",
                                          extraRecipients=['[email protected]'],
                                    messageFormatter=reporters.MessageFormatter(
                                                    template=template_html,
                                                    template_type='html',
                                                    wantProperties=True, 
                                                    wantSteps=True)
                                        )
c['services'] = [sendMessageToAll]

Μπορεί να στείλει μηνύματα διαφορετικοί τρόποι.

MailNotifier χρησιμοποιεί email για την αποστολή ειδοποιήσεων.

template_html ορίζει το πρότυπο κειμένου για το ενημερωτικό δελτίο. Η HTML χρησιμοποιείται για τη δημιουργία σήμανσης. Τροποποιείται από τον κινητήρα jinja2 (μπορεί να συγκριθεί με Django). BuildBot έχει ένα σύνολο μεταβλητών των οποίων οι τιμές αντικαθίστανται στο πρότυπο κατά τη διαδικασία δημιουργίας του κειμένου του μηνύματος. Αυτές οι μεταβλητές περικλείονται σε {{ διπλά σγουρά άγκιστρα }}. Για παράδειγμα, περίληψη εμφανίζει την κατάσταση των ολοκληρωμένων λειτουργιών, δηλαδή επιτυχία ή αποτυχία. ΕΝΑ έργα θα βγει το έργο σας. Έτσι, χρησιμοποιώντας εντολές ελέγχου στο jinja2, μεταβλητές BuildBot-a και εργαλεία μορφοποίησης συμβολοσειρών python, μπορείτε να δημιουργήσετε ένα αρκετά κατατοπιστικό μήνυμα.

MailNotifier περιέχει τα ακόλουθα επιχειρήματα.

fromaddr – τη διεύθυνση από την οποία όλοι θα λαμβάνουν το ενημερωτικό δελτίο.

αποστολή Στους Ενδιαφερόμενους Χρήστες=True στέλνει ένα μήνυμα στον κάτοχο και τον χρήστη που το έκανε διαπράττουν.

αναζήτηση — ένα επίθημα που πρέπει να προστεθεί στα ονόματα των χρηστών που λαμβάνουν το ενημερωτικό δελτίο. Έτσι διαχειριστής πώς ο χρήστης θα λάβει το ενημερωτικό δελτίο στη διεύθυνση [προστασία μέσω email].

αναμεταδότης καθορίζει το όνομα κεντρικού υπολογιστή στον οποίο ανοίγει ο διακομιστής smtp, μια smptPort καθορίζει τον αριθμό θύρας που ακούει smtp υπηρέτης.

mode = "προειδοποίηση" λέει ότι η αποστολή πρέπει να γίνεται μόνο εάν υπάρχει τουλάχιστον ένα βήμα χτίζω-a, το οποίο έληξε με την αποτυχία κατάστασης ή την προειδοποίηση. Σε περίπτωση επιτυχίας, δεν χρειάζεται να στείλετε ενημερωτικό δελτίο.

επιπλέον Παραλήπτες περιέχει έναν κατάλογο προσώπων στα οποία πρέπει να σταλεί η αλληλογραφία εκτός από τον ιδιοκτήτη και το πρόσωπο που πραγματοποίησε την διαπράττουν.

messageFormatter είναι ένα αντικείμενο που καθορίζει τη μορφή του μηνύματος, το πρότυπό του και ένα σύνολο μεταβλητών που είναι διαθέσιμες από jinja2. Επιλογές όπως wantProperties=True и wantSteps=Αλήθεια ορίστε αυτό το σύνολο διαθέσιμων μεταβλητών.

with['services']=[sendMessageTo All] παρέχει μια λίστα υπηρεσιών, μεταξύ των οποίων θα είναι και η δική μας δημοσιογράφος.

Τα καταφέραμε! Συγχαρητήρια

Δημιουργήσαμε τη δική μας διαμόρφωση και είδαμε τη λειτουργικότητα που μπορεί να κάνει. BuildBot. Αυτό, νομίζω, είναι αρκετό για να καταλάβετε αν αυτό το εργαλείο χρειάζεται για τη δημιουργία του έργου σας. Σε ενδιαφέρει; Θα σας είναι χρήσιμο; Είναι άνετος να συνεργαστεί μαζί του; Τότε δεν γράφω μάταια αυτό το άρθρο.

Και επιπλέον. Θα ήθελα η επαγγελματική κοινότητα να χρησιμοποιεί BuildBot, έγινε ευρύτερο, μεταφράστηκαν εγχειρίδια και υπήρξαν ακόμη περισσότερα παραδείγματα.

Σας ευχαριστώ όλους για την προσοχή σας. Καλή τύχη.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο