当前位置: 首页 > Web前端 > HTML

调侃GitHub的Commit贡献图

时间:2023-03-28 17:00:31 HTML

最近在看别人的GitHubCommit贡献图,我也很想拥有。我仔细想了想。这个东西不只是Commit数据,其实也不是那么需要提交的代码,能模拟Commit吗?老实说,有点不道德。但只要我没有道德,你就不能绑架我。先来看看效果吧。连续跑了两周,到现在还没遇到什么问题。PM2运行日志Commit贡献图分为三步。通过fs编辑文件内容。通过child_process执行命令。通过时间表定期执行任务。导入资源和常量定义constschedule=require('node-schedule');constchild_process=require('child_process');constfs=require('fs');constmoment=require('moment');//文件待修改路径constFILE_PATH=`${__dirname}/README.md`;//获取最新时间constnewDate=()=>moment().format('YYYY-MM-DDHH:mm:ss');1.fsread&修改文件commit的前提是保证有文件变化,所以通过fs写文件。consteditFile=()=>{returnnewPromise((resolve,reject)=>{//读取文件fs.readFile(FILE_PATH,'utf-8',(err,data)=>{if(err){reject(err);throwerr;}//定义模板=当前文件内容+新内容consttemp=`${data}-${newDate()}`//执行文件写入fs.writeFile(FILE_PATH,temp,null,err=>err?reject(err):resolve())});})}2.child_process执行完更改文件的命令后,我们需要执行提交代码的三个步骤addcommitpush如何让Nodejs执行命令我们什么?通过child_process子进程模块,会开启一个新的进程来执行一些命令。下面也是一个执行函数的简单封装。/***执行命令*@param{String}script要执行的脚本*@param{Function}callback回调函数*@returns*/constimplementShell=async(shell,callback)=>{callback(`[${newDate()}]${shell}`)returnnewPromise((resolve,reject)=>{try{constsh=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.js之自动发送邮件 | 仅二十行代码即可》里也有提到过。*****┬┬┬┬┬│││││││││││└星期几(0-7)(0or7isSun)│││└────月(1-12)│││└──────────月中的第几天(1-31)││└──────────────────小时(0-23)│└──────────────────────────────────————————分钟(0-59)└────────────────────────────────────────————————————————————————————第二(0-59,可选)6个占位符从左到右分别代表:秒、分、时、日、月、星期*表示通配符,匹配任意,当秒为*时,表示触发任意秒数,其他类推。下面我们来看一下传入参数的含义。每分钟第30秒触发:30*****每小时1分30秒触发:301****每天凌晨1:1:30触发:3011***触发于每周1日1:1:30:3011**1每月1日1:1:30触发:30111**2022年1月1日1:1:30触发:30112022*上面的代码//Executeschedule.scheduleJob('00****',asyncatthe0thminuteofeveryhour()=>{//执行并编辑文件awaiteditFile();//执行脚本//回调函数直接传给console.log执行并打印awaitimplementShell('gitaddREADME.md',console.log)awaitimplementShell('gitcommit-m"feat:automaticpush"',console.log)awaitimplementShell('gitpush-uoriginmain',console.log)});启动服务,在这里执行Node服务。nodeindex.js#pm2pm2startindex.js我直接在linux服务器上运行,连续运行了13天。如果想直接使用,在github上找到我的自动推送仓库,fork一下,然后clone到你的本地,然后运行。GitHub自动推送的前提是你已经配置了GitHubkey~好了,本次分享到此结束。谢谢阅读!