Buona giornata, Habr!
Oggi vorrei condividere uno dei modi di utilizzo
Introduzione
Un'abbreviazione come DevOps non è più una novità per la comunità IT. Per molte persone, la frase "fai DevOps" è associata a una sorta di pulsante magico, quando viene cliccato, il codice dell'applicazione si trasforma automaticamente in un'applicazione distribuita e testata (tutto è in realtà più complicato, ma stiamo astraendo da tutti i processi).
Pertanto, abbiamo ricevuto l'ordine di creare un pulsante magico in modo che gli amministratori possano distribuire l'applicazione con un clic. Esistono vari tipi di implementazione di questa attività: dalla scrittura di un bot per uno qualsiasi dei servizi di messaggistica istantanea allo sviluppo di un'applicazione separata. Tuttavia, tutto ciò ha lo stesso obiettivo: rendere l'avvio della creazione e della distribuzione dell'applicazione il più trasparente e conveniente possibile.
Nel nostro caso useremo Jenkins.
Compito
Crea un comodo lavoro Jenkins che avvierà la compilazione e (o) la distribuzione del microservizio selezionato di una determinata versione.
Dati di input
Disponiamo di diversi repository contenenti il codice sorgente di vari microservizi.
Definizione dei parametri
I seguenti parametri dovrebbero essere ricevuti come input per il nostro lavoro:
- L'URL del repository con il codice del microservizio che vogliamo creare e distribuire durante l'esecuzione del processo.
- ID del commit da cui verrà eseguita la compilazione.
COME SONO
Il modo più semplice per eseguire questa attività è creare due parametri di tipo String.
In questo caso, l'utente dovrà inserire manualmente il percorso del repository e l'ID di commit, il che, vedi, non è del tutto conveniente.
COME ESSERE
Ora proviamo un altro tipo di parametri per considerarne tutti i vantaggi.
Creiamo il primo parametro con il tipo Choice Parametro, il secondo - Active Choices Reactive Reference Parametro. Nel parametro di tipo Choice, aggiungeremo manualmente nel campo Choices i nomi dei repository in cui è archiviato il codice dei nostri microservizi.
Se al pubblico piace questo articolo, nel prossimo articolo descriverò il processo di configurazione delle attività in Jenkins, utilizzando una descrizione tramite codice (Configurazione come codice), ad es. non avremo bisogno di inserire manualmente i nomi dei repository e creare parametri, tutto avverrà automaticamente (il nostro codice riceverà un elenco di repository da SCM e creerà un parametro con questo elenco).
I valori del secondo parametro verranno riempiti dinamicamente, a seconda del valore assume il primo parametro (test1 o test2), poiché ogni repository ha il proprio elenco di commit.
Parametro di riferimento reattivo di Scelte attive ha i seguenti campi da compilare:
- Nome – nome del parametro.
- Copione – codice che verrà eseguito ogni volta che viene modificato il valore del parametro dal campo Parametro di riferimento (nel nostro caso, quando scegliamo tra test1 e test2).
- Descrizione – breve descrizione del parametro.
- Tipo di scelta – il tipo di oggetto restituito dallo script (nel nostro caso restituiremo il codice html).
- Parametro di riferimento – il nome del parametro, quando viene modificato il valore, verrà eseguito il codice della sezione Script.
Procediamo direttamente alla compilazione del campo più importante in questo parametro. Ci vengono offerti due tipi di implementazione tra cui scegliere: using Script Groovy o Sceneggiatura di Scriptler.
Scegliamo il primo, poiché Scriptler è solo un plugin che salva gli script che hai scritto in precedenza e ti consente di utilizzarli in altre attività senza fare nuovamente copia e incolla.
Codice groovy per ottenere tutti i commit dal repository selezionato:
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()
Senza entrare nei dettagli, questo codice riceve come input il nome del microservizio (MICROSERVICE_NAME) e invia una richiesta a bitbucket (metodo getCommitsForMicroservice) utilizzando la relativa API e ottiene l'ID e il messaggio di commit di tutti i commit per un determinato microservizio.
Come accennato in precedenza, questo codice dovrebbe restituire l'html che verrà visualizzato sulla pagina Costruisci con parametri in Jenkins, quindi racchiudiamo tutti i valori ricevuti da Bitbucket in un elenco e li aggiungiamo per selezionare.
Dopo aver completato tutti i passaggi, dovremmo ottenere una pagina così bella Costruisci con parametri.
Se hai selezionato il microservizio test1:
Se hai selezionato il microservizio test2:
Concordo sul fatto che sarà molto più conveniente per l'utente interagire con la tua attività in questo modo piuttosto che copiare l'URL ogni volta e cercare l'ID di commit richiesto.
PS Questo articolo fornisce un esempio molto semplificato, che potrebbe non essere di utilità pratica in questa forma, poiché gli assiemi hanno molti più parametri diversi, ma lo scopo di questo articolo era mostrare come funziona lo strumento, non fornire una soluzione funzionante.
PSS Come ho scritto prima, se questo articolo è utile, il prossimo riguarderà configurazione dinamica delle attività Jenkins tramite codice.
Fonte: habr.com