Προγραμματισμός

Τι είναι η Jenkins; Ο διακομιστής CI εξήγησε

Η Jenkins προσφέρει έναν απλό τρόπο δημιουργίας περιβάλλοντος συνεχούς ολοκλήρωσης ή συνεχούς παράδοσης (CI / CD) για σχεδόν οποιονδήποτε συνδυασμό γλωσσών και αποθετηρίων πηγαίου κώδικα χρησιμοποιώντας αγωγούς, καθώς και αυτοματοποίηση άλλων εργασιών ρουτίνας ανάπτυξης. Παρόλο που η Jenkins δεν εξαλείφει την ανάγκη δημιουργίας σεναρίων για μεμονωμένα βήματα, σας δίνει έναν πιο γρήγορο και πιο ισχυρό τρόπο για να ενσωματώσετε ολόκληρη την αλυσίδα των εργαλείων κατασκευής, δοκιμών και ανάπτυξης από ό, τι μπορείτε να δημιουργήσετε εύκολα.

"Μην σπάσεις τη νυχτερινή κατασκευή!" είναι ένας βασικός κανόνας στα καταστήματα ανάπτυξης λογισμικού που δημοσιεύουν μια φρέσκια καθημερινή έκδοση προϊόντος κάθε πρωί για τους δοκιμαστές τους. Πριν από τη Jenkins, το καλύτερο που μπορούσε να κάνει ένας προγραμματιστής για να αποφύγει το σπάσιμο της νυχτερινής κατασκευής ήταν να δημιουργήσει και να δοκιμάσει προσεκτικά και με επιτυχία σε ένα τοπικό μηχάνημα πριν από την εκτέλεση του κώδικα. Αλλά αυτό σήμαινε να δοκιμάσουμε τις αλλαγές στην απομόνωση, χωρίς καθημερινές δεσμεύσεις όλων των άλλων. Δεν υπήρχε σταθερή εγγύηση ότι το νυχτερινό κτίριο θα επιβιώσει της δέσμευσης.

Η Jenkins - αρχικά Hudson - ήταν μια άμεση απάντηση σε αυτόν τον περιορισμό.

Hudson και Jenkins

Το 2004, ο Kohsuke Kawaguchi ήταν προγραμματιστής Java στο Sun. Ο Kawaguchi κουράστηκε να σπάσει τις κατασκευές στο αναπτυξιακό του έργο και ήθελε να βρει έναν τρόπο να ξέρει, προτού δώσει κώδικα στο αποθετήριο, εάν ο κώδικας θα λειτουργούσε. Έτσι, η Kawaguchi δημιούργησε έναν διακομιστή αυτοματισμού μέσα και για την Java για να το κάνει αυτό δυνατό, που ονομάζεται Hudson. Ο Hudson έγινε δημοφιλής στο Sun και εξαπλώθηκε σε άλλες εταιρείες ως ανοιχτού κώδικα.

Γρήγορη προώθηση έως το 2011 και μια διαμάχη μεταξύ της Oracle (η οποία είχε αποκτήσει τη Sun) και της ανεξάρτητης κοινότητας ανοιχτού κώδικα Hudson οδήγησε σε ένα πιρούνι με αλλαγή ονόματος, Jenkins. Το 2014 η Kawaguchi έγινε CTO της CloudBees, η οποία προσφέρει προϊόντα συνεχούς παράδοσης με βάση τη Jenkins.

Και τα δύο πιρούνια συνέχισαν να υπάρχουν, αν και η Jenkins ήταν πολύ πιο ενεργή. Σήμερα, το έργο Jenkins είναι ακόμα ενεργό. Ο ιστότοπος του Hudson έκλεισε στις 31 Ιανουαρίου 2020.

Τον Μάρτιο του 2019, το Ίδρυμα Linux, μαζί με το CloudBees, την Google και ορισμένες άλλες εταιρείες, ξεκίνησαν ένα νέο ίδρυμα λογισμικού ανοιχτού κώδικα που ονομάζεται Ίδρυμα Συνεχούς Παράδοσης (CDF) Οι συνεργάτες της Jenkins αποφάσισαν ότι το πρόγραμμά τους θα έπρεπε να ενταχθεί σε αυτό το νέο ίδρυμα. Ο Kawaguchi έγραψε εκείνη την εποχή ότι τίποτα σημαντικό δεν θα άλλαζε για τους χρήστες.

