让你的Mac自动同步代码

2020-10-18  本文已影响0人  yancy_1012

给大家分享一个好玩的小工具 -- 如何让你的Mac自动同步代码

相信大家在开发过程中肯定是并发运行多个需求。也相信大家一定会被频繁的同步远程分支代码搞的焦头烂额。

有的时候由于过度的投入到开发中,时间长了忘记了同步线上代码这项操作,等到上线的时候,啧啧啧~那个酸爽,各种解决冲突,而且还可能导致需求重新测试,不仅浪费了自己的时间,也会导致需求延期,更重要的是可能影响到你的 money。😁

闲言少叙,开始进入正题吧!

1. 获取代码功能

由于本功能使用 node 开发,先介绍下基本的依赖项

1.1 依赖模块介绍

确定依赖之后,我们先将两个模块引入

栗子🌰:

const fs = require('fs')
const spawn = require('child_process').spawn

1.2 确定项目目录和日志文件

完成依赖引入之后,我们需要确定项目的目录地址。以便于正确获取代码。这里需要先确定两个内容

栗子🌰:

const rootDir = '/Users/dev'
const logFile = '/Users/username/Desktop/代码出现问题-请及时查看.txt'

注意:这里的rootDir一定要使用全路径。不知道全路径的可以通过命令行进入到项目中,然后执行pwd获取项目全路径

1.3 添加项目和分支

在此之前,我们确定了使用的模块和项目目录、日志文件地址。现在我们需要添加一项配置,确定我们要同步的 项目分支 内容

由于配置比较简单,这里直接上栗子:

const pullConfig = [
  {
    dirName: 'test',
    branchList: [
      'branch-test1',
      'branch-test2'
    ]
  }
]

说明:

1.4 同步代码

前面的操作我们把依赖和配置项都做好了,下面,开始真正的同步代码操作。

首先我们需要遍历 pullConfig 这个配置项,获取到需要同步的项目和分支。

🌰:

pullConfig.forEach(item => {
  if (item.branchList.length) {

    item.branchList.forEach((branch, index) => {
                console.log(item.dirName, branch) // item.dirName 项目   branch 分支
    })
  }
})
然后执行 shell 命令,进入到项目并切换到具体分支上。之后同步代码

🌰:

pullConfig.forEach(item => {
  if (item.branchList.length) {

    item.branchList.forEach((branch, index) => {
                // 执行 shell 命令,进入到项目并切换到具体分支上。之后同步代码
        const shell = getShell(item.dirName, branch)
          const ls = spawn(shell, { shell: true });
    })
  }
})

// 获取到正确的命令。
function getShell(dirName, branch) {
  return `
        cd ${rootDir}/${dirName};
        git checkout ${branch};
        git pull origin master --rebase;
      `
}

说明:

到这里就可以真正实现通过命令来同步 指定项目的指定分支的代码 了。但是还有个问题,现在的操作并不能发现哪些分支同步成功,哪些分支同步失败了。

莫慌哟~,继续向下看。↓↓↓↓↓↓↓↓↓

1.5 错误记录和提醒

我们需要监控每次执行 shell 命令后返回得到的结果。然后查看是否失败。

注意:是否失败我们的实现方式是 -- 查看返回的内容中是否包含 'error', 'failed', 'git rebase --abort', 'git rebase --continue' 等内容。这里可以根据需要自行添加。

首先我们将遍历的方法修改一下。

🌰:

pullConfig.forEach(item => {
  if (item.branchList.length) {

    item.branchList.forEach((branch, index) => {

      let shell = getShell(item.dirName, branch)

      let ls = spawn(shell, { shell: true });

      // 添加报错内容
      const errorMsg = `项目:${item.dirName},分支为:${item.branchList[index - 1]}`
      ls.stdout.on('data' ,(data) => {
        checkGit(data.toString(), errorMsg)
      })
      ls.stderr.on('error' ,(error) => {
        checkGit(error.toString(), errorMsg)
      })
    })
  }
})

说明:

然后我们来看检测错误 checkGit 的方法实现
function checkGit (str, logMsg) {
  if (!(
    ['error', 'failed', 'git rebase --abort', 'git rebase --continue'].every(item => str.indexOf(item) === -1)
  )) {
    fs.writeFileSync(logFile, logMsg)
    process.exit()
  }
}

如果有匹配到错误,记录错误信息(项目和分支名称)。然后退出任务。

好了,到这里,同步代码的工具我们就做好了。到这里就结束了吗?不不不,千万不要这么天真。接下来我们需要让自己的Mac定时为我们执行这个工具,避免因为工作忙而忘记同步

2. 设置Mac的定时任务

Mac的定时任务,我们使用 crontab 来实现。

首先我们来看下 crontab 命令如何使用

2.1 crontab命令基本使用

1. 基本语法 crontab [-u user] {-l | -e | -r}
2. 新建一个内容

通过 crontab -e 命令打开编辑器之后,我们可以通过这种格式来编写自己的任务

* * * * * shell

说明:

以上是 crontab 的基本使用。有兴趣的话,后续我们会专门讲解一次这个命令。

2.2 通过定时任务来执行自动同步

现在我们来设置一个自己的定时任务来执行代码的自动同步

栗子🌰:

// 1. crontab -e 
* 8 * * 1-5 node /Users/username/rebase.js

说明:

此命令为:周一到周五的每天上午8点运行一次这个文件。

接下来就可以坐等每天上午的同步了。一定要及时观察自己的桌面有没有错误文件提示哟~

其实在很长时间之前就有这个想法,自己做一个同步代码的工具。直到那天一个早上切换了6个分支分别获取线上最新代码,搞的焦头烂额。终于,下定了决心,必须得做一个小工具辅助了。于是就有了今天的内容。

好了,整个的工具内容我们就分享完成了。下次再见。

Bye~

上一篇 下一篇

猜你喜欢

热点阅读