关于前端:将-GitHub-的-Commit-贡献图玩出花

50次阅读

共计 2420 个字符,预计需要花费 7 分钟才能阅读完成。

最近看着他人的 GitHub Commit 奉献图,我也很想领有,

我认真想了想,这玩意不就是 Commit 的的数据而已,然而确实没那么多须要提交的代码,我模仿 Commit 不就行了吗?

说实话,有点不道德。但只有我没有道德,你们就绑架不了我。

先看成果

我曾经间断运行两周的工夫了,目前没有遇到什么问题

PM2 运行日志

Commit 奉献图

一共分三步

  1. 通过 fs 编辑文件内容
  2. 通过 child_process 执行命令
  3. 通过 schedule 定时执行工作

引入资源和常量定义

const schedule = require('node-schedule');
const child_process = require('child_process');
const fs = require('fs');
const moment = require('moment');
// 须要批改的文件门路
const FILE_PATH = `${__dirname}/README.md`;
// 获取最新的工夫
const newDate = () => moment().format('YYYY-MM-DD HH:mm:ss');

1. fs 读取 & 批改文件

commit 的前提就是须要保障有文件改变,所以通过 fs 去写入文件。

const editFile = () => {return new Promise((resolve, reject) => {
        // 读取文件
        fs.readFile(FILE_PATH, 'utf-8', (err, data) => {if (err) {reject(err);
                throw err;
            }
            // 定义模板 = 文件以后的内容 + 新的内容
            const temp = `${data}
- ${newDate()}
` 
            // 执行文件写入
            fs.writeFile(FILE_PATH, temp, null, err => err ? reject(err) : resolve())
        });
    })
}

2. child_process 执行命令

改变文件之后,咱们须要执行 提交代码 三步曲

  • add
  • commit
  • push

怎么让 Nodejs 去帮咱们执行命令呢?

通过 child_process 子过程模块,它会新开一个过程去执行一些命令。

上面也是简略的封装了一个执行函数。

/**
 * 执行命令
 * @param {String} script 须要执行的脚本
 * @param {Function} callback 回调函数
 * @returns 
 */
const implementShell = async (shell, callback) => {callback(`[${newDate()}] ${shell}`)
    return new Promise((resolve, reject) => {
        try {const sh = child_process.exec(`cd ${__dirname} && ${shell}`, (error, stdout, stderr) => {if (error) {reject(error);
                    callback(`[${newDate()}] ${error}`)
                }
                resolve()});
            sh.stdout.on('data', (data) => {callback(`[${newDate()}] ${data}`)
            })
            sh.stderr.on('data', (error) => {callback(`[${newDate()}] ${error}`)
            })
        } catch (error) {callback(`[${newDate()}] ${error}`)
            reject(error)
        }
    })
}

3. schedule 执行工作

schedule 会保障咱们的 node 服务不会间接敞开。
而是像一个定时调用一样,帮你监听工夫,去触发回调函数。

这个我在之前的 《Node.js 之主动发送邮件 | 仅二十行代码即可》 下面也有讲过。

* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)

6 个占位符从左到右别离代表:秒、分、时、日、月、周几

* 示意通配符,匹配任意,当秒是 * 时,示意任意秒数都触发,其它类推

上面能够看看以下传入参数别离代表的意思

每分钟的第 30 秒触发:30 * * * * *

每小时的 1 分 30 秒触发:30 1 * * * *

每天的凌晨 1 点 1 分 30 秒触发:30 1 1 * * *

每周 1 的 1 点 1 分 30 秒触发:30 1 1 * * 1

每月的 1 日 1 点 1 分 30 秒触发:30 1 1 1 * *

2022 年的 1 月 1 日 1 点 1 分 30 秒触发:30 1 1 1 2022 *

上代码

// 每小时的第 0 分执行
schedule.scheduleJob('0 0 * * * *', async () => {
    // 执行编辑文件
    await editFile();
    // 执行脚本
    // 回调函数间接传入 console.log 去执行打印
    await implementShell('git add README.md', console.log)
    await implementShell('git commit -m"feat: 主动推送 "', console.log)
    await implementShell('git push -u origin main', console.log)
});

启动服务

到这里执行运行 Node 服务就好了。

node index.js
# PM2
pm2 start index.js

我这里是间接运行在 Linux 服务器

目前间断运行时 13 天

如果你想间接应用

GitHub 找到我的 auto-push 仓库 fork 一下

而后进行 Clone 到你本地再运行即可

GitHub auto-push

前提是你配置好 Github 的密钥~

好了,本次分享到此为止。感激浏览!

正文完
 0