Benutzer-Werkzeuge

Webseiten-Werkzeuge


docu:gitlab-ci

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
docu:gitlab-ci [2017/11/22 07:04]
sage
docu:gitlab-ci [2020/05/19 12:35] (aktuell)
abq319 [Docker Images in Gitlab Build bauen]
Zeile 1: Zeile 1:
 ====== Gitlab CI/CD ====== ====== Gitlab CI/CD ======
  
-Wenn in einem Code Repository ​eine Datei namens ''​.gitlab-ci.yml''​ existiert, so wird GitLab versuchen mit Hilfe der darin enthaltenen Anweisungen das Software ​in dem Projekt ​zu bauen, evtl. zu testen ​und bei Erfolg ​in eine Zielumgebung zu deployenIn der GitLab Instanz werden standardmäßig die Build-Processe über Kubernetes ​in der [[:​docu:​informatikcomputecloud|ICC]] ausgeführt. Für Spezialfälle können ​aber auch eigene ​Build-Runner angebunden werden.+Gitlab bietet ​eine automatische Continous Build/​Continous Deployment PipelineDamit wird in jedem, entsprend vorbereiteten, ​Projekt ​nach einer Änderung des Git-Repositories automatisch der Code ausgechecked,​ gebaut, evtl. Tests durchgeführt ​und in ein ausführbares Format gebrachtWenn diese Schritte erfolgreich sind, kann das fertige Programm auch in der [[:​docu:​informatikcomputecloud|ICC]] ​automatisch ausgeführt werden und Messdaten direkt in Gitlab beobachtet werden. 
 + 
 +Im Wurzelverzeichnis eines Projektes muss die Datei ''​.gitlab-ci.yml''​ existieren. Diese wird dann mit im gemeinsamen GitLab-Runner über Kubernetes innerhalb der ICC ausgeführt. Für Spezialfälle können auch eigene Runner angebunden werden. Siehe [[:​docu:​gitlab-ci#​eigene_build_runner|ensprechenden Abschnitt]] weiter unten.
  
 ===== Minimales .gitlab-ci.yml ===== ===== Minimales .gitlab-ci.yml =====
  
-===== Docker Images ​in Gitlab ​Build bauen =====+Um ein Projekte für die Ausführung ​in der ICC vorzubereiten muss der Code als Docker-Image zur Verfügung stehen. Die folgende Vorlage illustriert dies anhand eine Golang-Projektes. Für andere Sprachen müssen die Anweisungen im Abschnitt ''​job_build.script''​ angepasst werden. Eine vollständige Dokumentation für die Build-Spezifikation findet sich hier: [[https://​docs.gitlab.com/​ee/​ci/​yaml/​README.html|https://​docs.gitlab.com/​ee/​ci/​yaml/​README.html]]
  
-Es ist natürlich auch möglich Docker Images in einer Gitlab Pipeline zu bauen. Dazu ist die DOCKER_HOST Variable in der Gitlab Job Beschreibung zu setzen und das stable-dind images als "​service"​ im Job zu setzen. Beispiel für eine .gitlab-ci.yml aus [[https://​gitlab.informatik.haw-hamburg.de/​ail/​haw-world/​blob/​master/​.gitlab-ci.yml|https://​gitlab.informatik.haw-hamburg.de/​ail/​haw-world/​blob/​master/​.gitlab-ci.yml]]:+Vorlage:<​code>​
  
-<​code>​ 
-stages: 
-    - dockerize 
- 
-variables: 
- ​DOCKER_HOST:​ "​tcp://​localhost:​2375"​ 
- ​DOCKER_REGISTRY:​ "​nexus.informatik.haw-hamburg.de"​ 
- ​SERVICE_NAME:​ "​haw-world"​ 
- 
-createImage:​ 
- ​stage:​ dockerize 
- ​image:​ nexus.informatik.haw-hamburg.de/​docker:​stable-dind 
- ​services:​ 
-   - nexus.informatik.haw-hamburg.de/​docker:​stable-dind 
- ​script:​ 
-   - docker login -u $NEXUS_USER -p $NEXUS_PW $DOCKER_REGISTRY 
-   - docker build -t $DOCKER_REGISTRY/​$SERVICE_NAME:​$CI_PIPELINE_ID . 
-   - docker push $DOCKER_REGISTRY/​$SERVICE_NAME:​$CI_PIPELINE_ID 
-</​code>​ 
- 
-===== Deployment einer Applikation aus Gitlab in die ICC ===== 
- 
-den Artikel dazu finden Sie im entsprechenden [[:​docu:​informatikcomputecloud#​deployment_einer_applikation_aus_gitlab_in_die_icc|Abschnitt]] der Dokumentation für die Informatik Computer Cloud. 
- 
-Um ein Projekte für die Ausführung in der ICC vorzubereiten muss der Code als Docker-Image zur Verfügung stehen. Die folgende Vorlage illustriert dies anhand eine Golang-Projektes. Für andere Sprachen müssen die Anweisungen im Abschnitt ''​buildAndTest''​ angepasst werden. 
- 
-Vorlage: 
- 
-<​code>​ 
 stages: stages:
   - build   - build
-  - test 
-  - dockerize 
- 
-variables: 
-  DOCKER_REGISTRY:​ "​docker-hub.informatik.haw-hamburg.de/​$CI_PROJECT_NAMESPACE"​ 
-  IMAGE_NAME: "​k8s-job-monitor"​ 
-  DOCKER_HOST:​ "​localhost:​2375"​ 
-cache: 
-  paths: 
-    - vendor 
  
 before_script:​ before_script:​
   - git config --global http.sslVerify true   - git config --global http.sslVerify true
  
-buildAndTest:+job_build:
   stage: build   stage: build
-  ​only: +  image: golang:​1.8.3
-   - master +
-  ​image: ​nexus.informatik.haw-hamburg.de/​golang:​1.8.3+
   variables:   variables:
     CGO_ENABLED:​ "​0"​     CGO_ENABLED:​ "​0"​
Zeile 68: Zeile 29:
     - mkdir -p /​$CI_PROJECT_NAMESPACE/​$CI_PROJECT_NAME/​     - mkdir -p /​$CI_PROJECT_NAMESPACE/​$CI_PROJECT_NAME/​
     - mv ./​k8s-job-monitor /​$CI_PROJECT_NAMESPACE/​$CI_PROJECT_NAME/​     - mv ./​k8s-job-monitor /​$CI_PROJECT_NAMESPACE/​$CI_PROJECT_NAME/​
-  artifacts: 
-    paths: 
-    - ./​k8s-job-monitor 
  
-deploy: +</code>
-  stage: dockerize +
-  only: +
-   - master +
-  image: docker:​latest +
-  services: +
-    - docker:​dind +
-  before_script:​ +
-    - echo "​before_script overriden"​ +
-  dependencies:​ +
-    - buildAndTest +
-  script: +
-    - docker build -t $SERVICE_NAME:​latest . +
-    - docker tag $SERVICE_NAME:​latest $DOCKER_REGISTRY/$SERVICE_NAME:​$CI_PIPELINE_ID +
-    - docker tag $SERVICE_NAME:​latest $DOCKER_REGISTRY/​$SERVICE_NAME:​latest +
-    - docker tag $SERVICE_NAME:​latest $DOCKER_REGISTRY/​$SERVICE_NAME:​$CI_COMMIT_SHA+
  
-    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $DOCKER_REGISTRY 
  
-    ​docker push $DOCKER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID +===== Während des Build-Prozesses Zugriff auf anderes Gitlab-Repo gewähren ===== 
-    docker push $DOCKER_REGISTRY/$SERVICE_NAME:latest + 
-    docker push $DOCKER_REGISTRY/$SERVICE_NAME:​$CI_COMMIT_SHA+In der Regel werden für das Bauen von Software noch zusätzliche Komponenten wie Bibliotheken,​ Werkzeuge oder Daten benötigt. Diese werden zusammenfassend als Abhängigkeiten bezeichnet. Wenn diese Abhängigkeiten in zugriffsbeschränkten Repositories auf dem Gitlab zu Verfügung stehen, so können für einen Build-Prozess die notwendigen Zugangsinformationen mit sog. //**Deploy Keys**// ​ ([[https://​docs.gitlab.com/​ce/​ssh/​README.html#​deploy-keys|https://​docs.gitlab.com/​ce/​ssh/​README.html#​deploy-keys]]) zur Verfügung gestellt werden. 
 + 
 +Hierzu müssen Sie 
 + 
 +  Ein SSH Schlüsselpaar erzeugen. Dies sollte auf keinen Fall ihr persönliches Paar sein. 
 +  - Den öffentlichen Schlüssel legen Sie in dem Projekt **auf das zugegriffen werden soll** ​ als Deploy Key ab. Öffnen Sie dazu im Sidebar die Seite "''​//Settings | Repository//''"​ und erweitern den Abschnitt "''//​Deploy Keys//''"​. Legen Sie nun einen neuen Deploy Key an. Hier finden Sie auch einen Link auf detailierte Informationen zur Erzeugung und Formatierung der benötigten Schlüssel. 
 +  - Den private Schlüssel legen Sie in das Projekt **aus dem heraus zugegriffen werden soll** ​ als geheime Variable ab. Öffnen Sie dazu im Sidebar die Seite "''//​Settings | CI/​CD//''"​ und erweitern den Abschnit "''//​Secret variables//''"​. Legen Sie eine Variable mit dem Namen "​SSH_PRIVATE_KEY"​ an und füllen Sie deren Wert auf den private Key. 
 +  - In dem Projekt von dem aus zugegriffen werden soll fügen, Sie folgenden Abschnitt zur ''​.gitlab-ci.yml'' ​ hinzu (oder erweitern ihn, wenn Sie schon einen solchen Abschnitt haben
 + 
 +<​code>​ 
 +before_script:​ 
 +  # setup SSH if on ubuntu 
 +  ​eval $(bash ./scripts/​setup-ssh.sh "$SSH_PRIVATE_KEY"​)
 </​code>​ </​code>​
 +
 +  - Folgendes Script dem zugreifenden Projekt unter ''​scripts/​setup-ssh.sh'' ​ hinzufügen:​
 +
 +<​code>​
 +#!/bin/bash
 +#
 +# set up the SSH agent to access the repositories of the dependencies of
 +# this project. Currently only works on Ubuntu or Debian machines.
 +#
 +# use: setup-ssh #
 +# set the private key as project secret
 +#
 +SSH_PRIVATE_KEY="​$1"​
 +# check if this is actually ubuntu
 +ID="​something else"
 +test -f /​etc/​os-release && source /​etc/​os-release
 +case "​$ID"​ in
 +  debian|ubuntu)
 +    # Install ssh-agent if not already installed, it is required by Docker.
 +    which ssh-agent>/​dev/​null || ( apt-get update -y && apt-get install openssh-client -y )
 +
 +    # Run ssh-agent (inside the build environment)
 +    AGENT_SETUP=$(ssh-agent -s) ; echo "​$AGENT_SETUP"​
 +
 +    # need info here too
 +    eval $AGENT_SETUP>/​dev/​null
 +
 +    # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
 +    echo -n "#"​
 +    ssh-add <(echo "​$SSH_PRIVATE_KEY"​)
 +    echo -n "# Key loaded: ​ "
 +    ssh-add -l
 +
 +    # For Docker builds disable host key checking. Be aware that by adding that
 +    # you are susceptible to man-in-the-middle attacks.
 +    # WARNING: Use this only with the Docker executor, if you use it with shell
 +    # you will overwrite your user's SSH config.
 +    mkdir -p ~/.ssh
 +
 +    [[ -f /.dockerenv |]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n">​ ~/​.ssh/​config
 +  ;;
 +  *)
 +    echo "echo OS is $ID, which is unknown to mee, no setup done"
 +    exit 0
 +esac
 +</​code>​
 +
 +
 +===== Docker Images in Gitlab Build bauen =====
 +
 +Es ist natürlich auch möglich Docker Images in einer Gitlab Pipeline zu bauen. Dazu ist die DOCKER_HOST Variable in der Gitlab Job Beschreibung zu setzen und das stable-dind images als "​service"​ im Job zu setzen. Beispiel für eine .gitlab-ci.yml aus [[https://​git.haw-hamburg.de/​icc/​haw-world/​-/​blob/​master/​.gitlab-ci.yml|https://​git.haw-hamburg.de/​icc/​haw-world/​-/​blob/​master/​.gitlab-ci.yml]]:​
 +<​code>​
 +
 +stages:
 +    - dockerize
 +
 +variables:
 + ​DOCKER_REGISTRY:​ "​git.haw-hamburg.de:​5005"​
 + ​SERVICE_NAME:​ "​haw-world"​
 + ​DOCKER_TLS_CERTDIR:​ "/​certs"​
 +
 +create_image:​
 + ​stage:​ dockerize
 + ​image:​ docker:​19.03.3
 + ​services:​
 +   - docker:​19.03.3-dind
 + tags:
 +   - dind
 +   - docker
 + ​script:​
 +   - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $DOCKER_REGISTRY
 +   - docker build -t $SERVICE_NAME:​latest .
 +   - docker tag $SERVICE_NAME:​latest $DOCKER_REGISTRY/​$CI_PROJECT_NAMESPACE/​$SERVICE_NAME:​latest
 +   - docker push $DOCKER_REGISTRY/​$CI_PROJECT_NAMESPACE/​$SERVICE_NAME:​latest
 +
 +</​code>​
 +
 +
 +===== Deployment einer Applikation aus Gitlab in die ICC =====
 +
 +den Artikel dazu finden Sie im entsprechenden [[:​docu:​informatikcomputecloud#​deployment_einer_applikation_aus_gitlab_in_die_icc|Abschnitt]] der Dokumentation für die Informatik Computer Cloud.
 +
 +===== Eigene Build Runner =====
  
 Siehe [[https://​docs.gitlab.com/​ce/​ci/​runners/​README.html|https://​docs.gitlab.com/​ce/​ci/​runners/​README.html]] für weitere Details. Siehe [[https://​docs.gitlab.com/​ce/​ci/​runners/​README.html|https://​docs.gitlab.com/​ce/​ci/​runners/​README.html]] für weitere Details.
  
  
docu/gitlab-ci.1511330675.txt.gz · Zuletzt geändert: 2017/11/22 07:04 von sage