- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
背景
项目源码: github.com/chris-zhu/a…
如果你还在为你的github提交记录担忧,那么这个脚本将可以实现自动化提交。让你的github365天保持常绿。
当然这只是偷懒的做法,还是希望大家能有效的提交代码。
script
原理
通过每天的定时任务去更改文件内容,然后利用ssh的方式提交完成
问题:如何实现自动化的提交呢?
思考
- 提交的前提是文件需要有变化,让
git发现文件的变动更改 git commit使用http链接的方式,会频繁的输入账号密码- 如何实现每天都能自动帮我提交呢
带着以上问题,便开始了我的自动化小工程的道路
文件的读写
为了不干扰项目本身的逻辑和结构,并且能让git知道文件的变动,于是我在项目目录下创建了一个test.txt的无效文件进行变动更改,以至于git的检测.
那么我们每一次commit的时候都需要对该文件进行读写操作, 并输入更改内容进行更新.
/**
* 文件读写 I/O
*/
async function read2write() {
let data = await fs.readFileSync(path.resolve(__dirname, '../test.txt'), {
encoding: 'utf-8'
})
data += `this is my ${count++} commit ---> ${new Date()} \r\n`
await fs.writeFileSync(path.resolve(__dirname, '../test.txt'), data)
}
ssh
当我们git clone项目地址的时候可以看到两种克隆方式,可能最大的区别莫过于https需要每次提交的时候需要输入账户密码进行验证. ssh 的方式 如果配置公钥私钥, 那么就可以很方便的提交.
如何生成ssh密钥可以参考 # Github:添加SSH密钥
那么,当你如果完成了以上准备工作,那么已经完成了一大半.
定时任务提交
当我去了解定时任务,我发现了一个定时任务的库, 其中我选择了toad-scheduler作为开发,该库的功能主要有
- 间隔一定时间执行一次
task - 多个
task管理 - ......
因为比较符合该项目的契机,于是便进行了开发
首先我们创建一个任务调度中心, 我们再创建一个停止任务的函数, 以方便于任务调度的终止
import { ToadScheduler } from 'toad-scheduler'
export const scheduler = new ToadScheduler()
export function stopAll() {
scheduler.stop()
}
中台创建好了, 我们只需要创建task进行调度就可以执行了.
let count = 1 // 记录提交了多少次
const config = {
taskName: 'commit_task', // 任务名称
schedule: { hours: 10, runImmediately: true } // 提交的间隔 周期
}
const task = new AsyncTask(config.taskName, work) // 异步提交任务
export const job = new SimpleIntervalJob(config.schedule, task)
上面的代码我们定义的任务执行的周期, 每10小时执行一次task, task里面做的工作也被封装成了一个work
我们来看看work期间主要做了什么事.
async function work() {
await read2write() // 文件的读写 让git检测文件的变动
await handleGit() // 处理 git 的提交
}
git 提交
handleGit 处理git的一系列流程, 因为我们已经学习zx的使用,那么便可以更好的通过javascript进行git的操作.
/**
* 处理git commit push
*/
async function handleGit() {
await $`git add .`
await $`git commit -m 'This is a meaningless submission at ${count}'`
await $`git pull`
await $`git push`
console.log('done')
}
因为我们创建了 ssh 进行提交, 所以我们这次提交并不会有太大的意外.
总结
当我们把该脚本放入服务器上,那么便彻底实现了自动化提交脚本. 再也不用担心每天忘记commit了.
升华: 脚本只是为我这种偷懒者准备的, 希望大家还是多多提交有效的commit.
项目源码: github.com/chris-zhu/a…