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

Καλή μέρα, Habr!

Σήμερα θα ήθελα να μοιραστώ έναν από τους τρόπους χρήσης Πρόσθετο Active Choices κάνε την εργασία μέσα Jenkins το πιο ενοποιημένο και κατανοητό για τον χρήστη.

Εισαγωγή

Μια τέτοια συντομογραφία όπως το DevOps δεν είναι κάτι νέο για την κοινότητα της πληροφορικής εδώ και πολύ καιρό. Για πολλούς ανθρώπους, η φράση "make DevOps" σχετίζεται με κάποιο είδος μαγικού κουμπιού, όταν πατηθεί, ο κώδικας της εφαρμογής μετατρέπεται αυτόματα σε αναπτυγμένη και δοκιμασμένη εφαρμογή (είναι στην πραγματικότητα πιο περίπλοκη, αλλά αφαιρούμε από όλες τις διαδικασίες).

Λάβαμε, λοιπόν, μια παραγγελία να φτιάξουμε ένα τέτοιο μαγικό κουμπί ώστε οι διαχειριστές να μπορούν να αναπτύξουν την εφαρμογή με ένα κλικ. Υπάρχουν διάφοροι τύποι υλοποίησης αυτής της εργασίας: ξεκινώντας από τη σύνταξη ενός bot για οποιονδήποτε από τους messenger και τελειώνοντας με την ανάπτυξη μιας ξεχωριστής εφαρμογής. Ωστόσο, ο στόχος όλων αυτών είναι ο ίδιος - να γίνει η έναρξη της συναρμολόγησης και η ανάπτυξη της εφαρμογής όσο το δυνατόν πιο διαφανής και βολική.

Στην περίπτωσή μας, θα χρησιμοποιήσουμε Jenkins.


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

Έργο

Δημιουργήστε μια βολική εργασία Jenkins που θα εκτελέσει τη συναρμολόγηση και (ή) την ανάπτυξη της επιλεγμένης microservice μιας συγκεκριμένης έκδοσης.

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

Εισαγωγή δεδομένων

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

Καθορισμός παραμέτρων

Η είσοδος της εργασίας μας θα πρέπει να λαμβάνει τις ακόλουθες παραμέτρους:

  1. Το URL του αποθετηρίου με τον κώδικα microservice που θέλουμε να δημιουργήσουμε και να αναπτύξουμε κατά την εκτέλεση της εργασίας.
  2. Το αναγνωριστικό της δέσμευσης για δημιουργία από.

ΟΠΩΣ ΕΙΝΑΙ

Ο ευκολότερος τρόπος για να ολοκληρώσετε αυτήν την εργασία είναι να δημιουργήσετε δύο παραμέτρους τύπου String.

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

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

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

ΟΠΩΣ ΝΑ ΕΙΝΑΙ

Τώρα ας δοκιμάσουμε έναν άλλο τύπο παραμέτρων για να δούμε όλα τα πλεονεκτήματά του.
Ας δημιουργήσουμε την πρώτη παράμετρο με τον τύπο Choice Parameter, τη δεύτερη - Active Choices Reactive Reference Parameter. Στην παράμετρο με τον τύπο επιλογής, θα προσθέσουμε χειροκίνητα τα ονόματα των αποθετηρίων στο πεδίο Επιλογές, όπου είναι αποθηκευμένος ο κωδικός των μικροϋπηρεσιών μας.

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

Αν αρέσει στο κοινό αυτό το άρθρο, τότε στο επόμενο άρθρο θα περιγράψω τη διαδικασία διαμόρφωσης εργασιών στο Jenkins χρησιμοποιώντας την περιγραφή μέσω του κώδικα (Configuration as code), π.χ. δεν θα χρειαστεί να εισάγουμε χειροκίνητα τα ονόματα των αποθετηρίων και να δημιουργήσουμε παραμέτρους, όλα θα συμβούν αυτόματα (ο κώδικας μας θα πάρει τη λίστα των αποθετηρίων από το SCM και θα δημιουργήσει μια παράμετρο με αυτήν τη λίστα).

Οι τιμές της δεύτερης παραμέτρου θα συμπληρωθούν δυναμικά, ανάλογα με την τιμή που παίρνει η πρώτη παράμετρος (test1 ή test2), επειδή κάθε αποθετήριο έχει τη δική του λίστα δεσμεύσεων.

