让你的Mac自动同步代码

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

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

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

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

1. 获取代码功能

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

1.1 依赖模块介绍

  • fs模块:用于日志记录
  • spawn模块:用于执行 shell命令git命令

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

栗子🌰:

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

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

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

  • 项目路径:

    如:/Users/dev/test 项目,我们需要确定它位于 /Users/dev 这个目录下。

  • 日志文件地址

    为了方便查看和提醒,所以我将文件放置在了桌面上。/Users/username/Desktop/代码出现问题-请及时查看.txt

栗子🌰:

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

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

1.3 添加项目和分支

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

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

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

说明:

  • dirName:表示我们的项目文件夹。
  • branchList:表示此项目下的需要同步的分支

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;
      `
}

说明:

  • spawn 的使用和参数含义在之前的项目中有讲过,大家可以自行查看。
  • 通过 getShell 方法来获取到要执行的命令。这里是通过拼接参数的方式来实现。
  • 然后通过 git pull origin master --rebase 来获取到 master 的最新代码。
  • 每个命令之间使用 ; 分隔开。

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

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

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)
      })
    })
  }
})

说明:

  • spawn返回一个子进程对象。可以通过此对象的 stdout, stderr 实现内容的监听
  • 返回的内容 data 和 error 都是 Buffer (二进制)内容。需要通过 toString 来转换为字符串类型来识别。
然后我们来看检测错误 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}
  • crontab -l :列出当前的所有任务
  • crontab -e :通过文字编辑器来编写任务内容。默认编辑器为 vi。可手动设置。
  • crontab -r :清除当前的所有任务
2. 新建一个内容

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

* * * * * shell

说明:

  • 每个星号所代表的含义:从左到右 -- 分钟、小时、日、月、周

  • 为星号时表示每个时间间隔都需要执行一次命令。

  • */n 表示每隔 n 执行一次

    如:*/1 * * * * shell 表示每隔 1 分钟执行一次 shell

  • m-n 表示 m 到 n 这个时间段之内:

    如:* 1-5/2 * * * shell 表示 1 点到 5 点每隔 2 小时执行一次命令

  • m,n 表示且的关系

    如:* 12 * * 1,5 shell 表示周一和周五的上午12点钟执行一次命令

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

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

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

栗子🌰:

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

说明:

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

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

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

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

Bye~

posted @ 2020-10-18 19:07  Sunmus  阅读(118)  评论(0编辑  收藏  举报