2016-02-21 8 views
9

AKTUALISIEREN Dieses Skript ist jetzt veraltet, da Gitlab plugin in Jenkins jetzt Build-Status zurück zu Jenkins melden kann.Poor Man Gitlab CE und Jenkins Integration

Ich versuche Gitlab CE 8.4 und Jenkins zu integrieren. Ich habe gelesen, dass Jenkins CI Integration in Gitlab EE verfügbar ist, aber derzeit ist es keine Option.

Ich habe bereits Jenkins Gitlab-Plugin und Web-Hooks eingerichtet, und schiebt meine Repo-Trigger-Builds von Jenkins-Jobs. Diese Builds werden jedoch nicht in der Registerkarte "Builds" auf der jeweiligen Gitlab-Seite angezeigt. Wenn ich die .gitlab-ci.yml-Datei in das Repository festlege, funktionieren Web-Hooks immer noch, Jenkins-Jobs werden ausgeführt, aber die 'Builds'-Seite zeigt, dass der Build blockiert ist, da keine Runner definiert sind.

In der Tat habe ich keine Gitlab CI-Runner eingerichtet, da sie nicht mit Jenkins verwandt sind, soweit ich es verstehe.

Ich möchte meinen Jenkins-Job behalten, da einige nützliche Informationen dort veröffentlicht werden, und ich möchte auch seinen Status auf der Gitlab-Seite haben. Ich denke in diesem Zusammenhang über ein einfaches Skript für Gitlab CI-Runner, die Konsolenausgabe von einem Jenkins-Job erfassen und es in Gitlab übersetzen würde. Etwas wie das Ausführen von wget oder curl, weil Jenkins eine API bereitstellt, um die Ausgabe des Jobs zu sehen.

Die Dokumentation zu Gitlab CI und .gitlab-ci.yml ist jedoch begrenzt, ebenso Beispiele.

Wie könnte ich diese Jobdatei schreiben? Habe ich recht, wenn ich daran denke, dass Gitlab Job-Standard bekommt?

Antwort

4

Ja, Gitlab-CI druckt stdout eines Jobs und bezieht sich auf Exit-Codes.

Meine Lösung besteht aus installiert Gitlab-CI Läufer und die Python-Skript, genannt von .gitlab-ci.yml, die ID von CI_BUILD_REF Umgebungsvariable git commit wird, eine Verbindung mit dem Host-Jenkins, findet entsprechende Build-Konsole liest die Ausgabe über urllib2.urlopen(...).readlines() und druckt es auf stdout.

Es verwendet bySHA1 URL, die vom Jenkins Git-Plugin zur Verfügung gestellt wird, um die Build-Konsole zu finden.

Das Skript sieht auch für die Linie, mit dem Wort beginnen Finished: und Ausfahrten mit dem Exit-Code, nach dem, was dieses Wort folgt: 0, wenn es SUCCESS ist, und 1, wenn FAILURE oder UNSTABLE.

Skripttext:

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

Und zusätzlich .gitlab-ci.yml:

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

Nachteile liegen auf der Hand: Durch Drücken Abbruchtaste bricht tatsächlich die Übersetzung, nicht die Jenkins Job, keine anklickbare Links auf die Jenkins Jobseite.

Zumindest informiert es über Jenkins Jobstatus.

UPDATE. Dieses Skript autorisiert Jenkins nicht, es wird eine entspannte Sicherheitseinstellung vorausgesetzt, wenn jeder die Jobausgabe sehen kann.

UPDATE2. Das Jenkins-Gitlab-Plugin kann jetzt den Build-Status an Gitlab melden, wodurch dieses Skript obsolet wird.

+0

Wie umgehen Sie die Authentifizierung mit dem Jenkins-Server mithilfe dieser Problemumgehung? Mein GitLab CI-Runner bekommt '' '' 'Verboten' 'auf Anfragen an' JENKINS_JOB_URL'. – Fishizzle

+1

Mein Jenkins hat Sicherheitseinstellungen entspannt, jeder kann Job-Ausgabe sehen. Sie können zur Python-Bibliothek 'requests.readthedocs.io/en/master/ 'wechseln und deren Authentifizierungsfunktionen verwenden. – wl2776

+0

Haben https://wiki.jenkins-ci.org/display/JENKINS/Authentifizieren von + gekennzeichneten Clients gefunden – wl2776