GitLab s'exécute dans le cluster Kubernetes. Le coureur ne peut pas créer d'image de menu fixe avec des artefacts de construction. J'ai déjà essayé plusieurs approches pour résoudre ce problème, mais pas de chance. Voici quelques extraits de configuration:
.gitlab-ci.yml
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
stages:
- build
- package
- deploy
maven-build:
image: maven:3-jdk-8
stage: build
script: "mvn package -B --settings settings.xml"
artifacts:
paths:
- target/*.jar
docker-build:
stage: package
script:
- docker build -t gitlab.my.com/group/app .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
- docker Push gitlab.my.com/group/app
config.toml
concurrent = 1
check_interval = 0
[[runners]]
name = "app"
url = "https://gitlab.my.com/ci"
token = "xxxxxxxx"
executor = "kubernetes"
[runners.kubernetes]
privileged = true
disable_cache = true
Journal d'étape du paquet:
running with gitlab-ci-multi-runner 1.11.1 (a67a225)
on app runner (6265c5)
Using Kubernetes namespace: default
Using Kubernetes executor with image docker:latest ...
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Running on runner-6265c5-project-4-concurrent-0h9lg9 via gitlab-runner-3748496643-k31tf...
Cloning repository...
Cloning into '/group/app'...
Checking out 10d5a680 as master...
Skipping Git submodules setup
Downloading artifacts for maven-build (61)...
Downloading artifacts from coordinator... ok id=61 responseStatus=200 OK token=ciihgfd3W
$ docker build -t gitlab.my.com/group/app .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Job failed: error executing remote command: command terminated with non-zero exit code: Error executing in Docker Container: 1
Qu'est-ce que je fais mal?
Pas besoin d'utiliser ceci:
DOCKER_DRIVER: overlay
car il semble que OVERLAY ne soit pas supporté, le conteneur svc-0 ne peut donc pas commencer avec:
$ kubectl logs -f `kubectl get pod |awk '/^runner/{print $1}'` -c svc-0
time="2017-03-20T11:19:01.954769661Z" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]"
time="2017-03-20T11:19:01.955720778Z" level=info msg="libcontainerd: new containerd process, pid: 20"
time="2017-03-20T11:19:02.958659668Z" level=error msg="'overlay' not found as a supported filesystem on this Host. Please ensure kernel is new enough and has overlay support loaded."
Ajoutez également export DOCKER_Host="tcp://localhost:2375"
au docker-build:
docker-build:
stage: package
script:
- export DOCKER_Host="tcp://localhost:2375"
- docker build -t gitlab.my.com/group/app .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
- docker Push gitlab.my.com/group/app
Lorsque vous utilisez Kubernetes, vous devez ajuster votre image de build pour vous connecter au moteur Docker.
Ajouter à votre image de construction:
DOCKER_Host=tcp://localhost:2375
Citation de la documentation:
L'exécution du menu fixe: dind, également connue sous le nom d'image de menu fixe, est également possible, mais il faut malheureusement que les conteneurs soient exécutés en mode privilégié. Si vous êtes prêt à prendre ce risque, d’autres problèmes apparaîtront qui pourraient ne pas sembler aussi simples au premier abord. Comme le démon docker est démarré en tant que service, généralement dans votre fichier .gitlab-ci.yaml, il sera exécuté en tant que conteneur distinct dans votre pod. Fondamentalement, les conteneurs dans les pods partagent uniquement les volumes qui leur sont affectés et une adresse IP par laquelle ils peuvent se joindre à l'aide de localhost. /var/run/docker.sock n'est pas partagé par le menu fixe: dind container et le binaire du menu fixe tente de l'utiliser par défaut. Pour écraser ceci et obliger le client à utiliser tcp pour contacter le démon docker de l'autre conteneur, veillez à inclure DOCKER_Host = tcp: // localhost: 2375 dans vos variables d'environnement du conteneur de génération.