[Git管理]使用shell脚本和nodejs实现快速commit和打tag

思考
前端使用npm和git进行开发工作时,会有版本号或者变更需要同步更新提交。通过commit提交更新信息时,是不是可以将commit信息利用起来,成为我们工作时变更的版本日志数据?

话不多说,码上分享。

使用方式

执行命令: sh bin/commit.sh

运行步骤

1.输入commit信息
2.选择更新类型
3.选择是否提交tag

实现方式

一、 创建相关文件


bin/commit.sh           //执行脚本
bin/commit.js           //日志文件更新
bin/version.js          //package.json版本更新
bin/version_log.json    //版本日志文件
package.json    //npm依赖配置文件

二、 关键代码


先带大家看一下版本日志文件 version_log.json
[
  {
    "date": "2021-01-01 00:00:00",
    "version": "0.0.1",
    "commit": "[更新]创建提交命令及更新日志脚本测试"
  }
]

这是一个标准的json格式文件,通过数组将版本信息存入其中,因为我是将最新的版本放到数组尾部,所以每次只需要提取最后一个匹配到的version信息进行识别版本号操作

接下来是关键的sh命令,和开发者产生交互,由开发者填写本次的版本更新日志,选择更新版本的类型,以及是否进行tag标签提交的选项
#!/bin/bash

cd bin/
#=========读取最后一个版本信息=========
versions=($(cat ./version_log.json | awk -F 'version' '/version/{print$0}' | sed 's/ //g'  ))
versions_length=${#versions[@]}
newest_version_str=${versions[versions_length-1]}
newest_version_str_length=${#newest_version_str}
#获取字符后面索引值
newest_version_str_length_end=$[newest_version_str_length-2-11]
old_version=${newest_version_str:11:$newest_version_str_length_end}
versionArr=[]
v=${old_version//./ }
index=0
for i in $v; do
    versionArr[index]=$i
    index=$[index+1]
done

read -p  "请提交变动信息:" commit_msg
#=========执行更新类别选择(默认bug修复)=========
commitPrefix="[修复]"
echo "====== 1. 迭代 ======"
echo "====== 2. 更新  ======"
echo "====== 3. 修复 ======"
read -p  "请选择变动类型 (默认:3) :" level

case $level in
    1)  echo '您已选择版本迭代'
    versionArr[0]=$[versionArr[0]+1]
    versionArr[1]=0
    versionArr[2]=0
    commit="[迭代]"$commit_msg
    ;;
    2)  echo '您已选择小更新'
    versionArr[1]=$[versionArr[1]+1]
    versionArr[2]=0
    commit="[更新]"$commit_msg
    ;;
    3)  echo '您已选择修复'
    versionArr[2]=$[versionArr[2]+1]
    commit="[修复]"$commit_msg
    ;;
    *)  echo '您已默认选择修复'
    versionArr[2]=$[versionArr[2]+1]
    commit="[修复]"$commit_msg
    ;;
esac
now_date=`date "+%Y-%m-%d_%H:%M:%S"`
echo $now_date
version=${versionArr[0]}'.'${versionArr[1]}'.'${versionArr[2]}
echo $version
addInfo="{\"date\":\"$now_date\",\"version\":\"$version\",\"commit\":\"$commit\"}"

#=========更新版本日志文件信息=========
node commit $addInfo
#同步更新package.json版本号
node version
git commit -am $commit

read -p  "是否添加Tag(Git)1/0:" is_add_tag
echo $is_add_tag
if(($is_add_tag == 1 ))
then
  echo "您已选择推送Git标签,即将执行..."
  git tag $version
  git push origin --tags dev
else
  echo "您未选择推送Git标签,即将结束..."
  git push origin dev
fi

exit 1
然后是对两个json文件的读写操作node命令

commit.js

//增加更新系统日志功能
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
const path = require("path");
const fs = require('fs')
var versionStr = ""
if (!process.argv[2]) {
  process.exit()
  return console.error('[打包通知]未获取到版本信息流,重写失败', err)
}
versionStr = process.argv[2]   
fs.readFile(path.join(__dirname, './version_log.json'), (err, data) => {
  if (err) {
    process.exit()
    return console.error("[打包通知]文件读取异常:" + err)
  }

  let packagesConfig = JSON.parse(data)
  packagesConfig.push(JSON.parse(versionStr))
  fs.writeFile(path.join(__dirname, './version_log.json'), JSON.stringify(packagesConfig), (err, result) => {
    if (err) {
      return console.error('[打包通知]version_log.json 重写失败', err)
    }
    process.exit()
    return console.log('[打包通知]version_log.json 版本更新成功')
  })
})

verison.js

const path = require("path");
const fs = require('fs')

fs.readFile(path.join(__dirname, '../package.json'), (readFilePackageError, packages) => {
  if (readFilePackageError) {
    process.exit()
    return console.error("[打包通知]读取package.json错误:" + readFilePackageError)
  }
  let newVersion
  fs.readFile(path.join(__dirname, './version_log.json'), (readFileLogError, logs) => {
    if (readFileLogError) {
      process.exit()
      return console.error("[打包通知]读取开发日志发生错误:" + readFileLogError)
    }
    let logData = JSON.parse(logs)
    newVersion = logData.pop().version
    console.log('[打包通知]当前最新开发日志版本:V' + newVersion)

    let packagesConfig = JSON.parse(packages)
    packagesConfig.version = newVersion

    fs.writeFile(path.join(__dirname, '../package.json'), JSON.stringify(packagesConfig), (err, result) => {
      if (err) {
        return console.error('[打包通知]package.json 重写失败', err)
      }
      process.exit()
      return console.log('[打包通知]package.json 版本更新成功')
    })

  })
})

原创内容,未经允许禁止转载!

你可能感兴趣的:(npm,node.js,shell,git)