Το CI/CD είναι η τεχνική ραχοκοκαλιά του DevOps. Είναι το σύνολο των πρακτικών που αυτοματοποιούν τη διαδρομή μεταξύ «του κώδικα που έγραψε ένας προγραμματιστής» και «της εφαρμογής που τρέχει στην παραγωγή».
| Αρκτικόλεξο | Όνομα | Με μία πρόταση |
|---|---|---|
| CI | Συνεχής ολοκλήρωση (Continuous Integration) | Συγχωνεύουμε και δοκιμάζουμε τον κώδικα συχνά και αυτόματα. |
| CD | Συνεχής παράδοση (Continuous Delivery) | Ο δοκιμασμένος κώδικας είναι πάντα έτοιμος να αναπτυχθεί (χειροκίνητη θέση σε παραγωγή). |
| CD | Συνεχής ανάπτυξη (Continuous Deployment) | Ο δοκιμασμένος κώδικας πηγαίνει αυτόματα στην παραγωγή. |
Χωρίς CI/CD, η παράδοση λογισμικού μοιάζει με χειροκίνητη μετακόμιση: αργή, κουραστική και επικίνδυνη. Με CI/CD, είναι ένας αυτοματοποιημένος ιμάντας: τοποθετείτε τον κώδικα στη μία άκρη, η εφαρμογή φτάνει έτοιμη στην άλλη.
🔧 Μικρή άσκηση — Συνδέστε κάθε αρκτικόλεξο με τον ορισμό του: (1) CI, (2) Continuous Delivery, (3) Continuous Deployment.
(1) CI = συγχώνευση + build + συχνές αυτόματες δοκιμές. (2) Continuous Delivery = πάντα έτοιμο για ανάπτυξη, χειροκίνητο κουμπί για την παραγωγή. (3) Continuous Deployment = θέση σε παραγωγή αυτόματα μετά από επιτυχημένες δοκιμές.
Η συνεχής ολοκλήρωση συνίσταται στο να συγχωνεύετε συχνά τον κώδικα όλων των προγραμματιστών σε έναν κοινό κλάδο, και να επικυρώνετε αυτόματα κάθε συγχώνευση με ένα build και δοκιμές.
| Χωρίς CI | Με CI |
|---|---|
| Συγχωνεύουμε τα πάντα στο τέλος του μήνα → μεγάλοι επώδυνοι συγκρούσεις | Συγχωνεύουμε πολλές φορές την ημέρα → μικρές εύκολες συγκρούσεις |
| Τα σφάλματα εντοπίζονται αργά | Τα σφάλματα εντοπίζονται σε λεπτά |
| «Δούλευε στον υπολογιστή μου» | Αναπαραγώγιμο build στον διακομιστή |
Αναλογία: να τακτοποιείτε την κουζίνα σας στην πορεία (CI) αντί να περιμένετε να λερωθούν τα πάντα (ενσωμάτωση «big bang»). Η μικρή συχνή προσπάθεια αποφεύγει τη σπάνια καταστροφή.
🔧 Μικρή άσκηση — Ένας προγραμματιστής κρατά τον κώδικά του 3 εβδομάδες χωρίς να τον συγχωνεύσει, και έπειτα επιχειρεί ένα μεγάλο merge. Ποια αρχή συνεχούς ολοκλήρωσης δεν τήρησε, και ποια συνέπεια είναι πιθανή;
Δεν συγχώνευσε συχνά. Πιθανή συνέπεια: μια μαζική σύγκρουση συγχώνευσης, δύσκολη στην επίλυση, και σφάλματα που εντοπίζονται πολύ αργά. Η CI συνιστά μικρές συχνές συγχωνεύσεις.
Τα δύο «CD» μοιάζουν αλλά διαφέρουν σε ένα μόνο σημείο: ποιος πατάει το κουμπί της θέσης σε παραγωγή.
| Continuous Delivery | Continuous Deployment | |
|---|---|---|
| Θέση σε παραγωγή | Χειροκίνητη (ένας άνθρωπος κάνει κλικ) | Αυτόματη |
| Έλεγχος | Τελική ανθρώπινη απόφαση | Καμία παρέμβαση |
| Ιδανικό για | Ρυθμιζόμενους τομείς, προγραμματισμένες εκδόσεις | Ώριμες ομάδες, υψηλό ποσοστό δοκιμών |
Continuous Delivery = το αυτοκίνητο είναι σταθμευμένο μπροστά στην πόρτα, έτοιμο, με τα κλειδιά στη μίζα· εσείς αποφασίζετε πότε θα ξεκινήσετε. Continuous Deployment = το αυτόνομο αυτοκίνητο ξεκινά μόνο του μόλις είναι έτοιμο.
🔧 Μικρή άσκηση — Μια τράπεζα θέλει κάθε θέση σε παραγωγή να εγκρίνεται από έναν υπεύθυνο. Ποιο «CD» να επιλέξετε;
Continuous Delivery: ο αγωγός καθιστά την έκδοση έτοιμη αυτόματα, αλλά η θέση σε παραγωγή παραμένει ανθρώπινη απόφαση (επικύρωση του υπευθύνου).
Ένας αγωγός είναι μια ακολουθία αυτοματοποιημένων βημάτων (που ονομάζονται stages) που μετατρέπουν τον πηγαίο κώδικα σε ανεπτυγμένη εφαρμογή. Αν ένα βήμα αποτύχει, ο αγωγός σταματά και η ομάδα ειδοποιείται.
| Stage | Ρόλος | Παράδειγμα εργαλείου |
|---|---|---|
| Checkout | Ανάκτηση του κώδικα από το Git | Git |
| Build | Μεταγλώττιση / συναρμολόγηση | Maven, npm, javac |
| Test | Αυτόματος έλεγχος | JUnit, pytest |
| Package | Παραγωγή ενός παραδοτέου τεχνουργήματος | .jar, εικόνα Docker |
| Staging | Ανάπτυξη στην προπαραγωγή | διακομιστής δοκιμών |
| Deploy | Θέση σε παραγωγή | διακομιστής / νέφος |
Η αρχή του «fail fast»: τοποθετούμε τα γρήγορα και φθηνά βήματα (μεταγλώττιση, δοκιμές μονάδας) πρώτα. Δεν έχει νόημα να αναπτύξουμε αν ο κώδικας δεν μεταγλωττίζεται καν.
🔧 Μικρή άσκηση — Με ποια σειρά να τοποθετήσετε αυτά τα stages: Deploy, Build, Test, Checkout;
Checkout → Build → Test → Deploy. Ανακτούμε τον κώδικα, τον μεταγλωττίζουμε, τον δοκιμάζουμε και αναπτύσσουμε μόνο αν όλα είναι πράσινα.
Ας ακολουθήσουμε τη διαδρομή μιας μόνο γραμμής κώδικα που διορθώνει μια προγραμματίστρια, η Λέα, σε μια εφαρμογή ιστού.
Ανάπτυξη βήμα προς βήμα:
git push.v1.4.1.Συγκρίνετε: πριν από το CI/CD, η ίδια διόρθωση θα απαιτούσε μια προγραμματισμένη θέση σε παραγωγή, ένα βράδυ, χειροκίνητα, με το άγχος του «ας ελπίσουμε ότι θα δουλέψει». Εδώ, είναι μια ρουτίνα 6 λεπτών.
🔧 Μικρή άσκηση — Στο βήμα 3, 2 δοκιμές στις 124 αποτυγχάνουν. Τι κάνει ο αγωγός, και φεύγει η έκδοση στην παραγωγή;
Ο αγωγός σταματά στο stage Test, ειδοποιεί τη Λέα και δεν αναπτύσσει. Η παραγωγή παραμένει στην προηγούμενη σταθερή έκδοση. Αυτή είναι η αρχή «fail fast» που προστατεύει την παραγωγή.
| Πλεονέκτημα | Τι αλλάζει συγκεκριμένα |
|---|---|
| Λιγότερα ανθρώπινα λάθη | Οι επαναλαμβανόμενες εργασίες είναι σε σενάρια: όχι άλλο ξεχασμένο βήμα |
| Γρήγορη ανατροφοδότηση | Ξέρετε σε λεπτά αν μια αλλαγή σπάει κάτι |
| Συχνές αναπτύξεις | Μπορείτε να παραδίδετε πολλές φορές την ημέρα με εμπιστοσύνη |
| Αναπαραγωγιμότητα | Κάθε build είναι πανομοιότυπο — τέλος στο «δουλεύει στον υπολογιστή μου» |
| Ιχνηλασιμότητα | Κάθε αλλαγή καταγράφεται: ποιος, τι, πότε |
Όσο πιο συχνά αναπτύσσετε, τόσο πιο μικρή είναι κάθε ανάπτυξη, άρα λιγότερο επικίνδυνη. Είναι αντιδιαισθητικό: το να αναπτύσσετε πιο συχνά κάνει τις αναπτύξεις ασφαλέστερες, όχι πιο επικίνδυνες.
🔧 Μικρή άσκηση — Αναφέρετε δύο λόγους για τους οποίους το να αναπτύσσετε 10 φορές την ημέρα μικρές αλλαγές είναι λιγότερο επικίνδυνο από μία μόνο μεγάλη ανάπτυξη τον μήνα.
Question 1 : Τι σημαίνει «CI»;
a) Code Inspection
b) Continuous Integration
c) Container Initialization
d) Central Infrastructure
✅ Απάντηση: b) — Continuous Integration: συχνή αυτόματη συγχώνευση και επικύρωση του κώδικα.
Question 2 : Ποια είναι η διαφορά μεταξύ Continuous Delivery και Continuous Deployment;
a) Καμία, είναι συνώνυμα
b) Στο Delivery η θέση σε παραγωγή είναι χειροκίνητη· στο Deployment είναι αυτόματη
c) Το Deployment δεν κάνει δοκιμές
d) Το Delivery αναπτύσσει αυτόματα
✅ Απάντηση: b) — Και τα δύο προετοιμάζουν μια έτοιμη έκδοση· μόνο η θέση σε παραγωγή διαφέρει (χειροκίνητη έναντι αυτόματης).
Question 3 : Τι συμβαίνει αν το stage Test αποτύχει σε έναν αγωγό;
a) Ο αγωγός συνεχίζει ούτως ή άλλως έως την παραγωγή
b) Ο αγωγός σταματά και η ομάδα ειδοποιείται
c) Ο κώδικας διαγράφεται από το αποθετήριο
d) Ο αγωγός ξαναρχίζει στο άπειρο
✅ Απάντηση: b) — Αρχή «fail fast»: μια αποτυχία σταματά τον αγωγό και ενεργοποιεί ειδοποίηση· τίποτα δεν φεύγει στην παραγωγή.
Question 4 : Τι είναι ένα τεχνούργημα σε έναν αγωγό;
a) Ένα σφάλμα που εισήχθη κατά λάθος
b) Το συσκευασμένο αποτέλεσμα ενός build (π.χ. ένα .jar, μια εικόνα)
c) Ένα μήνυμα στις καταγραφές
d) Ένας χρήστης του συστήματος
✅ Απάντηση: b) — Το τεχνούργημα είναι το παραδοτέο που παράγει το build, έτοιμο να αναπτυχθεί.
Question 5 : Γιατί το να αναπτύσσετε συχνά κάνει τις αναπτύξεις ασφαλέστερες;
a) Επειδή κάθε ανάπτυξη είναι μικρότερη και άρα πιο εύκολη στη διάγνωση και στην ακύρωση
b) Επειδή καταργούμε τις δοκιμές
c) Επειδή οι διακομιστές γίνονται πιο ισχυροί
d) Επειδή οι χρήστες δεν το αντιλαμβάνονται
✅ Απάντηση: a) — Οι μικρές συχνές αλλαγές μειώνουν την επιφάνεια κινδύνου και διευκολύνουν την επαναφορά.
Μια ομάδα αναπτύσσει μια εφαρμογή Java. Σχεδιάστε (σε χαρτί / σε ψευδο-αγωγό) τα stages ενός αγωγού CI/CD για αυτή την εφαρμογή, αναφέροντας για κάθε stage: το όνομά του, τον ρόλο του και τι πρέπει να σταματήσει τον αγωγό. Διευκρινίστε επίσης αν συνιστάτε Continuous Delivery ή Continuous Deployment, και γιατί.
| Σειρά | Stage | Ρόλος | Συνθήκη διακοπής |
|---|---|---|---|
| 1 | Checkout | Ανάκτηση του κώδικα από το Git | Μη προσβάσιμο αποθετήριο |
| 2 | Build | Μεταγλώττιση με Maven (mvn package) | Σφάλμα μεταγλώττισης |
| 3 | Test | Εκτέλεση των δοκιμών JUnit | Μια δοκιμή αποτυγχάνει |
| 4 | Package | Παραγωγή του τεχνουργήματος .jar / εικόνας | Αποτυχία συσκευασίας |
| 5 | Staging | Ανάπτυξη στην προπαραγωγή | Αποτυχία εκκίνησης εφαρμογής |
| 6 | Deploy | Θέση σε παραγωγή | Απόρριψη χειροκίνητης επικύρωσης |
Συνιστώμενη επιλογή για αρχή: Continuous Delivery.
Αιτιολόγηση: όσο η κάλυψη δοκιμών δεν είναι ώριμη, διατηρούμε μια ανθρώπινη επικύρωση πριν από την παραγωγή (Delivery). Όταν η ομάδα εμπιστεύεται τις αυτοματοποιημένες δοκιμές της, μπορεί να περάσει σε Continuous Deployment (αυτόματη θέση σε παραγωγή).
Αναμενόμενο σχήμα:
Μάθημα 05 — Git: εγκατάσταση και διαμόρφωση: εγκατάσταση του Git στον σταθμό εργασίας σας πριν από τα τοπικά αποθετήρια.
Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων