我是在ci环境下配置了https的git鉴权,官方文档先看一下Git – 凭证存储。
问题描述
在ci(Jenkins)环境中挂载了git-credential文件,进行构建会遇到凭证(credential)不生效的问题。控制台输出fatal: could not read Username for : terminal prompts disabled。
排查
可以通过打印的方式确认存在,文件的内容和权限也没问题。
通过输出的错误可以定位到git源码中读取凭证的相关代码,发现git会先读取credential文件,然后重新写入一个新的同名文件。
再结合docker中挂载volume的相关逻辑发现挂载单个文件是通过inode来定位文件的。
linux文件系统中一个文件被删除,然后重新创建同名文件,inode是不同的。
自此问题原因查明,在构建过程中,git拉取代码的时候改变了credential文件的inode,导致后续的go get操作(其实就是git)因为读取不到凭证而构建过程失败。
解决方案
有两个办法可以解决
- 在jenkins的容器中启动构建的时候,通过-e或者-c的方式,把credential的内容传进容器内,类似于
git config --global credential.helper store --file=~/.git-credentials && echo $(_GIT_CREDENTIALS) > ~/.git-credentials
- 直接挂载目录
后记
注意.gitconfig指定.git-credentials文件位置的时候不要用相对路径。
虽然是挺小的问题,但是背后其实涉及到了git源码中凭证代码,docker的挂载原理和linux文件系统3个领域知识,还是费了一些时间的。鉴于google上也没有答案,记录下来希望可以帮到你。