核心代码,脚本utils
// defined
const spawn = require('child_process').spawn;
const runCommand = function(cmd, args, options) {
return new Promise((resolve, rejct) => {
const spwan = spawn(
cmd,
args,
Object.assign(
{
cwd: process.cwd(),
// stdio: 'inhert' 定义inhert的话下面无法获取到stdout等输出
shell: true
},
options
)
);
spwan.stdout.on('data', (data) => {
logger.info(`------stdout--------
${data}
------stdout--------`);
});
spwan.stderr.on('data', (data) => {
logger.info(`------stderr--------
${data}
------stderr--------`);
});
spwan.on('exit', () => {
resolve();
})
})
}
// usage
await utils.runCommand('git', [`checkout -b ${branchName}`], { cwd: GIT_ROOT })
需要注意的点
- 了解端和端的差异,确保自己使用的shell脚本命令被当前的宿主环境支持,前端一般就是(mac 的bash 环境)和liunx的脚本环境,一般也是bash
- git等命令,liunx宿主环境不一定存在,如果不存在记得安装
- 关于liunx软件的安装,不同平台有一定差异,当前使用的centOS平台是使用 yum install packageName 即可。
遇到的难点
- 如何clone项目, 采用的是
const gitUri = `http:/${username}:${password}@gitlab.com/fe/${protal.gitName}.git`
- 如何获取npm包的gzp地址
# 获取此脚本的输出
npm view ${packageName}@${packageVersion} dist.tarball
- 项目上线后,git在执行项目时因没有文件权限无法创建
fatal: Unable to create '/home/xxx/react-fifteen-build/.git/index.lock': Permission denied
此问题的原因是登录服务器的用户我和真实的当前node进程归属用户不同,实际上node运行遇到的并不是这个问题
- 设置git的用户名
输出错误日志后,没有设置git提交的用户名
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: empty ident name (for <tomcat@l-cms2.fe.f.cn2>) not allowed
在服务器上执行命令后,再次测试,发现仍然报错,原因是因为git config --global user.email 是在 当前用户的根文件夹下创建.gitconfig文件来存储用户信息,具体内容如下
[user]
email = xxx@qq.com
name = xxx
而当前node进程的用户,和当前登录的服务器的用户不一致。造成node进程的归属用户根文件夹并不存在此配置。
- 解决方案
- 复制当前用户的.gitconfig文件到node进程的归属用户文件夹下
cd /home cp user1/.gitconfig user2/
- node代码中定义当前git项目的用户名
await utils.runCommand('git', ['config user.name "xxx"'], { cwd: GIT_ROOT }) await utils.runCommand('git', ['config user.email "xxx"'], { cwd: GIT_ROOT })
- 如何查看当前node进程的归属用户名
ps aux | grep node
# 输出
第一项就是用户名