node创建GIT分支,并修改代码提交

核心代码,脚本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 })

需要注意的点

  1. 了解端和端的差异,确保自己使用的shell脚本命令被当前的宿主环境支持,前端一般就是(mac 的bash 环境)和liunx的脚本环境,一般也是bash
  2. git等命令,liunx宿主环境不一定存在,如果不存在记得安装
  3. 关于liunx软件的安装,不同平台有一定差异,当前使用的centOS平台是使用 yum install packageName 即可。

遇到的难点

  1. 如何clone项目, 采用的是
    const gitUri = `http:/${username}:${password}@gitlab.com/fe/${protal.gitName}.git`
  1. 如何获取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运行遇到的并不是这个问题

  1. 设置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进程的归属用户根文件夹并不存在此配置。

  • 解决方案
    1. 复制当前用户的.gitconfig文件到node进程的归属用户文件夹下
        cd /home
        cp user1/.gitconfig user2/
    
    1. node代码中定义当前git项目的用户名
        await utils.runCommand('git', ['config user.name "xxx"'], { cwd: GIT_ROOT })
        await utils.runCommand('git', ['config user.email "xxx"'], { cwd: GIT_ROOT })
    
  1. 如何查看当前node进程的归属用户名
      ps aux | grep node
      # 输出
      第一项就是用户名

原文地址:https://www.cnblogs.com/clearfix/p/12855808.html