Android代码使用repo管理工具进行管理,管理了大量的git仓库,假如每次同步代码都要去手动输入账号,密码,这是一件极其麻烦的事情。
git为此引入了credential.helper的机制,具体做法是在~/.gitconfig文件中写入一个配置项,配置为store。具体用法参考该链接:https://git-scm.com/docs/git-credential-store
原理是使用一个本地文件~/.git-credentials,存储账号,密码及对应的服务器信息。当访问某个服务器的.git地址时,直接从该文本中获取密码,来解决频繁输入密码的问题。当更改密码,或者检验失败时会删除本地文件,提示你重新输入密码,输入新密码后重新更新到改文件。
这个方法巧妙得解决了频繁输入账号密码的问题。但是对于CI工程来说,还是令人头疼。上面的机制说明git在网络不稳定或者一些其他环境因素导致校验不成功时,同样会删除本地文件,提示重新输入密码。一旦CI工程出现该问题,不能做到及时人为干预的话,那执行在该执行机上的CI任务必将等待较长时间,等待输入密码,且会一直失败。
经过研究具体执行代码,找到了终结此问题的方法。下面先将用法,具体原理后面补充。
1.修改~/.gitconfig中credential配置项,将之前的helper = store,更改为某一sh脚本
[user]
2 name = psmcci
3 email = smcci@huawei.com
4
5 [core]
6 editor = vim
7
8 [merge]
9 tool = vimdiff
10
11 [url "http://psmcci@szxgit10-rd.huawei.com:8080"]
12 insteadof = http://szxgit10-rd.huawei.com:8080
13 insteadof = ssh://szxgit10-rd.huawei.com:29418
14 insteadof = ssh://psmcci@szxgit10-rd.huawei.com:29418
15 insteadof = ssh://smcci@szxgit10-rd.huawei.com:29418
16
17
18 [color]
19 ui = auto
20
21 [credential]
22 helper = /home/jagent/bin/git-credential-helper
23
24 [commit]
25 template = ~/.gitmessage
26 [pack]
27 windowMemory = 1000m
28 packSizeLimit = 1000m
29 threads = 1
脚本指向:
cat bin/git-credential-helper
#!/usr/bin/env bash
echo "username=xxx"