Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
programmieren:gitlab [2021/11/28 23:42] root [Bestandteile] |
programmieren:gitlab [2022/03/15 14:24] (aktuell) root [Troubleshooting/Howto] |
||
---|---|---|---|
Zeile 53: | Zeile 53: | ||
* liegt im root des Repositories | * liegt im root des Repositories | ||
- | * | + | * definiert was nacheinander auszuführen ist (Stages) |
+ | * können Verify-Prozesse sein | ||
+ | * können Build-Prozesse sein | ||
+ | * formuliert in yaml | ||
+ | |||
+ | |||
+ | <sxh yaml> | ||
+ | variables: | ||
+ | GIT_DEPTH: 0 | ||
+ | |||
+ | default: | ||
+ | image: snom/ | ||
+ | |||
+ | stages: | ||
+ | - static_analyses | ||
+ | |||
+ | pylint_commit: | ||
+ | stage: static_analyses | ||
+ | before_script: | ||
+ | - echo " | ||
+ | - pip3 install pylint | ||
+ | script: | ||
+ | - echo " | ||
+ | - echo " | ||
+ | - last_ret=0 | ||
+ | - pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E ' | ||
+ | - > | ||
+ | if [[ $last_ret -eq 0 ]]; then echo " | ||
+ | --disable=import-error | ||
+ | phone_system_service_pb2_grpc.py, | ||
+ | settings_service_pb2_grpc.py, | ||
+ | files to lint"; fi | ||
+ | rules: | ||
+ | - if: $CI_PIPELINE_SOURCE == " | ||
+ | |||
+ | |||
+ | pylint_merge: | ||
+ | stage: static_analyses | ||
+ | before_script: | ||
+ | - echo " | ||
+ | - pip3 install pylint | ||
+ | script: | ||
+ | - echo " | ||
+ | - echo " | ||
+ | - last_ret=0 | ||
+ | - pythonfiles=$(git diff --name-only origin/ | ||
+ | - > | ||
+ | if [[ $last_ret -eq 0 ]]; then echo " | ||
+ | --disable=import-error | ||
+ | phone_system_service_pb2_grpc.py, | ||
+ | settings_service_pb2_grpc.py, | ||
+ | files to lint"; fi | ||
+ | rules: | ||
+ | - if: $CI_PIPELINE_SOURCE == " | ||
+ | |||
+ | </ | ||
+ | |||
+ | * Variables definiert globale Variablen | ||
+ | * GIT_DEPTH definiert wie viele Commits zurück gecloned werden soll | ||
+ | * normalerweise werden nur einige Commits zurück gecloned (shallow clone) | ||
+ | * spart Plattenplatz und erhöht Geschwindigkeit | ||
+ | * das kann nicht ausreichend sein wenn man zum Beispiel nur Dateien prüfen will die zwischen dem aktuellen und dem vorhergehenden Commit angefasst wurdten | ||
+ | * default -> Defaults | ||
+ | * image: Das Image für den Container der die Jobs ausführen soll (per Default) | ||
+ | * in diesem Fall kommt es von der offiziellen Docker-Registry | ||
+ | * stages -> die Stages | ||
+ | * enthält Liste von Stages | ||
+ | * ein Stage ist eine Gruppe von Aufgaben -> Verification, | ||
+ | * werden nacheinander abgearbeitet | ||
+ | * bestehen aus mehreren Jobs | ||
+ | * Jobs können parallel verarbeitet werden | ||
+ | * pylint_commit -> Job | ||
+ | * Jobs können beliebige Namen haben | ||
+ | * stage: Besagt von welchem Stage der Job ist | ||
+ | * before_script -> Welche Befehle vor der Script-Sektion ausgeführt werden sollen (Vorbereitungen) | ||
+ | * Liste | ||
+ | * jeder Listeneintrag ist ein Shell-Befehl (die Shell kann geändert werden) | ||
+ | * script -> Script was ausgeführt werden soll als Job | ||
+ | * Liste | ||
+ | * jeder Eintrag ist ein Shell-Befehl | ||
+ | * Variablen vorhergehender Befehle stehen in nachfolgenden Befehlen zur Verfügung | ||
+ | * wenn ein Befehl fehlschlägt (Return-Code != 0) schlägt der ganze Job fehl | ||
+ | * es werden keine weiteren Stages ausgeführt | ||
+ | * es werden keine weiteren Befehle ausgeführt | ||
+ | * rules -> Bedingungen unter denen der Job überhaupt ausgeführt wird | ||
+ | * if -> Definiert eine Bedingung | ||
+ | * Die Variable CI_PIPELINE_SOURCE definiert was die Pipeline ausgelöst hat | ||
+ | * u.a. relevant wenn Jobs für Merges ausgeführt werden sollen -> das ist normalerweise nicht der Fall, sondern nur bei Commits | ||
+ | * " | ||
+ | * " | ||
+ | * pylint_merge -> ein weiterer Job | ||
+ | * dieser wird nur für Merge-Requests ausgeführt -> siehe rules-Sektion | ||
+ | * ansonsten ist es weitestgehend gleich zur vorhergehenden Job-Sektion | ||
+ | |||
+ | |||
+ | ==== Troubleshooting/ | ||
+ | |||
+ | ^Problem/ | ||
+ | |< | ||
+ | < | ||
+ | </ | ||
+ | |Befehl soll fehlschlagen dürfen \\ ohne das der Job fehlschlägt| Es muss nur vermieden werden das der gesamte Befehl (also ein Listeneintrag) etwas anderes als 0 zurück gibt. \\ \\ <sxh bash> pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E ' | ||
+ | |||
+ | * Es wird erst Code 1 ausgeführt (der Teil der fehlschlagen kann) | ||
+ | * schlägt der fehl (und nur dann), wird Code2 ausgeführt | ||
+ | </ | ||
+ | |Befehl der mehrere Zeilen umfasst|Yaml interpretiert jeden Zeilenumbruch per Default als neues Element (zum Beispiel als neuen Listeneintrag). \\ <sxh yaml> | ||
+ | liste: | ||
+ | - > | ||
+ | Zeile1 | ||
+ | Zeile2 | ||
+ | Zeile3 | ||
+ | </ | ||
+ | * Das ">" | ||
+ | * Alle Zeilen die Teil des Blocks müssen zum ">" | ||
+ | </ | ||
+ | |Verifiziere nur Dateien die sich zum vorhergehenden Commit/zum Master-Branch geändert haben|Für statische Analyse macht es in der Regel nur Sinn die Dateien zu prüfen die sich gegenüber dem vorhergehenden Commit oder wenn es sich um einen Merge handelt gegenüber Master geändert haben und nicht alle Dateien. \\ <sxh yaml> | ||
+ | script: | ||
+ | - pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E ' | ||
+ | </ | ||
+ | * ggf. muss in der globalen variables-Sektion " | ||
+ | * in pythonfiles werden ggf. die Dateien gespeichert die sich geändert haben | ||
+ | * der Befehl der die Unterschiede ermittelt | ||
+ | <sxh bash> | ||
+ | git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | ||
+ | </ | ||
+ | * $CI_COMMIT_SHA -> ist eine Variable die die aktuelle Commit-ID enthält | ||
+ | * $CI_COMMIT_BEFORE_SHA -> ist eine Variable die die vorhergehende Commit-ID enthält | ||
+ | * das grep dient hier nur dazu die Detailliste weiter zu filtern | ||
+ | * " | ||
+ | \\ \\ | ||
+ | Das Gleiche noch mal für die Dateiliste im Vergleich zum Master-Branch (sinnvoll wenn man beim Merge-Request, | ||
+ | <sxh yaml> | ||
+ | script: | ||
+ | - pythonfiles=$(git diff --name-only origin/ | ||
+ | |||
+ | * eigentlich alles wie in vorhergehendem Beispiel | ||
+ | * $CI_DEFAULT_BRANCH -> Variable die den Namen des Default-Branches enthält (aber ohne " | ||
+ | </ | ||
+ | |Job nur ausführen wenn es ein merge-Request ist|Per Default laufen Jobs nur bei Commits, nicht vor Merge-Requests. \\ <sxh YAML> | ||
+ | pylint_commit: | ||
+ | | ||
+ | | ||
+ | - if: $CI_PIPELINE_SOURCE == " | ||
+ | |||
+ | pylint_merge: | ||
+ | | ||
+ | | ||
+ | - if: $CI_PIPELINE_SOURCE == " | ||
+ | </ | ||
+ | * In obigem Beispiel sind 2 Jobs definiert | ||
+ | * pylint_commit läuft nur für Commits (" | ||
+ | * pylint_merge läuft nur wenn es sich um einen Merge-Request handelt | ||
+ | * rules -> definieren Regeln die definieren wann ein Job ausgeführt wird | ||
+ | * if -> definiert eine Regel | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | |||
+ | </ | ||
+ | |pylint integrieren| <sxh YAML> | ||
+ | - pylint --rcfile=.pylintrc $pythonfiles; | ||
+ | </ | ||
+ | * das Kommando wird im Root des Projektes (des git-Projektes) ausgeführt " | ||
+ | * man kann die .pylintrc also einfach ein- und auschecken wie jede andere Datei auch | ||
+ | * $pythonfiles ist die Liste von Dateien die gelinted werden sollen | ||
+ | </ | ||
===== Auto DevOps ===== | ===== Auto DevOps ===== | ||