问题现象:
-
jinekins 流水线在yarn 编译前端私服依赖包的时候,报错,提示
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
【emm。。。之前的构建都是好好的,也不知道前端大哥啥时候去封装的前端代码,而且奇怪的是没有放在公共库里。。。。】
Pipeline 流水线:
pipeline{
//指定运行此流水线的节点
agent { node { label "master"}}
//流水线的阶段
stages{
//阶段1 获取代码
stage("拉取代码"){
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/develop']], extensions: [], userRemoteConfigs: [[credentialsId: 'test', url: 'git@code.xx.net:xx-n/xx-fe-n/project-a/b/soter-admin.git']]])
}
}
stage("打包编译"){
steps{
sh '''
source /etc/profile && /usr/local/nodejs/bin/yarn && /usr/local/nodejs/bin/yarn build --mode development
'''
}
}
stage("部署"){
steps{
sh '''
bash /root/.jenkins/a/web/web-main.shell a-admin a-web-dev
'''
}
}
}
一番排错后,发现是 没有使用机器私钥文件或者 jenkins 私钥凭证 拉取 gitlab中私有封装的依赖包,从而导致打包失败
发现只有在拉取代码阶段使用了 jenjins 上凭证id test 去拉取代码; 后面打包编译阶段,没有使用jenkins私钥凭证或者机器上私钥文件
解决思路:
-
封装的前端代码,放在公共库里【开发去改造】
-
前端代码的package.json 文件里,指定 gitlab用户名/密码 ,如下图所示【开发去改造】 不怎么地安全,还是算了把
-
jenkins 流水线的工作节点,使用Jenkins 添加ssh 私钥文件凭证【运维去改造】
最终,我采取了 使用Jenkins 添加ssh 私钥文件凭证 的方式,当构建结束后再自动删除 保留再机器上的私钥文件
虽说有点笨,但是短期内没有发现什么更好的额方法!!!
改造后Pipeline 流水线
pipeline{
//指定运行此流水线的节点
agent { node { label "master"}}
//流水线的阶段
stages{
//阶段1 获取代码
stage("拉取代码"){
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/develop']], extensions: [], userRemoteConfigs: [[credentialsId: 'test', url: 'git@code.xx.net:xx-n/xx-fe-n/project-a/b/soter-admin.git']]])
}
}
stage("打包编译"){
steps{
withCredentials([sshUserPrivateKey(credentialsId: "test", keyFileVariable: 'keyfile')]) {
sh '''
cp -rp ${keyfile} /root/.ssh/id_rsa
chmod 600 /root/.ssh/id_rsa
source /etc/profile && /usr/local/nodejs/bin/yarn && /usr/local/nodejs/bin/yarn build --mode development
rm -rf /root/.ssh/id_rsa
'''}
}
}
stage("部署"){
steps{
sh '''
bash /root/.jenkins/a/web/web-main.shell a-admin a-web-dev
'''
}
}
}
备注: 添加的凭证类型
参考:
-
Jenkins管道中使用SSH凭证 Jenkins管道中使用SSH凭证_jenkins sshuserprivatekey-CSDN博客
-
Jenkins的凭证管理 Jenkins的凭证管理_jenkins secret text-CSDN博客