2016-02-21 16 views
9

UPDATE Ten skrypt jest już nieaktualny, ponieważ Gitlab plugin in Jenkins może teraz zgłosić status kompilacji do Jenkins.Zły Gitlab CE i integracja Jenkinsa

Próbuję zintegrować Gitlab CE 8.4 i Jenkins. Czytałem, że integracja Jenkins CI jest dostępna w Gitlab EE, ale obecnie nie jest to opcja.

Mam już skonfigurowaną wtyczkę Jenck gitlab i wtyczki Web i popycham do moich kreacji z wyzwalaczem repo zadań Jenkinsa. Jednak te kompilacje nie są wyświetlane na karcie "Budowy" na odpowiedniej stronie Gitlab. Po zatwierdzeniu pliku .gitlab-ci.yml w repozytorium, zaczepy sieciowe nadal działają, zadania Jenkins działają, ale strona "Budowy" pokazuje, że kompilacja utknęła, ponieważ nie zdefiniowano żadnych biegaczy.

Rzeczywiście, nie założyłem żadnych biegaczy Gitlab CI, ponieważ nie są oni spokrewnieni z Jenkinsem, o ile rozumiem.

Chciałbym zachować moją pracę z Jenkin, odkąd tam są publikowane przydatne informacje, a także chciałbym mieć jego status na stronie Gitlaba. Myślę w tym względzie o prostym skrypcie dla biegacza Gitlab CI, który przechwyciłby wynik konsolowy z pracy Jenkinsa i przetłumaczył go na Gitlab. Coś jak uruchamianie wget lub curl, ponieważ Jenkins udostępnia API, aby zobaczyć wyniki pracy.

Jednak dokumentacja dotycząca Gitlab CI i .gitlab-ci.yml jest ograniczona, podobnie jak przykłady.

Jak mogę zapisać ten plik pracy? Mam rację myśląc, że Gitlab otrzymuje stdout pracy?

Odpowiedz

4

Tak, Gitlab-CI drukuje standardowe wyjście z pracy i odnosi się do kodów wyjścia.

Moje rozwiązanie składa się z zainstalowanej biegacza Gitlab-CI i skrypt Pythona, zwanego od .gitlab-ci.yml, że dostaje git commit ID z CI_BUILD_REF zmiennej środowiskowej, łączy się z hostem Jenkins, znajdzie odpowiednią konsolę gromadzeniu, czyta wyjście poprzez urllib2.urlopen(...).readlines() i wypisuje go na standardowe wyjście.

Używa adresu URL bySHA1 dostarczonego przez wtyczkę Jenkins Git, aby znaleźć konsolę kompilacji.

Skrypt wygląda również na linii, zaczynając od słowa Finished: i wyjść z kodem wyjścia, zgodnie z tym co następuje to słowo: 0 jeśli jest SUCCESS, a 1 jeśli FAILURE lub UNSTABLE. tekst

Scenariusz:

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

a ponadto .gitlab-ci.yml:

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

Wady są oczywiste: wciśnięcie anuluj faktycznie anuluje tłumaczenie, a nie zadanie Jenkins nie klikalne odnośniki do Jenkins strona pracy.

Przynajmniej informuje o statusach pracy Jenkins.

UPDATE. Ten skrypt nie upoważnia do pracy z Jenkinsem, zakłada spokojne ustawienie zabezpieczeń, gdy wszyscy widzą wyniki pracy.

UPDATE2. Wtyczka Jenkins-Gitlab może teraz zgłosić stan kompilacji z powrotem do Gitlab, który przestaje działać.

+0

W jaki sposób radzić sobie z uwierzytelnianiem serwera Jenkins przy użyciu tego obejścia? Mój biegacz GitLab CI otrzymuje '403 Forbidden' na żądanie do' JENKINS_JOB_URL'. – Fishizzle

+1

Moje Jenkins ma złagodzone ustawienia zabezpieczeń, każdy może zobaczyć wyniki pracy. Możesz zmienić bibliotekę python 'request' (http://requests.readthedocs.io/en/master/) i użyć jej funkcji uwierzytelniania. – wl2776

+0

Znalazłem https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients – wl2776