使用 node 实现github 自动提交

1,811 阅读3分钟

背景

项目源码: github.com/chris-zhu/a…

如果你还在为你的github提交记录担忧,那么这个脚本将可以实现自动化提交。让你的github365天保持常绿。

image.png

当然这只是偷懒的做法,还是希望大家能有效的提交代码。

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密钥

image.png

那么,当你如果完成了以上准备工作,那么已经完成了一大半.

定时任务提交

当我去了解定时任务,我发现了一个定时任务的库, 其中我选择了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…