Τον Ιανουάριο του 2020, ο Kawaguchi ανακοίνωσε ότι μετακόμισε στη νέα του εκκίνηση, το Launchable. Είπε επίσης ότι θα επιστρέψει επισήμως από τη Jenkins, αν και θα παραμείνει στην Επιτροπή Τεχνικής Παρακολούθησης του Ιδρύματος Συνεχούς Παράδοσης και θα αλλάξει το ρόλο του στο CloudBees σε σύμβουλο.

Σχετικό βίντεο: Τρόπος παράδοσης κώδικα πιο γρήγορα με CI / CD

Αυτοματισμός Jenkins

Σήμερα η Jenkins είναι ο κορυφαίος διακομιστής αυτοματισμού ανοιχτού κώδικα με περίπου 1.600 προσθήκες για την υποστήριξη της αυτοματοποίησης όλων των ειδών αναπτυξιακών εργασιών. Το πρόβλημα που αρχικά προσπαθούσε να λύσει η Kawaguchi, συνεχής ολοκλήρωση και συνεχής παράδοση κώδικα Java (δηλ. Κατασκευή έργων, εκτέλεση δοκιμών, ανάλυση στατικού κώδικα και ανάπτυξη) είναι μόνο μία από τις πολλές διαδικασίες που αυτοματοποιούν οι χρήστες με τον Jenkins. Αυτές οι 1.600 προσθήκες καλύπτουν πέντε περιοχές: πλατφόρμες, διεπαφή χρήστη, διαχείριση, διαχείριση πηγαίου κώδικα και, πιο συχνά, διαχείριση δόμησης.

Πώς λειτουργεί η Jenkins

Η Jenkins διανέμεται ως αρχείο WAR και ως πακέτα εγκατάστασης για τα κύρια λειτουργικά συστήματα, ως πακέτο Homebrew, ως εικόνα Docker και ως πηγαίος κώδικας. Ο πηγαίος κώδικας είναι κυρίως Java, με μερικά αρχεία Groovy, Ruby και Antlr.

Μπορείτε να εκτελέσετε το Jenkins WAR αυτόνομο ή ως servlet σε διακομιστή εφαρμογών Java, όπως το Tomcat. Σε κάθε περίπτωση, παράγει μια διεπαφή χρήστη Ιστού και δέχεται κλήσεις στο REST API της.

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

Πρόσθετα Jenkins

Μόλις εγκατασταθεί, η Jenkins σάς επιτρέπει είτε να αποδεχτείτε την προεπιλεγμένη λίστα προσθηκών είτε να επιλέξετε τις δικές σας προσθήκες.

Μόλις επιλέξετε το αρχικό σας σύνολο προσθηκών, κάντε κλικ στο κουμπί Εγκατάσταση και θα προσθέσει η Jenkins.

Η κύρια οθόνη Jenkins εμφανίζει την τρέχουσα ουρά build και την κατάσταση Executor και προσφέρει συνδέσμους για τη δημιουργία νέων αντικειμένων (εργασίες), τη διαχείριση χρηστών, την προβολή ιστορικών build, τη διαχείριση Jenkins, την εξέταση των προσαρμοσμένων προβολών σας και τη διαχείριση των διαπιστευτηρίων σας.

Ένα νέο αντικείμενο Jenkins μπορεί να είναι οποιοσδήποτε από έξι τύπους εργασίας συν ένας φάκελος για την οργάνωση αντικειμένων.

Υπάρχουν 18 πράγματα που μπορείτε να κάνετε από τη σελίδα Διαχείριση Jenkins, συμπεριλαμβανομένης της επιλογής ανοίγματος διεπαφής γραμμής εντολών. Σε αυτό το σημείο, ωστόσο, θα πρέπει να εξετάσουμε τους αγωγούς, οι οποίοι είναι βελτιωμένες ροές εργασίας που συνήθως ορίζονται από σενάρια.

Αγωγούς Jenkins

