Benutzer-Werkzeuge

Webseiten-Werkzeuge


programmieren:gitlab

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
programmieren:gitlab [2022/01/10 18:13]
root [Troubleshooting/Howto]
programmieren:gitlab [2022/03/15 14:24] (aktuell)
root [Troubleshooting/Howto]
Zeile 59: Zeile 59:
  
  
-<code>+<sxh yaml>
 variables: variables:
     GIT_DEPTH: 0              GIT_DEPTH: 0         
Zeile 69: Zeile 69:
   - static_analyses   - static_analyses
  
-pylint:+pylint_commit:
     stage: static_analyses     stage: static_analyses
     before_script:     before_script:
Zeile 76: Zeile 76:
     script:     script:
         - echo "$CI_COMMIT_SHA"         - echo "$CI_COMMIT_SHA"
 +        - echo "$CI_COMMIT_BEFORE_SHA"
 +        - last_ret=0
 +        - pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E '*.py$') || last_ret=$?
 +        - >
 +            if [[ $last_ret -eq 0 ]]; then echo "linting '$pythonfiles'"; pylint --max-line-length=120 --output-format=text
 +            --disable=import-error  --reports=n --ignore='sphinx_conf.py,common_types_pb2_grpc.py,common_types_pb.py,
 +            phone_system_service_pb2_grpc.py,phone_system_service_pb2.py,qa_service_pb2_grpc.py,qa_service_pb2.py,
 +            settings_service_pb2_grpc.py,settings_service_pb2.py' $pythonfiles; else echo "Skipped, no python 
 +            files to lint"; fi
 +    rules:
 +            - if: $CI_PIPELINE_SOURCE == "push"
 +
 +
 +pylint_merge:
 +    stage: static_analyses
 +    before_script:
 +        - echo "Installing pylint"
 +        - pip3 install pylint
 +    script:
 +        - echo "$CI_COMMIT_SHA"
 +        - echo "$CI_COMMIT_BEFORE_SHA"
         - last_ret=0         - last_ret=0
         - pythonfiles=$(git diff --name-only origin/$CI_DEFAULT_BRANCH... | grep -E '*.py$') || last_ret=$?         - pythonfiles=$(git diff --name-only origin/$CI_DEFAULT_BRANCH... | grep -E '*.py$') || last_ret=$?
Zeile 84: Zeile 105:
             settings_service_pb2_grpc.py,settings_service_pb2.py' $pythonfiles; else echo "Skipped, no python              settings_service_pb2_grpc.py,settings_service_pb2.py' $pythonfiles; else echo "Skipped, no python 
             files to lint"; fi             files to lint"; fi
-</code>+    rules: 
 +            - if: $CI_PIPELINE_SOURCE == "merge_request_event" 
 + 
 +</sxh>
  
   * Variables definiert globale Variablen   * Variables definiert globale Variablen
Zeile 100: Zeile 124:
       * bestehen aus mehreren Jobs       * bestehen aus mehreren Jobs
       * Jobs können parallel verarbeitet werden       * Jobs können parallel verarbeitet werden
-  * pylint -> Job+  * pylint_commit -> Job
       * Jobs können beliebige Namen haben       * Jobs können beliebige Namen haben
       * stage: Besagt von welchem Stage der Job ist       * stage: Besagt von welchem Stage der Job ist
Zeile 109: Zeile 133:
           * Liste           * Liste
           * jeder Eintrag ist ein Shell-Befehl           * 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               * 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 Stages ausgeführt
                   * es werden keine weiteren Befehle 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
 +                  * "push" -> ein Commit
 +                  * "merge_request_event" -> ein Merge-Request
 +  * 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
  
  
Zeile 125: Zeile 159:
   * schlägt der fehl (und nur dann), wird Code2 ausgeführt   * schlägt der fehl (und nur dann), wird Code2 ausgeführt
 </WRAP> \\ Vermutlich könnte man für Code2 auch "exit 0" fix einsetzen, wenn man den Return-Code nicht braucht | </WRAP> \\ Vermutlich könnte man für Code2 auch "exit 0" fix einsetzen, wenn man den Return-Code nicht braucht |
 +|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
 +</sxh> \\ Alle Zeilen werden als eine Zeile betrachtet, die Zeilenumbrüche werden als Leerzeichen interpretiert. \\ <WRAP>
 +  * Das ">" leitet einen Block ein (also alles danach soll als eine Zeichenkette interpretiert werden)
 +  * Alle Zeilen die Teil des Blocks müssen zum ">" eingerückt sein
 +</WRAP>|
 +|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 '*.py$') || last_ret=$?
 +</sxh> <WRAP>
 +  * ggf. muss in der globalen variables-Sektion "GIT_DEPTH: 0" gesetzt werden -> sonst macht gitlab ggf. eine shallow-Copy und das git diff schlägt fehl
 +  * 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
 +</sxh>
 +    * $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
 +  * "%%|%%%%|%% und das dahinter dient nur der Absicherung, da ggf. nicht 0 als Return-Wert zurückkommt, weil keine Dateien gefunden wurden -> wäre es nicht da und es würden keine Dateien gefunden, dann würde der Befehl 1 zurückgeben als Return-Wert und der Job + alle folgenden Stages fehlschlagen
 +\\ \\
 +Das Gleiche noch mal für die Dateiliste im Vergleich zum Master-Branch (sinnvoll wenn man beim Merge-Request, wo ja ein ganzer Branch gemerged wird):
 +<sxh yaml>
 +script:
 +     - pythonfiles=$(git diff --name-only origin/$CI_DEFAULT_BRANCH... | grep -E '*.py$') || last_ret=$?</sxh>
 +
 +  * eigentlich alles wie in vorhergehendem Beispiel
 +  * $CI_DEFAULT_BRANCH -> Variable die den Namen des Default-Branches enthält (aber ohne "origin" -> das muss ggf. fix vorangestellt werden)
 +</WRAP> |
 +|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:
 +   …some stuff
 +   rules:
 +            - if: $CI_PIPELINE_SOURCE == "push"
 +
 +pylint_merge:
 +   …some stuff
 +   rules:
 +            - if: $CI_PIPELINE_SOURCE == "merge_request_event"
 +</sxh> <WRAP>
 +  * In obigem Beispiel sind 2 Jobs definiert
 +      * pylint_commit läuft nur für Commits ("pushs")
 +      * 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
 +      * "$CI_PIPELINE_SOURCE" -> Variable enthält was die Pipeline angestoßen hat (welches Event)
 +          * "push" -> Commit
 +          * "merge_request_event" -> Merge Request
 +
 +</WRAP> |
 +|pylint integrieren| <sxh YAML>
 + - pylint --rcfile=.pylintrc $pythonfiles;
 +</sxh> <WRAP>
 +  * das Kommando wird im Root des Projektes (des git-Projektes) ausgeführt ".pylintrc" ist damit im Root des Repositories
 +      * man kann die .pylintrc also einfach ein- und auschecken wie jede andere Datei auch
 +  * $pythonfiles ist die Liste von Dateien die gelinted werden sollen
 +</WRAP> |
 ===== Auto DevOps ===== ===== Auto DevOps =====
  
programmieren/gitlab.1641834788.txt.gz · Zuletzt geändert: 2022/01/10 18:13 von root