github365天保持常绿的“旁门左道”
目录
- 前言
- 项目初始化
- 自动提交的原理
- 编写核心代码
- 仓库的设置
- 总结
一、前言
作为一名程序员,我们肯定有自己的github账号,在github个人主页会展示你最近十二个月的提交情况,用绿色的深浅表示你当日提交次数的多少。如果你将个人的github主页链接放在简历上,面试官在面试时便可能会点进去,首先映入眼帘的便是这提交次数展示区域。但学生党平时要忙于个人的学业、社畜党要忙于自己的工作,几乎没有多少时间来做自己的项目、建设自己的github仓库,这样则可能会导致这片区域是空白的,像下面一样:
如果这片区域是空白的或者近十二个月只有零零散散的提交记录,说明个人github的活跃度不够,进而说明对技术探索学习的积极性也不够,这会给面试官留下不好的印象。
如果你在为你的github提交记录担忧,那么就可阅读本篇文章。本篇文章带大家借助GitHub Actions实现github每日自动提交,让你的github365天保持常绿,像下面这样:
当然这只是偷懒的做法,正如文章标题所说的“旁门左道”,可供娱乐和学习,但还是希望大家能有效的提交代码,这样才是真正巩固和学习技术的有效途径。
二、项目初始化
首先在自己的github上创建一个名为autocommit-robot的仓库,然后git clone 项目地址到本地打开即可,此处不赘述。
在项目根目录下执行npm init命令(根据自己实际需要进行配置,否则一直按回车键用默认配置即可)进行npm初始化。同时发现此时项目并没有.gitignore文件,可在项目根目录下新建一个.gitignore文件,配置按下面来即可:
.DS_Store
.vite-ssg-dist
.vite-ssg-temp
*.local
dist
dist-ssr
node_modules
.idea/
*.log
至此,项目的初始化工作便已完成,项目的目录如下所示:
三、自动提交的原理
本文章介绍的github自动提交功能是借助GitHub Actions实现的,Github Actions是最近几年新加进来的功能,可以用于给项目做CI/CD。原先你如果有这个需求,可能要借助Travis等三方网站。新建目录和配置文件 Github Actions使用yml格式做配置。首先要在你的项目中建立一下目录:.github/workflows/在workflows目录中新增yaml配置文件,文件名任意。通过目录名可以看出Github将此类任务称为“工作流”。其它关于Github Actions的基础使用,可看这篇文章:【白嫖Github Action做定时任务】。下面是我的.github\workflows\robot.yml内容:
name: autocommit-robot
on:
schedule:
- cron: "0 0 * * *"
jobs:
bots:
runs-on: ubuntu-latest
steps:
- name: "Checkout code"
uses: actions/checkout@v1
- name: "Set node"
uses: actions/setup-node@v1
with:
node-version: 16.x
- name: "Install"
run: npm install
- name: "Run bash"
run: node index.js
- name: "Commit"
uses: EndBug/add-and-commit@v4
with:
author_name: XC0703
author_email: example@qq.com
message: "feat: save robot"
add: "pictures/*"
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
上面这段内容定义了一个名为autocommit-robot的github工作流,其作用是每天自动将一张图片添加到Git仓库中。具体来说,它包含以下步骤:
- 设置GitHub Actions的运行时间为每天0点0分
- 在Ubuntu操作系统上运行该脚本
- 使用Node.js安装所需的依赖项
- 运行
index.js文件,该文件中定义了从外部API获取一张图片并将其保存到pictures文件夹中的逻辑 - 使用
add-and-commit操作自动将新添加的图片提交到Git仓库,并指定提交信息为feat: save robot
总的来说,这个脚本是一段自动化流程,能够帮助我们实现每天自动将一张图片添加到Git仓库并提交的功能。
注意:GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}为仓库范围的访问令牌,按照上面链接文章中所讲的步骤去申请一个个人令牌,然后将个人令牌的值存储在GitHub Secrets中(下面会讲怎么设置这个令牌)。这里后面的那个ACCESS_TOKEN为笔者自己的token名称,根据自己的实际情况进行替换,不要照搬。
四、仓库的设置
4.1 配置 GitHub Secrets
GitHub Secrets是 GitHub 提供的一种功能,用于存储和管理敏感数据、密钥和凭据。它们可用于在 GitHub Actions 或其他 CI/CD(持续集成/持续部署)流程中安全地访问这些敏感信息。
GitHub Secrets 的主要作用如下:
- 存储敏感数据:可以使用
GitHub Secrets存储敏感数据,例如 API 密钥、数据库凭据、访问令牌等,而不是将它们明文写入代码或配置文件中。 - 保护代码安全:通过将敏感数据存储在
Secrets中,可以避免将其提交到代码库中,从而降低了泄露敏感信息的风险。 - 安全访问凭据:在
CI/CD流程中,可以使用Secrets来访问所需的敏感数据。例如,在构建和部署过程中,可以在脚本中使用Secrets来进行身份验证,而无需明文写入凭据。 - 多环境支持:
Secrets可以在不同的分支或环境中设置不同的值,这样可以轻松管理不同环境所需的不同凭据。 - 灵活的权限控制:
GitHub Secrets具有灵活的权限控制机制,可以根据需要对不同角色或团队进行访问限制,以确保敏感数据的安全性。
通俗地讲就是执行工作流的过程中,需要使用一些敏感数据(如个人令牌、服务器账号密码等),不能直接写在文件中,通过key/value的形式配置在 GitHub 中,使用的时候只需要输入key就能找到对应的value,这样就避免了将敏感数据直接暴露在文件中。
配置过程如下:
4.2 开启工作流权限
如果没有开启,执行工作流会报错。
配置如下:
五、编写核心代码
在第三步中提到每日要自动运行index.js文件,这个文件中定义了从外部API获取一张图片并将其保存到pictures文件夹中的逻辑。实现这个逻辑要借助request、path和fs三个依赖包,三个包作用如下:
request 模块用于向指定 URL 发送 HTTP 请求,并获取响应结果。它提供了对常见的 HTTP 动词(如 GET、POST 等)以及请求头、响应头等信息的控制。在这里,request 模块用于从Robohash API获取一张随机图片,将其作为响应结果返回。path 模块提供了用于处理文件路径的相关方法,例如path.resolve()用于将多个路径拼接成一个绝对路径,path.dirname()用于获取一个路径的目录名部分,path.extname()用于获取文件扩展名等。在这里,path 模块的path.resolve()方法被用于生成绝对路径,path.join()方法可以将多个参数拼接成一个路径字符串。fs 模块则提供了文件系统相关的操作方法,例如读写文件、创建文件夹、删除文件等。在这里,fs 模块的fs.createWriteStream()方法被用于创建可写流,将获取到的图片流写入到本地文件中。
npm install request path fs
index.js文件如下:
const request = require("request");
const path = require("path");
const fs = require("fs");
const id = (~~(Math.random() * 100000)).toString(); // 获取小于10w的数字
const url = `https://robohash.org/${id}`;
const dirPath = path.resolve(__dirname, "pictures");
// 这一步的处理,因为github获取的时间时区是美国时区,所以获取到的时间格式是6/16/2023,我们可以先split后将年份放到数组第一位,这样就是需要的文件名格式了
const dateArr = new Date().toLocaleDateString().split("/"); // 本地调试时用.toLocaleDateString("en")
dateArr.unshift(dateArr.pop());
const date = dateArr.join("-");
request(url).pipe(fs.createWriteStream(`${dirPath}/${date}.png`));
这段代码主要实现了从Robohash API获取一张随机生成的图片,并将其保存到本地指定文件夹中。具体来说,它包含以下步骤:
- 引入必要的模块:
request、path和fs - 生成一个小于10万的随机数字 id
- 使用
robohash.org的API,构造访问地址 url,id作为参数的一部分 - 使用
path.resolve()方法创建dirPath文件夹路径,用于存储图片文件 - 获取当前日期,并按照
年-月-日的格式拼接成字符串 date - 使用
request(url)发起GET请求,获取图片资源流。可以理解为通过这个 url 去获得一张随机图片。 - 将获取到的图片资源流通过
pipe()方法管道流到fs.createWriteStream()中,将其写入到${dirPath}/${date}.png文件中,这样就将获取到的图片保存到了指定的本地文件夹。
最后,每当这段代码执行一次,就会从 robohash.org 获取一张随机的图片,并将其保存到本地的 ${dirPath}/${date}.png 文件中。
此时,项目开发完成,将本地更新推送到远程github仓库即可。
六、总结
本篇文章带大家借助GitHub Actions实现github每日自动提交的功能,项目源码地址如下:
若不想自己重新开发一份,也可以直接fork我的仓库,这样我每日的自动提交也会同步到你们的仓库中。
最后,感谢您的阅读,如对您有
来源:juejin.cn/post/7253673249159200825