Inhaltsverzeichnis

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/n1843/test1.git
git push -u origin --all
git push -u origin --tags

Entwicklungsablauf

git push --set-upstream origin <Branchname>

CI/CD

Bestandteile

gitlab-ci.yaml

variables:
    GIT_DEPTH: 0         

default:
    image: snom/sina-portal:2

stages:
  - static_analyses

pylint_commit:
    stage: static_analyses
    before_script:
        - echo "Installing pylint"
        - pip3 install pylint
    script:
        - 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
        - pythonfiles=$(git diff --name-only origin/$CI_DEFAULT_BRANCH... | 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 == "merge_request_event"

Troubleshooting/Howto

Problem/Howto Beschreibung
git --diff 

schlägt fehl

gitlab macht eine „shallow copy“, das heißt es checkt nicht die gesamte git-History aus, sondern nur die letzten x Commits.
Man kann in der globalen Sektion „Variables“ die Variable „GIT_DEPTH“ auf 0 setzen
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.

 pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E '*.py$') || last_ret=$? 

In obigem Beispiel wird ein git –diff gemacht, wenn das nicht mit 0 zurückkommt wird der Teil hinter „||“ ausgeführt - der Return-Wert in einer Variablen gespeichert. Da der zweite Befehl (das Speichern in einer Variable) immer erfolgreich ist wird immer 0 zurückgegeben für diesen Befehl.

 Code 1 || Code 2 

  • Es wird erst Code 1 ausgeführt (der Teil der fehlschlagen kann)
  • schlägt der fehl (und nur dann), wird Code2 ausgeführt


Vermutlich könnte man für Code2 auch „exit 0“ fix einsetzen, wenn man den Return-Code nicht braucht

Befehl der mehrere Zeilen umfasstYaml interpretiert jeden Zeilenumbruch per Default als neues Element (zum Beispiel als neuen Listeneintrag).
liste:
     - >
        Zeile1
        Zeile2
        Zeile3

Alle Zeilen werden als eine Zeile betrachtet, die Zeilenumbrüche werden als Leerzeichen interpretiert.
  • 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
Verifiziere nur Dateien die sich zum vorhergehenden Commit/zum Master-Branch geändert habenFü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.
script:
     - pythonfiles=$(git diff --name-only $CI_COMMIT_SHA $CI_COMMIT_BEFORE_SHA | grep -E '*.py$') || last_ret=$?
  • 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

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
  • „|| 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):

script:
     - pythonfiles=$(git diff --name-only origin/$CI_DEFAULT_BRANCH... | grep -E '*.py$') || last_ret=$?

  • 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)
Job nur ausführen wenn es ein merge-Request istPer Default laufen Jobs nur bei Commits, nicht vor Merge-Requests.
pylint_commit:
   …some stuff
   rules:
            - if: $CI_PIPELINE_SOURCE == "push"

pylint_merge:
   …some stuff
   rules:
            - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  • 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
pylint integrieren
 - pylint --rcfile=.pylintrc $pythonfiles;
  • 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

Auto DevOps

Begriffe

Abkürzung Begriff Beschreibung
CIContinous IntegrationJedes Commit wird automatisch (mit Hilfe von Scripten und Tools) gebaut (oder teilweise gebaut) und getestet
CDContinous DeliveryAutomatisches Ausrollen der Software, allerdings wird es manuell ausgelöst
CDContinous DeploymentEs wird automatisch ausgerollt auf Produktivsysteme

Dinge die eingestellt werden sollten