注册

github365天保持常绿的“旁门左道”

github365天保持常绿的“旁门左道”.png


目录



  1. 前言
  2. 项目初始化
  3. 自动提交的原理
  4. 编写核心代码
  5. 仓库的设置
  6. 总结

一、前言


作为一名程序员,我们肯定有自己的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仓库中。具体来说,它包含以下步骤:



  1. 设置GitHub Actions的运行时间为每天0点0分
  2. 在Ubuntu操作系统上运行该脚本
  3. 使用Node.js安装所需的依赖项
  4. 运行index.js文件,该文件中定义了从外部API获取一张图片并将其保存到pictures文件夹中的逻辑
  5. 使用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 的主要作用如下:



  1. 存储敏感数据:可以使用 GitHub Secrets 存储敏感数据,例如 API 密钥、数据库凭据、访问令牌等,而不是将它们明文写入代码或配置文件中。
  2. 保护代码安全:通过将敏感数据存储在 Secrets 中,可以避免将其提交到代码库中,从而降低了泄露敏感信息的风险。
  3. 安全访问凭据:在 CI/CD 流程中,可以使用 Secrets 来访问所需的敏感数据。例如,在构建和部署过程中,可以在脚本中使用 Secrets 来进行身份验证,而无需明文写入凭据。
  4. 多环境支持:Secrets 可以在不同的分支或环境中设置不同的值,这样可以轻松管理不同环境所需的不同凭据。
  5. 灵活的权限控制:GitHub Secrets 具有灵活的权限控制机制,可以根据需要对不同角色或团队进行访问限制,以确保敏感数据的安全性。

通俗地讲就是执行工作流的过程中,需要使用一些敏感数据(如个人令牌、服务器账号密码等),不能直接写在文件中,通过key/value的形式配置在 GitHub 中,使用的时候只需要输入key就能找到对应的value,这样就避免了将敏感数据直接暴露在文件中。


配置过程如下:




4.2 开启工作流权限


如果没有开启,执行工作流会报错。


配置如下:




五、编写核心代码


在第三步中提到每日要自动运行index.js文件,这个文件中定义了从外部API获取一张图片并将其保存到pictures文件夹中的逻辑。实现这个逻辑要借助requestpathfs三个依赖包,三个包作用如下:



  • 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获取一张随机生成的图片,并将其保存到本地指定文件夹中。具体来说,它包含以下步骤:



  1. 引入必要的模块:requestpathfs
  2. 生成一个小于10万的随机数字 id
  3. 使用 robohash.org 的API,构造访问地址 url,id作为参数的一部分
  4. 使用 path.resolve() 方法创建 dirPath 文件夹路径,用于存储图片文件
  5. 获取当前日期,并按照年-月-日的格式拼接成字符串 date
  6. 使用 request(url) 发起GET请求,获取图片资源流。可以理解为通过这个 url 去获得一张随机图片。
  7. 将获取到的图片资源流通过 pipe() 方法管道流到 fs.createWriteStream() 中,将其写入到 ${dirPath}/${date}.png 文件中,这样就将获取到的图片保存到了指定的本地文件夹。

最后,每当这段代码执行一次,就会从 robohash.org 获取一张随机的图片,并将其保存到本地的 ${dirPath}/${date}.png 文件中。


此时,项目开发完成,将本地更新推送到远程github仓库即可。


六、总结


本篇文章带大家借助GitHub Actions实现github每日自动提交的功能,项目源码地址如下:


github.com/XC0703/auto…


若不想自己重新开发一份,也可以直接fork我的仓库,这样我每日的自动提交也会同步到你们的仓库中。


最后,感谢您的阅读,如对您有

作者:明远湖之鱼
来源:juejin.cn/post/7253673249159200825
帮助,欢迎点赞收藏。

0 个评论

要回复文章请先登录注册