Node获取当前git的提交信息并保存到json文件

Node获取当前git的提交信息并保存到json文件

核心

本次需求的核心是引入shellJs,通过shell.exec运行命令获取git信息,其他都是常规的json获取和文件保存,所以核心是以下代码

const shell = require('shelljs')
// 获取git分支名称
const branchs = shell.exec("git branch").trim().split('\n')
branchs.forEach(function (item) {
    if (item.indexOf('*') > -1) {
        versionObj.branch = item.replace('*', '').trim() // 获取当前激活的分支
    }
})

完整代码

/**
 * 版本更新信息对象
 * status: 状态
 * branch: 部署git分支
 * lastCommitId:最后一次git提交记录ID
 * lastCommitMessage: 最后一次git提交记录消息
 * buildDate:打包时间
 */
var versionObj = {
    status: "up",
    branch: "",
    lastCommitId: "",
    lastCommitMessage: "",
    buildDate: "",
};

const fs = require("fs");
const moment = require('moment')
const shell = require('shelljs')

// 获取git分支名称
const branchs = shell.exec("git branch").trim().split('\n')
branchs.forEach(function (item) {
    if (item.indexOf('*') > -1) {
        versionObj.branch = item.replace('*', '').trim() // 获取当前激活的分支
    }
})

versionObj.buildDate = moment().format('yyyy-MM-DD HH:mm:ss')
versionObj.lastCommitId = shell.exec("git log -1 --pretty=format:'%H'").toString() // git上次提交的id
versionObj.lastCommitMessage = shell.exec("git log -1 --pretty=format:'%s'").toString() // git提交信息

function wirteFileByPath(path) {
    fs.exists( path,function(exists){
        if(exists){
            writeJsonToFile(path)
        }
        else{
            fs.mkdir(path, function (err) {
                if (err) {
                    console.log('创建文件失败', err)
                } else {
                    writeJsonToFile(path)
                }
            })
        }
    });
}

function writeJsonToFile(path) {
    const objStr = JSON.stringify(versionObj, null, 2);
    fs.writeFile(path + '/gitBranchData.json', objStr, function (err) {
        if (err) {
            console.log('写入失败', err)
        }else {
            console.log('写入成功')
        }
    })
}

module.exports = wirteFileByPath

总结

通过shell.exec运行命令,这里面存在着很大的想象空间,有很多shell相关的命令都可以通过代码来完成了,一个实际的应用是,在vue项目的package.json文件中,在npm run build命令后面的配置中加上命令运行node文件,以达到打包时顺带生成打包信息的文件的目的。

在大型网站中,有时候会出现这样一种情况,当新版本的网站发布后,因为浏览器的缓存还没更新,使用的还是旧版本的网页逻辑( js/html/css ),需要客户手动去强制刷新更新浏览器的缓存,而有了这个打包信息后,前端可以通过间隔时间获取打包信息,判断当前浏览器的代码是否是最新的代码,如果不是最新代码,则自动刷新,免去客户的手动刷新