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