Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

selamat hari, Habr!

Hari ini saya ingin berkongsi salah satu cara untuk digunakan Pemalam Pilihan Aktif buat tugas dalam Jenkins yang paling bersatu dan mesra pengguna.

Pengenalan

Singkatan seperti DevOps bukan lagi sesuatu yang baru untuk komuniti IT. Bagi kebanyakan orang, frasa "do DevOps" dikaitkan dengan beberapa jenis butang ajaib, apabila diklik, kod aplikasi secara automatik bertukar menjadi aplikasi yang digunakan dan diuji (semuanya sebenarnya lebih rumit, tetapi kami mengabstraksikan semua proses).

Jadi, kami menerima pesanan untuk membuat butang ajaib sedemikian supaya pentadbir boleh menggunakan aplikasi dengan satu klik. Terdapat pelbagai jenis pelaksanaan tugas ini: daripada menulis bot untuk mana-mana utusan segera kepada membangunkan aplikasi berasingan. Namun begitu, semua ini mempunyai matlamat yang sama - untuk menjadikan permulaan binaan dan penggunaan aplikasi setelus dan mudah yang mungkin.

Dalam kes kami, kami akan menggunakan Jenkins.


Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Petugas

Cipta kerja Jenkins yang mudah yang akan melancarkan binaan dan (atau) penggunaan perkhidmatan mikro yang dipilih bagi versi tertentu.

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Input data

Kami mempunyai beberapa repositori yang mengandungi kod sumber pelbagai perkhidmatan mikro.

Menentukan parameter

Parameter berikut harus diterima sebagai input kepada tugas kami:

  1. URL repositori dengan kod perkhidmatan mikro yang kami mahu bina dan gunakan semasa menjalankan tugas.
  2. ID komit dari mana binaan akan berlaku.

SEBAGAIMANA ADANYA

Cara paling mudah untuk menyelesaikan tugas ini ialah mencipta dua parameter jenis String.

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Dalam kes ini, pengguna perlu memasukkan laluan ke repositori secara manual dan id komit, yang anda lihat, tidak sepenuhnya mudah.

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

SEPERTI MENJADI

Sekarang mari cuba jenis parameter lain untuk mempertimbangkan semua kelebihannya.
Mari buat parameter pertama dengan jenis Parameter Pilihan, yang kedua - Parameter Rujukan Reaktif Pilihan Aktif. Dalam parameter dengan jenis Pilihan, kami akan menambah secara manual dalam medan Pilihan nama repositori tempat kod perkhidmatan mikro kami disimpan.

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Sekiranya penonton menyukai artikel ini, maka dalam artikel seterusnya saya akan menerangkan proses mengkonfigurasi tugas dalam Jenkins, menggunakan penerangan melalui kod (Configuration as code), i.e. kami tidak perlu memasukkan nama repositori dan mencipta parameter secara manual, semuanya akan berlaku secara automatik (kod kami akan menerima senarai repositori daripada SCM dan mencipta parameter dengan senarai ini).

Nilai parameter kedua akan diisi secara dinamik, bergantung pada nilai yang diambil oleh parameter pertama (test1 atau test2), kerana setiap repositori mempunyai senarai komitnya sendiri.

Parameter Rujukan Reaktif Pilihan Aktif mempunyai medan berikut untuk diisi:

  1. Nama – nama parameter.
  2. skrip – kod yang akan dilaksanakan setiap kali nilai parameter daripada medan Parameter yang dirujuk ditukar (dalam kes kami, apabila kami memilih antara test1 dan test2).
  3. Penerangan Produk – penerangan ringkas tentang parameter.
  4. Jenis Pilihan – jenis objek yang dikembalikan oleh skrip (dalam kes kami, kami akan mengembalikan kod html).
  5. Parameter yang dirujuk – nama parameter, apabila nilainya ditukar, kod dari bahagian Skrip akan dilaksanakan.

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Mari teruskan mengisi medan yang paling penting dalam parameter ini. Kami ditawarkan dua jenis pelaksanaan untuk dipilih: menggunakan Skrip Groovy atau Skrip Scriptler.
Kami memilih yang pertama, kerana Scriptler hanyalah pemalam yang menyimpan skrip yang telah anda tulis sebelum ini dan membolehkan anda menggunakannya dalam tugas lain tanpa menyalin-tampal lagi.

Kod Groovy untuk mendapatkan semua komit dari repositori yang dipilih:

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()

Tanpa pergi ke butiran, kod ini menerima nama perkhidmatan mikro (MICROSERVICE_NAME) sebagai input dan menghantar permintaan kepada Bitbucket (kaedah getCommitsForMicroservice) menggunakan APInya, dan mendapat id dan mesej komit semua komit untuk perkhidmatan mikro tertentu.
Seperti yang dinyatakan sebelum ini, kod ini harus mengembalikan html yang akan dipaparkan pada halaman Bina dengan Parameter dalam Jenkins, jadi kami membungkus semua nilai yang diterima daripada Bitbucket dalam senarai dan menambahkannya untuk dipilih.

Selepas melengkapkan semua langkah, kita sepatutnya mendapat halaman yang begitu indah Bina dengan Parameter.

Jika anda memilih perkhidmatan mikro ujian1:

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Jika anda memilih perkhidmatan mikro ujian2:

Mencipta parameter dinamik dalam kerja Jenkins, atau cara menjadikan tugas anda mesra pengguna

Setuju bahawa adalah lebih mudah bagi pengguna untuk berinteraksi dengan tugas anda dengan cara ini daripada menyalin url setiap kali dan mencari id komit yang diperlukan.

PS Artikel ini memberikan contoh yang sangat mudah, yang mungkin tidak boleh digunakan secara praktikal dalam bentuk ini, kerana pemasangan mempunyai lebih banyak parameter yang berbeza, tetapi tujuan artikel ini adalah untuk menunjukkan cara alat berfungsi, bukan untuk menyediakan penyelesaian yang berfungsi.

PSS Seperti yang saya tulis sebelum ini, jika artikel ini berguna, maka artikel seterusnya akan mengenai konfigurasi dinamik tugas Jenkins melalui kod.

Sumber: www.habr.com

Tambah komen