问题
在 gitlab pipeline
的日志输出中可以看到,一旦执行到 docker login
之后,就会挂掉,报 Error: Cannot perform an interactive login from a non TTY device
这个错误。
在UNIX的术语中,最简单的回答是:
终端(terminal)= tty =文本的输入输出环境
控制台(console)= 物理终端
shell = 命令行解释器
思路
这个时候就纳闷了,一天一夜没睡觉,就为了整合 gitlab ci
、helm
和 k3s
做项目管理,这已经临近尾声了,怎么突然就报错了?之前运行了好几十次,都好好的。
检索一番之后,发现如果 docker login -u xxx -p
后面不跟密码的话,那么 docker
就会自动让用户输入密码,但是因为是在 gitlab runner
里运行的这条命令,自然没有 TTY
了,于是报错。
那么我明明写了 $DOCKER_PWD
这个变量,检查 repo
的设置里的 variables
,也设置了相应的变量值,应该没啥问题啊?
这时候将 gitlab-ci.yaml
中的 CI_DEBUG_TRACE
值设置为 true
,再重新触发 pipeline
,然后看日志:
果然没有 DOCKER_PWD
这个变量!
这下就更纳闷了,但是突然一想,设置 variables
的界面好像有个 protected
功能!之前随便点的玩了下。
而今天都在调式 ci/cd
的功能,把 develop
分支的提交记录搞的特别乱,所以刚才把 develop
分支取消了 protected
,然后合并提交之后 push -f
了一下。
这个 protected
功能,只要打开之后,非 protected
的分支触发的 pipeline
,就拿不到这个变量了!
解决
so,重新把 develop
分支设置成 protected
,然后一切恢复正常。