Active Choices Παράμετρος Reactive Reference έχει τα ακόλουθα πεδία για συμπλήρωση:

  1. Όνομα – όνομα παραμέτρου.
  2. Γραφή - κωδικός που θα εκτελείται κάθε φορά που αλλάζει η τιμή της παραμέτρου από το πεδίο παραμέτρου Referenced (στην περίπτωσή μας, όταν επιλέγουμε μεταξύ test1 και test2).
  3. Περιγραφή – σύντομη περιγραφή της παραμέτρου.
  4. Τύπος επιλογής - τον τύπο του αντικειμένου που επιστρέφεται από το σενάριο (στην περίπτωσή μας, θα επιστρέψουμε τον κώδικα html).
  5. αναφερόμενη παράμετρος – το όνομα της παραμέτρου, όταν αλλάξει η τιμή της, θα εκτελεστεί ο κώδικας από την ενότητα Script.

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

Ας προχωρήσουμε απευθείας στη συμπλήρωση του πιο σημαντικού πεδίου αυτής της παραμέτρου. Μας προσφέρονται δύο τύποι υλοποίησης για να διαλέξουμε: χρήση Groovy Script ή Σενάριο Scriptler.
Επιλέγουμε το πρώτο, αφού το Scriptler είναι απλώς ένα πρόσθετο που αποθηκεύει τα σενάρια που έχετε ήδη γράψει και σας επιτρέπει να τα χρησιμοποιήσετε σε άλλες εργασίες χωρίς να κάνετε ξανά copy-paste.

Κωδικός Groovy για λήψη όλων των δεσμεύσεων από ένα επιλεγμένο αποθετήριο:

AUTH = "логин и пароль в Base64"                           
GIT_URL = "url до вашей SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "имя проектной области, где находятся репозитории"

def htmlBuild() {
    html = """
            <html>
            <head>
            <meta charset="windows-1251">
            <style type="text/css">
            div.grayTable {
            text-align: left;
            border-collapse: collapse;
            }
            .divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
            padding: 0px 3px;
            }
            .divTable.grayTable .divTableBody .divTableCell {
            font-size: 13px;
            }
            </style>
            </head>
            <body>
        """

    def commitOptions = ""
    getCommitsForMicroservice(MICROSERVICE_NAME).each {
        commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
    }
    html += """<p style="display: inline-block;">
        <select id="commit_id" size="1" name="value">
            ${commitOptions}
        </select></p></div>"""

    html += """
            </div>
            </div>
            </div>
            </body>
            </html>
         """
    return html
}

def getCommitsForMicroservice(microserviceRepo) {
    def commits = [:]
    def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
    def conn = new URL(endpoint).openConnection()
    conn.setRequestProperty("Authorization", "Basic ${AUTH}")
    def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
    response.values.each {
        commits.put(it.displayId, it.message)
    }
    return commits
}

return htmlBuild()

Χωρίς να υπεισέλθω σε λεπτομέρειες, αυτός ο κωδικός λαμβάνει ως είσοδο το όνομα της microservice (MICROSERVICE_NAME), στέλνει ένα αίτημα στο Bitbucket (μέθοδος getCommitsForMicroservice) χρησιμοποιώντας το API του και λαμβάνει το μήνυμα αναγνώρισης και δέσμευσης όλων των δεσμεύσεων για τη δεδομένη μικρουπηρεσία.
Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας θα πρέπει να επιστρέψει το html που θα εμφανίζεται στη σελίδα Δημιουργία με παράμετροι στο Jenkins, έτσι τυλίγουμε όλες τις λαμβανόμενες τιμές​​από το Bitbucket σε μια λίστα και τις προσθέτουμε στην επιλογή.

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

Εάν επιλέξατε τη microservice test1:

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

Εάν επιλέξατε τη microservice test2:

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

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

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

ΥΣΤΕΡΟΓΡΑΦΟ Όπως έγραψα προηγουμένως, εάν αυτό το άρθρο είναι χρήσιμο, τότε το επόμενο θα αφορά δυναμική διαμόρφωση εργασιών Jenkins μέσω κώδικα.

Πηγή: www.habr.com

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