Gitlab-runner local build – 从非TTY设备login

我试图在Linux上使用gitlab-runner在本地构build项目。

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" 

不幸的是,我的尝试结束与“dockerlogin”的错误不能够执行从非TTY设备的交互式login。

 $ 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 

我的问题是有人偶然发现这个问题,以及如何成功地执行构build?

您很可能没有为您正在处理的项目指定variables$CI_JOB_TOKEN$CI_REGISTRY 。 请注意,variables不会共享 ,只能为每个项目设置!

这也是你遇到错误信息的原因

“标志需要一个参数:”p“in -p”

当您尝试执行没有引号的$CI_JOB_TOKENlogin时, 这是正确的方式 ,否则$CI_JOB_TOKEN不会被识别为variables,但它只是一个由两个引号组成的string,一个美元符号和字符序列“CI_JOB_TOKEN” 。

假设你的variables没有设置,你尝试执行命令

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

variables被评估,你的命令看起来像这样:

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

-p标志后面没有密码,因此docker试图初始化交互式login。

您可以通过在您的.gitlab-ci.yml echo $CI_JOB_TOKEN中包含命令echo $CI_JOB_TOKEN来尝试输出variables来validation这一点