Μόλις διαμορφώσετε τη Jenkins, είναι καιρός να δημιουργήσετε κάποια έργα που μπορεί να δημιουργήσει η Jenkins για εσάς. Ενώ εσείς μπορώ χρησιμοποιήστε το UI ιστού για να δημιουργήσετε σενάρια, η τρέχουσα βέλτιστη πρακτική είναι να δημιουργήσετε ένα σενάριο αγωγού, με το όνομα Jenkinsfile, και ελέγξτε το στο αποθετήριο σας. Το παρακάτω στιγμιότυπο οθόνης δείχνει τη φόρμα ιστού διαμόρφωσης για έναν αγωγό πολλαπλών διανομών.

Όπως μπορείτε να δείτε, οι πηγές υποκαταστημάτων για αυτό το είδος αγωγού στη βασική εγκατάσταση του Jenkins μπορεί να είναι αποθήκες Git ή Subversion, συμπεριλαμβανομένου του GitHub. Εάν χρειάζεστε άλλα είδη αποθετηρίων ή διαφορετικών διαδικτυακών υπηρεσιών αποθετηρίου, είναι απλώς θέμα προσθήκης των κατάλληλων προσθηκών και επανεκκίνησης του Jenkins. Προσπάθησα, αλλά δεν μπορούσα να σκεφτώ ένα σύστημα διαχείρισης πηγαίου κώδικα (SCM) που δεν έχει ήδη αναφερθεί μια προσθήκη Jenkins.

Οι αγωγοί Jenkins μπορούν να είναι δηλωτικοί ή σεναριογραφικοί. ΕΝΑ δηλωτικός ο αγωγός, ο απλούστερος από τους δύο, χρησιμοποιεί σύνταξη συμβατή με το Groovy - και αν θέλετε, μπορείτε να ξεκινήσετε το αρχείο με #!ευχάριστος για να δείξετε τον επεξεργαστή κώδικα στη σωστή κατεύθυνση. Ένας δηλωτικός αγωγός ξεκινά με ένα αγωγός μπλοκ, ορίζει ένα μέσο, και ορίζει στάδια που περιλαμβάνουν εκτελέσιμο βήματα, όπως στο παρακάτω παράδειγμα τριών σταδίων.

αγωγός {

πράκτορας οποιουδήποτε

στάδια {

στάδιο («Κατασκευή») {

βήματα {

echo "Κτίριο .."

            }

        }

στάδιο («Δοκιμή») {

βήματα {

echo "Δοκιμή .."

            }

        }

στάδιο («Ανάπτυξη») {

βήματα {

echo "Ανάπτυξη ...."

            }

        }

    }

}

αγωγός είναι το υποχρεωτικό εξωτερικό μπλοκ για την επίκληση της προσθήκης αγωγών Jenkins. μέσο καθορίζει πού θέλετε να εκτελέσετε τον αγωγό. όποιος λέει να χρησιμοποιήσει οποιονδήποτε διαθέσιμο παράγοντα για να τρέξει το αγωγό ή το στάδιο. Ένας πιο συγκεκριμένος πράκτορας θα μπορούσε να δηλώσει ένα κοντέινερ για χρήση, για παράδειγμα:

πράκτορας {

λιμενεργάτης {

εικόνα «maven: 3-alpine»

ετικέτα «η καθορισμένη ετικέτα μου»

args «-v / tmp: / tmp»

    }

}

στάδια περιέχει μια ακολουθία μιας ή περισσότερων οδηγιών σταδίου. Στο παραπάνω παράδειγμα, τα τρία στάδια είναι το Build, Test και Deploy.

βήματα κάνετε την πραγματική δουλειά. Στο παραπάνω παράδειγμα τα βήματα μόλις τυπωμένα μηνύματα. Ένα πιο χρήσιμο βήμα κατασκευής μπορεί να μοιάζει με το ακόλουθο:

αγωγός {

πράκτορας οποιουδήποτε

στάδια {

στάδιο («Κατασκευή») {

βήματα {

sh «φτιάχνω»

archiveArtifacts artifacts: ‘** / target / *. jar’, δακτυλικό αποτύπωμα: true

            }

        }

    }

}

Εδώ καλούμε φτιαχνω, κανω από ένα κέλυφος και στη συνέχεια αρχειοθέτηση οποιωνδήποτε παραγόμενων αρχείων JAR στο αρχείο Jenkins.

ο Θέση Η ενότητα ορίζει τις ενέργειες που θα εκτελεστούν στο τέλος της εκτέλεσης του αγωγού ή του σταδίου. Μπορείτε να χρησιμοποιήσετε έναν αριθμό μπλοκ μετά την κατάσταση στην ενότητα ανάρτησης: πάντα, άλλαξε, αποτυχία, επιτυχία, ασταθής, και ματαιώθηκε.

