1.进入linux服务器,通过ssh-keygen -m PEM -t rsa -b 4096命令生成id_rsa.pub和id_rsa密钥对,其中4096为生成4096字符的密钥,可以换做2048生成2048字符的密钥。
也可以ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/gitlab-rsa,使用-f参数指定生成的位置
2.然后将id_rsa.pub公钥中的内容复制到gitlab中,点击“Add Key”生成
3.完成gitlab配置ssh Key,就可以直接使用gitlab的ssh连接拉取或推送代码了。
4.同一台服务器上可以存在多个密钥,但密钥的名称不能一样,例如id_rsa_gitlab、id_rsa_github。
在~/.ssh/目录中直接vim config,用于配置多个不同的host使用不同的ssh key
host为识别模式,进行配置对应的主机名和ssh文件
hostname为登录的主机名
identityFile为对应的id_rsa文件路径
user为登录名
5.至此,在服务器上拉取不同host项目代码都能成功了。
项目实践:
背景:jenkins服务器为多节点,A为master,gitlab上配置的是A的ssh Key。jenkins执行job的时候,job被分配到了B slave节点,pipeline中使用了git(url:gitUrl,branch:"qa",credentialsId:credentialsId)方式来指定使用jenkins中配置的凭据来拉取代码(该凭据为master节点和gitlab的ssh Key连接,配置免密登录),其中credentialsID为该凭据的ID,ID与密钥所匹配,所以使用jenkins生成的id就相当于使用了该密钥。
代码被拉取到了slave服务器,进入salve服务器中该项目的目录中,再使用git pull、git push会发现,没有权限拉取、推送。这是因为slave服务器中的密钥没有被配置到gitlab上,所以无法拉取。
此时,通过config配置,新建id_rsa_gitlab(将master服务器的id_rsa密钥cp到id_rsa_gitlab中),再git pull或push就可以成功了,因为config中的host为gitlab.xxx.com,在执行git命令的时候就会匹配到该host,就会用id_rsa_gitlab中的密钥。
解决。