إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

يوم جيد، هبر!

اليوم أود أن أشارك إحدى الطرق حول كيفية الاستخدام البرنامج المساعد الخيارات النشطة قم بالمهمة في جنكينز الأكثر توحيدًا وفهمًا للمستخدم.

مقدمة

مثل هذا الاختصار مثل DevOps ليس شيئًا جديدًا لمجتمع تكنولوجيا المعلومات لفترة طويلة. بالنسبة للعديد من الأشخاص ، ترتبط عبارة "make DevOps" بنوع من الأزرار السحرية ، عند النقر عليها ، يتحول رمز التطبيق تلقائيًا إلى تطبيق تم نشره واختباره (إنه في الواقع أكثر تعقيدًا ، لكننا نستخلص من جميع العمليات).

لذلك ، تلقينا طلبًا لإجراء مثل هذا الزر السحري بحيث يمكن للمسؤولين نشر التطبيق بنقرة واحدة. هناك أنواع مختلفة لتنفيذ هذه المهمة: بدءًا من كتابة روبوت لأي من برامج المراسلة وانتهاءً بتطوير تطبيق منفصل. ومع ذلك ، فإن الهدف من كل هذا هو نفسه - جعل إطلاق التجميع ونشر التطبيق شفافًا ومريحًا قدر الإمكان.

في حالتنا ، سوف نستخدم جنكينز.


إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

مهمة

قم بإنشاء مهمة Jenkins الملائمة التي ستقوم بتشغيل التجميع و (أو) نشر الخدمة المصغرة المحددة لإصدار معين.

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

ادخال البيانات

لدينا العديد من المستودعات التي تحتوي على الكود المصدري للعديد من الخدمات المصغرة.

تحديد المعلمات

يجب أن يتلقى مدخلات عملنا المعلمات التالية:

  1. عنوان URL للمستودع مع رمز الخدمة المصغرة الذي نريد بناءه ونشره عند تشغيل المهمة.
  2. معرّف الالتزام الذي سيتم البناء منه.

AS IS

أسهل طريقة لإنجاز هذه المهمة هي إنشاء معلمتين من النوع String.

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

في هذه الحالة ، سيحتاج المستخدم إلى إدخال المسار يدويًا إلى المستودع ومعرف الالتزام ، وهو ما ترى أنه ليس ملائمًا للغاية.

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

كما يجب

لنجرب الآن نوعًا آخر من المعلمات لمعرفة كل مزاياها.
لنقم بإنشاء المعلمة الأولى من النوع Choice Parameter ، والثانية - المعلمة المرجعية التفاعلية للخيارات النشطة. في المعلمة بنوع الاختيار ، سنضيف أسماء المستودعات يدويًا في حقل الخيارات ، حيث يتم تخزين رمز خدماتنا المصغرة.

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

إذا أعجب الجمهور بهذه المقالة ، فسأصف في المقالة التالية عملية تكوين المهام في Jenkins باستخدام الوصف من خلال الكود (التكوين كرمز) ، أي لن نحتاج إلى إدخال أسماء المستودعات يدويًا وإنشاء معلمات ، سيحدث كل شيء تلقائيًا (سيحصل رمزنا على قائمة المستودعات من SCM وإنشاء معلمة باستخدام هذه القائمة).

سيتم ملء قيم المعلمة الثانية ديناميكيًا ، اعتمادًا على القيمة التي تأخذها المعلمة الأولى (test1 أو test2) ، لأن كل مستودع له قائمة الالتزامات الخاصة به.

المعلمة المرجعية التفاعلية للخيارات النشطة يحتوي على الحقول التالية لملئها:

  1. الاسم - اسم المعلمة.
  2. سيناريو - الكود الذي سيتم تنفيذه في كل مرة يتم فيها تغيير قيمة المعلمة من حقل المعلمة المرجعية (في حالتنا ، عندما نختار بين test1 و test2).
  3. الوصف - وصف موجز للمعلمة.
  4. نوع الاختيار - نوع الكائن الذي يعيده البرنامج النصي (في حالتنا ، سنقوم بإرجاع كود html).
  5. المعلمة المشار إليها - اسم المعامل ، عندما تتغير قيمته ، سيتم تنفيذ الكود من قسم البرنامج النصي.

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

دعنا ننتقل مباشرة إلى ملء الحقل الأكثر أهمية في هذه المعلمة. نقدم نوعين من التنفيذ للاختيار من بينها: استخدام سيناريو رائع أو سيناريو المبرمج.
نختار الأول ، نظرًا لأن Scriptler هو مجرد مكون إضافي يحفظ البرامج النصية التي كتبتها بالفعل ويسمح لك باستخدامها في مهام أخرى دون نسخ اللصق مرة أخرى.

كود 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_NAME) كإدخال ، ويرسل طلبًا إلى Bitbucket (طريقة getCommitsForMicroservice) باستخدام واجهة برمجة التطبيقات الخاصة به ويحصل على معرف ورسالة الالتزام لجميع الالتزامات الخاصة بالخدمة المصغرة المحددة.
كما ذكرنا سابقًا ، يجب أن يعرض هذا الرمز html الذي سيتم عرضه على الصفحة بناء مع المعلمات في Jenkins ، لذلك نقوم بلف جميع القيم المستلمة من Bitbucket في قائمة وإضافتها إلى التحديد.

بعد الانتهاء من جميع الخطوات ، يجب أن نحصل على هذه الصفحة الجميلة بناء مع المعلمات.

إذا اخترت test1 الخدمة المصغرة:

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

إذا اخترت test2 الخدمة المصغرة:

إنشاء معلمات ديناميكية في وظيفة Jenkins ، أو كيفية جعل مهمتك سهلة الاستخدام

توافق على أنه سيكون أكثر ملاءمة للمستخدم أن يتفاعل مع مهمتك بهذه الطريقة بدلاً من نسخ عنوان url في كل مرة والبحث عن معرف الالتزام المطلوب.

PS هذه المقالة هي مثال مبسط للغاية قد لا يكون مفيدًا عمليًا كما هو ، حيث تحتوي التجميعات على العديد من الخيارات المختلفة ، ولكن الغرض من هذه المقالة هو إظهار كيفية عمل الأداة ، وليس توفير حل عملي.

PSS كما كتبت سابقًا ، إذا كانت هذه المقالة مفيدة ، فستكون المقالة التالية حول التكوين الديناميكي لمهام Jenkins عبر الكود.

المصدر: www.habr.com

إضافة تعليق