Για παράδειγμα, το παρακάτω Jenkinsfile εκτελεί πάντα το JUnit μετά το στάδιο δοκιμής, αλλά στέλνει ένα μήνυμα ηλεκτρονικού ταχυδρομείου μόνο εάν αποτύχει.

αγωγός {

πράκτορας οποιουδήποτε

στάδια {

στάδιο («Δοκιμή») {

βήματα {

sh «κάνε έλεγχο»

            }

        }

    }

Θέση {

πάντα {

junit «** / target / *. xml»

        }

αποτυχία {

αλληλογραφία στη διεύθυνση: [email protected], θέμα: «Η αγωγός απέτυχε :(»

        }

    }

}

Ο δηλωτικός αγωγός μπορεί να εκφράσει τα περισσότερα από όσα χρειάζεστε για να ορίσετε αγωγούς και είναι πολύ πιο εύκολο να το μάθετε από τη σύνταξη του σεναρίου, το οποίο είναι ένα DSL που βασίζεται στο Groovy. Ο σωληνωτός αγωγός είναι στην πραγματικότητα ένα πλήρες περιβάλλον προγραμματισμού.

Συγκριτικά, τα ακόλουθα δύο Jenkinsfiles είναι εντελώς ισοδύναμα.

Δηλωτικός αγωγός

αγωγός {

πράκτορας {docker «κόμβος: 6.3»}

στάδια {

στάδιο («κατασκευή») {

βήματα {

sh «npm — μετατροπή»

            }

        }

    }

Γραμμή αγωγών

κόμβος («docker») {

ολοκλήρωση αγοράς

στάδιο («Κατασκευή») {

docker.image («κόμβος: 6.3»). μέσα {

sh «npm — μετατροπή»

        }

    }

}

Blue Ocean, το GUI Jenkins

Αν θέλετε το πιο πρόσφατο και καλύτερο UI Jenkins, μπορείτε να χρησιμοποιήσετε την προσθήκη Blue Ocean, η οποία παρέχει μια γραφική εμπειρία χρήστη. Μπορείτε να προσθέσετε την προσθήκη Blue Ocean στην υπάρχουσα εγκατάσταση Jenkins ή να εκτελέσετε ένα κοντέινερ Jenkins / Blue Ocean Docker. Με το Blue Ocean εγκατεστημένο, το κύριο μενού του Jenkins θα έχει ένα επιπλέον εικονίδιο:

Μπορείτε να ανοίξετε το Blue Ocean απευθείας εάν το επιθυμείτε. Είναι στον / μπλε φάκελο στον διακομιστή Jenkins. Η δημιουργία αγωγών στο Blue Ocean είναι λίγο πιο γραφική από ό, τι στο απλό Jenkins:

Τζέκινς Ντόκερ

Όπως ανέφερα νωρίτερα, η Jenkins διανέμεται επίσης ως εικόνα του Docker. Δεν υπάρχουν πολλά περισσότερα στη διαδικασία: Αφού επιλέξετε τον τύπο SCM, παρέχετε μια διεύθυνση URL και διαπιστευτήρια και, στη συνέχεια, δημιουργήστε έναν αγωγό από ένα μοναδικό αποθετήριο ή σαρώστε όλα τα αποθετήρια στον οργανισμό. Κάθε υποκατάστημα με ένα Jenkinsfile θα έχει έναν αγωγό.

Εδώ τρέχω μια εικόνα Blue Ocean Docker, η οποία συνοδεύτηκε από μερικά πρόσθετα πρόσθετα υπηρεσιών Git από την προεπιλεγμένη λίστα των παρόχων SCM:

Μόλις εκτελέσετε ορισμένους αγωγούς, η προσθήκη Blue Ocean θα εμφανίσει την κατάστασή τους, όπως φαίνεται παραπάνω. Μπορείτε να κάνετε μεγέθυνση σε έναν μεμονωμένο αγωγό για να δείτε τα στάδια και τα βήματα:

Μπορείτε επίσης να μεγεθύνετε τα κλαδιά (πάνω) και τις δραστηριότητες (κάτω):

Γιατί να χρησιμοποιήσετε το Jenkins;

Η προσθήκη Jenkins Pipeline που χρησιμοποιούμε υποστηρίζει μια γενική περίπτωση χρήσης συνεχούς ολοκλήρωσης / συνεχούς παράδοσης (CICD), η οποία είναι πιθανώς η πιο κοινή χρήση για τη Jenkins. Υπάρχουν εξειδικευμένες εκτιμήσεις για ορισμένες άλλες περιπτώσεις χρήσης.

Τα έργα Java ήταν το πρωτότυπο raison d'être για τον Jenkins. Έχουμε ήδη δει ότι η Jenkins υποστηρίζει την κατασκευή με τον Maven. λειτουργεί επίσης με Ant, Gradle, JUnit, Nexus και Artifactory.

Το Android διαθέτει ένα είδος Java, αλλά εισάγει το ζήτημα του τρόπου δοκιμής σε ένα ευρύ φάσμα συσκευών Android. Η προσθήκη εξομοιωτή Android σάς επιτρέπει να δημιουργήσετε και να δοκιμάσετε όσες προσομοιωμένες συσκευές θέλετε να ορίσετε. Η προσθήκη Google Play Publisher σάς επιτρέπει να στέλνετε εκδόσεις σε ένα κανάλι άλφα στο Google Play για κυκλοφορία ή περαιτέρω δοκιμές σε πραγματικές συσκευές.

Έχω δείξει παραδείγματα όπου καθορίσαμε ένα κοντέινερ Docker ως πράκτορα για έναν αγωγό και όπου τρέξαμε τον Jenkins και το Blue Ocean σε ένα κοντέινερ Docker. Τα δοχεία Docker είναι πολύ χρήσιμα σε ένα περιβάλλον Jenkins για βελτίωση της ταχύτητας, της επεκτασιμότητας και της συνέπειας.

Υπάρχουν δύο σημαντικές περιπτώσεις χρήσης για τους Jenkins και GitHub. Το ένα είναι η ενσωμάτωση build, η οποία μπορεί να περιλαμβάνει ένα γάντζο υπηρεσίας για να ενεργοποιεί τη Jenkins σε κάθε δέσμευση στο αποθετήριο GitHub. Το δεύτερο είναι η χρήση του ελέγχου ταυτότητας GitHub για τον έλεγχο της πρόσβασης στο Jenkins μέσω OAuth.

Η Jenkins υποστηρίζει πολλές άλλες γλώσσες εκτός από την Java. Για C / C ++, υπάρχουν προσθήκες για την καταγραφή σφαλμάτων και προειδοποιήσεων από την κονσόλα, δημιουργία σεναρίων build με CMake, εκτέλεση δοκιμών μονάδας και εκτέλεση ανάλυσης στατικού κώδικα. Η Jenkins διαθέτει μια σειρά ενσωματώσεων με εργαλεία PHP.

Ενώ ο κώδικας Python δεν χρειάζεται να κατασκευαστεί (εκτός αν χρησιμοποιείτε το Cython, για παράδειγμα, ή δημιουργείτε έναν τροχό Python για εγκατάσταση), είναι χρήσιμο να ενσωματώνεται η Jenkins με εργαλεία δοκιμών και αναφοράς Python, όπως Nose2 και Pytest και ποιότητα κώδικα εργαλεία όπως το Pylint. Ομοίως, η Jenkins ενσωματώνεται με εργαλεία Ruby όπως Rake, Cucumber, Brakeman και CI :: Reporter.

Jenkins για CI / CD

Συνολικά, η Jenkins προσφέρει έναν απλό τρόπο ρύθμισης περιβάλλοντος CI / CD για σχεδόν οποιονδήποτε συνδυασμό γλωσσών και αποθετηρίων πηγαίου κώδικα χρησιμοποιώντας αγωγούς, καθώς και αυτοματοποίηση ορισμένων άλλων εργασιών ρουτίνας ανάπτυξης. Παρόλο που η Jenkins δεν εξαλείφει την ανάγκη δημιουργίας σεναρίων για μεμονωμένα βήματα, σας δίνει έναν γρηγορότερο και πιο ισχυρό τρόπο για να ενσωματώσετε ολόκληρη την αλυσίδα των εργαλείων κατασκευής, δοκιμών και ανάπτυξης από ό, τι θα μπορούσατε να δημιουργήσετε εύκολα.