让你的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~