2016-02-21 11 views
9

UPDATE questo script è obsoleta adesso, dal momento che Gitlab plugin in Jenkins possono ora segnalare lo stato di costruzione di nuovo a Jenkins.Poor dell'uomo e l'integrazione Jenkins

Sto cercando di integrare Gitlab CE 8.4 e Jenkins. Ho letto che l'integrazione di Jenkins CI è disponibile in Gitlab EE, ma attualmente non è un'opzione.

Ho già installato il plugin gitlab Jenkins e ganci Web, e spingo al mio repository build di processi Jenkins. Tuttavia, queste build non sono mostrate nella scheda 'Build' nella rispettiva pagina Gitlab. Se si esegue il commit del file .gitlab-ci.yml nel repository, i ganci Web funzionano ancora, i processi di Jenkins vengono eseguiti, ma la pagina 'Build' mostra che la build è bloccata, poiché non sono definiti corridori.

In effetti, non ho impostato alcun corridore Gitlab CI, dal momento che non sono collegati a Jenkins, per quanto ho capito.

Vorrei mantenere il mio lavoro di Jenkins poiché alcune informazioni utili sono pubblicate lì, e vorrei anche avere il suo stato nella pagina Gitlab. Sto pensando a proposito di un semplice script per Gitlab CI runner, che catturerebbe l'output della console da un lavoro di Jenkins e lo tradurrebbe in Gitlab. Qualcosa come eseguire wget o curl, perché Jenkins fornisce API per vedere l'output del lavoro.

Tuttavia, la documentazione su Gitlab CI e .gitlab-ci.yml è limitata, così come gli esempi.

Come posso scrivere il file di lavoro? Ho ragione nel pensare che Gitlab riceva lo stdout del lavoro?

risposta

4

Sì, Gitlab-CI stampa lo stdout di un lavoro e fa riferimento ai codici di uscita.

La mia soluzione è costituita da installata corridore Gitlab-CI e lo script python, chiamato da .gitlab-ci.yml, che ottiene git commit ID da CI_BUILD_REF variabile d'ambiente, si connette all'host Jenkins, trova rispettive console di generazione, si legge l'uscita via urllib2.urlopen(...).readlines(), e stampa su stdout.

Utilizza l'URL bySHA1 fornito dal plugin Git Jenkins per trovare la console di generazione.

Lo script sembra anche per la linea, a cominciare con la parola Finished: ed esce con il codice di uscita, in base a ciò che segue quella parola: 0 se è SUCCESS, e 1 se FAILURE, o UNSTABLE. testo

Script:

import urllib2 
import os 
import sys 
import time 

TIMEOUT = 5 

def get_build_console_for_sha1(url, sha1): 
    return '{}/scm/bySHA1/{}/consoleText'.format(url, sha1) 


def parse_console(build_con): 
    retcode = 0 

    if build_con: 
     total_read_lines = 0 
     finished_line = None 

     while not finished_line: 
      current_read_lines = 0 
      try: 
       for line in urllib2.urlopen(build_con, 
              None, TIMEOUT).readlines(): 
        current_read_lines += 1 
        if current_read_lines >= total_read_lines: 
         print line, 
         total_read_lines += 1 
         sys.stdout.flush() 
         if line.startswith('Finished: '): 
          finished_line = line 
      except urllib2.HTTPError as e: 
       if e.code == 404: 
        time.sleep(2) 
        pass 

     if 'FAILURE' in finished_line or 'UNSTABLE' in finished_line: 
      retcode = 1 

    print "retcode = ", retcode 
    return retcode 


def main(): 
    URL = 'JENKINS_JOB_URL' 
    sha1 = os.getenv('CI_BUILD_REF') 
    bc = get_build_console_for_sha1(URL, sha1) 
    return parse_console(bc) 


if __name__ == '__main__' : 
    sys.exit(main()) 

E in aggiunta, .gitlab-ci.yml:

jenkins-translate: 
    script: 
    - python jenkins-translate.py 

svantaggi sono evidenti: premendo pulsante Annulla in realtà annulla la traduzione, non è il lavoro Jenkins, nessun link cliccabili al Jenkins pagina del lavoro.

Almeno informa sullo stato dei lavori di Jenkins.

UPDATE. Questo script non autorizza Jenkins, presuppone un ambiente di sicurezza rilassato, quando tutti possono vedere l'output del lavoro.

UPDATE2. Il plugin Jenkins-Gitlab ora può riportare lo stato di generazione su Gitlab, che lo rende obsoleto.

+0

Come si gestisce l'autenticazione sul server Jenkins utilizzando questa soluzione alternativa? Il mio runner GitLab CI ottiene '403 Forbidden' su richieste a' JENKINS_JOB_URL'. – Fishizzle

+1

My Jenkins ha impostazioni di sicurezza rilassate, tutti possono vedere l'output del lavoro. È possibile passare alla libreria python 'requests' (http://requests.readthedocs.io/en/master/) e utilizzare le sue funzionalità di autenticazione. – wl2776

+0

Hanno trovato https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients – wl2776