Μια εργασία ανάπτυξης συνδέεται, αντιγράφει το artefact της και αναφέρει επιτυχία. Το τούνελ που άνοιξε μπορεί να είναι ακόμη ενεργό όταν ξεκινήσει η επόμενη εργασία, και η διαδρομή που άλλαξε ανήκει σε ολόκληρο τον host. Ένα αποτέλεσμα build περιγράφει την εντολή, όχι την κατάσταση που άφησε πίσω. Αντιμετωπίστε το VPN ως πόρο με διάρκεια ζωής, όχι ως μία γραμμή στην αρχή ενός σταδίου.

Τι άλλο τρέχει σε αυτόν τον host

Ένας κόμβος Jenkins μπορεί να τρέξει πολλούς executors ταυτόχρονα, και μια εργασία που αλλάζει διαδρομές του host, ρυθμίσεις του resolver ή μια σύνδεση σε επίπεδο συστήματος τις αλλάζει για όλους. Το αν θα το προσέξει μια άλλη εργασία εξαρτάται από την πολιτική διαδρομών και φιλτραρίσματος, όχι από έναν γενικό κανόνα για VPN. Η πρόσβαση στο repository, η πρόσβαση στα artefact και το κανάλι ελέγχου είναι ξεχωριστές απαιτήσεις που ο runner εξακολουθεί να χρειάζεται. Προσθέστε τις στη λίστα προορισμών ανάπτυξης πριν επιλέξετε πλήρες τούνελ.

Αν το κανάλι ελέγχου επρόκειτο να διασχίσει το τούνελ, ο σχεδιασμός πρέπει να το πει συνειδητά. Το να το ανακαλύψεις κατά τη διάρκεια μιας επαναφοράς δεν είναι σχέδιο. Γράψτε τις δύο λίστες: τι πρέπει να φτάσει η εργασία ιδιωτικά και τι πρέπει να φτάσει ο runner ανεξαρτήτως.

Χρειάζεται καθόλου αυτή η εργασία ιδιωτική πρόσβαση;

Ρωτήστε πριν προσθέσετε το τούνελ αν το χρειάζεται το στάδιο του build. Ένας ιδιωτικός agent ανάπτυξης μπορεί να φέρει ένα εγκεκριμένο artefact και να εκτελέσει την ανάπτυξη, κρατώντας το γενικό στάδιο του build έξω από το ιδιωτικό δίκτυο. Αυτός ο διαχωρισμός είναι συνήθως φθηνότερος από το να μάθεις σε κάθε βήμα build να δρομολογείται μέσα από τούνελ.

Διαλέξτε το όριο από τη ροή εργασίας και όχι από συνήθεια. Αν η απάντηση είναι όχι, το υπόλοιπο αυτής της σελίδας είναι περιττό, και αυτό είναι το καλύτερο διαθέσιμο αποτέλεσμα.

Η κατάσταση που κληρονομεί η επόμενη εργασία

Περιγράψτε τι πρέπει να ισχύει πριν από την εργασία, όσο έχει ιδιωτική πρόσβαση, και αφού τελειώσει, μαζί με την ακύρωση. Η τελική κατάσταση είναι αυτή που αφήνεται συχνότερα υπονοούμενη, και είναι αυτή που κληρονομεί η επόμενη εργασία. Γράψτε την δίπλα στο pipeline αντί να την αφήνετε στη μνήμη κάποιου.

MomentWhat proves itWhat leaks if it is skipped
Job start: pre-flight route checkThe route table shows no tunnel from an earlier job, and the profile list is emptyA stale route sends deployment traffic into a dead tunnel
Job end: disconnect and shredThe profile is down and the temporary key file is goneThe next job inherits an open tunnel and a usable credential
Cancelled job: reboot or disposalThe host is replaced or rebooted before the next job startsA killed process leaves the tunnel up with no owner

Ένας αποκλειστικός ή μιας χρήσης agent κάνει αυτά τα όρια ευκολότερα να επιβληθούν. Ένα container ή namespace βοηθά μόνο αν η διάταξη δικτύου και προνομίων του απομονώνει πραγματικά την αλλαγή.

Σταματήστε τη σύνδεση, όχι το πρόγραμμα

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

vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"

Η ολοκλήρωση δεν είναι απομόνωση: ένας runner που πεθαίνει κρατά το τούνελ που άνοιξε, και μια διεργασία που σταματά με βία παρακάμπτει εντελώς το μπλοκ. Γι' αυτό η εντολή καθαρίσματος μόνη της δεν μπορεί να είναι όλο το σχέδιο. Έτσι αποτυγχάνει στην πράξη: μια εργασία ανάπτυξης ακυρώνεται στο βήμα της αντιγραφής, το μπλοκ ολοκλήρωσης δεν εκτελείται ποτέ, και η επόμενη εργασία στον ίδιο host ξεκινά με ζωντανό τούνελ και διαδρομή που δείχνει σε δίκτυο που δεν μπορεί να φτάσει. Η αποτυχία μοιάζει με πρόβλημα 'DNS' στο επόμενο build, ώρες αφότου τελείωσε η εργασία που την προκάλεσε.

Καταγράψτε το όνομα του προφίλ και τη διαδρομή του διαπιστευτηρίου στο output της εργασίας. Μια γυμνή εντολή αποσύνδεσης χωρίς αναγνωριστικό είναι δύσκολο να ελεγχθεί εκ των υστέρων. Η γραμμή του log είναι επίσης αυτό που αποδεικνύει ότι το μπλοκ έτρεξε όταν το ζητήσει μια μεταγενέστερη έρευνα.

Δώστε στην εργασία έναν host που δεν χρησιμοποιεί κανείς άλλος

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

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

Σχετικά άρθρα