web-dev-qa-db-fra.com

Gitlab-runner local build - connexion depuis un périphérique non TTY

J'essaie de construire mon projet localement en utilisant gitlab-runner sous Linux.

docker-build:
  stage: build
  image: docker:latest
  script:
    - docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY # user "gitlab-ci-token" is automatically created by GitLab
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME" target/
    - docker Push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME"

Malheureusement, mes tentatives se terminent par une erreur concernant le "login de docker" ne pouvant pas effectuer de login interactif à partir d'un périphérique non-TTY.

$ gitlab-ci-multi-runner exec docker --docker-privileged docker-build
Running with gitlab-ci-multi-runner 1.11.1 (a67a225)
  on  ()
Using Docker executor with image docker:latest ...
Starting service docker:dind ...
Pulling docker image docker:dind ...
Waiting for services to be up and running...
Pulling docker image docker:latest ...
Running on runner--project-1-concurrent-0 via vanqyard...
Cloning repository...
Cloning into '/builds/project-1'...
done.
Checking out 70187b2d as docker-basic-conf...
Skipping Git submodules setup
Checking cache for docker-build/docker-basic-conf...
Successfully extracted cache
$ docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY
Error: Cannot perform an interactive login from a non TTY device
ERROR: Job failed: exit code 1
FATAL: exit code 1 

Ma question est de savoir si quelqu'un est tombé sur cette question et comment réussir à construire avec succès.

30
asdfgh

Ce problème n’est probablement pas lié au problème ici, mais certaines personnes pourraient rencontrer exactement le même message en essayant un docker login à partir d’un terminal de type Linux sous Windows, tel que Git bash ou terminal Docker quickstart ou même Cygwin.

Le truc ici est d’utiliser winpty docker login

32
Victor Petit

Très probablement, vous n'avez pas spécifié les variables $CI_JOB_TOKEN et $CI_REGISTRY pour le projet sur lequel vous travaillez. Notez que les variables sont non partagées et ne sont définies par projet !

C'est aussi pourquoi vous rencontrez le message d'erreur

"flag a besoin d'un argument: 'p' dans -p"

lorsque vous essayez de vous connecter à docker sans les guillemets, ce qui est le bon moyen car sinon $CI_JOB_TOKEN n'est pas reconnu en tant que variable, mais il s'agit simplement d'une chaîne composée de deux guillemets, d'un signe dollar et de la séquence de caractères "CI_JOB_TOKEN".

En supposant que vos variables ne sont pas définies et que vous essayez d'exécuter la commande

docker login -u "gitlab-ci-token" -p $CI_JOB_TOKEN $CI_REGISTRY

les variables sont évaluées et votre commande ressemble essentiellement à ça:

docker login -u "gitlab-ci-token" -p

Le -p flag n’est pas suivi d’un mot de passe et pour cette raison, le menu fixe tente d’initialiser une connexion interactive.

Vous pouvez le vérifier en essayant de générer vos variables en incluant la commande echo $CI_JOB_TOKEN dans votre .gitlab-ci.yml

17
Dennis

J'ai eu le même problème, mais pour une cause différente de celles déjà énumérées ici.

Voici ma commande gitlab-ci:

docker login "${Azure_ACR_URL}" -u "${Azure_ACR_ACCOUNT}" -p "${Azure_ACR_PASSWORD}"

Mon pipeline fonctionnait correctement sur la branche principale, mais pas sur les autres branches. Pourquoi? Parce que j'ai défini la variable Azure_ACR_PASSWORD via la fonctionnalité settings/ci_cd, avec l'indicateur "protected". Après avoir lu ce que signifie cet indicateur protégé, j'ai compris pourquoi ma variable Azure_ACR_PASSWORD n'était pas visible dans la commande:

Cette variable sera transmise uniquement aux pipelines s'exécutant sur des branches et des tags protégés

8
claudod

Bien que je pense avoir eu cette erreur pour git-lab, je l’ai eu en tirant une image différente. Le problème concernait l'utilisation de git bash sous Windows, le passage à l'invite du shell, puis essayez ce qui suit:

 docker login
0
Utopia