美文网首页
让你的Mac自动同步代码

让你的Mac自动同步代码

作者: yancy_1012 | 来源:发表于2020-10-18 19:05 被阅读0次

    给大家分享一个好玩的小工具 -- 如何让你的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~

    相关文章

      网友评论

          本文标题:让你的Mac自动同步代码

          本文链接:https://www.haomeiwen.com/subject/jyicmktx.html