问题
在 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,然后一切恢复正常。