「本文已参与低调务实优秀中国好青年前端社群的写作活动」
标题党!!!各位不要误会哈哈哈哈哈哈哈哈哈!!!
内容是Github Actions实现定时任务,以下是正文
偶然一天,看antfu的github可以做到每日都保持着提交,我就去探查其中的奥妙,发现他弄了一个定时任务,在每天8点的时候更新Sponsors(不过他确实每天都有commit),仓库链接
于是我就想,我能不能也自己做个定时任务,令我的contributions也保持常绿
工程构想
我可以实现一个工程,用于保存一些想要的图片,并且可以在每天的某个时刻自动提交到我的代码仓库中,这样的提交动作就可以令当天的contributions变绿
图片内容
我们可以从robohash中获取到我们想要的图片,以下是robohash官网的介绍:
Robohash is a easy web service that makes it easy to provide unique, robot/alien/monster/whatever images for any text. Put in any text, such as IP address, email, filename, userid, or whatever else you like, and get back a pretty image for your site.
从介绍中可以看到,我们可以通过传入text来生成独一无二的robot图片,比如以下几个
也就是说,我们可以根据传入的不同路径来生成不同的图片,这样就能在每天的定时任务中根据不同的路径获取到新的图片,并存到仓库中
github actions
github actions是Github提供的持续集成服务(Continuous integration/CI),具备自动化完成许多不同任务的能力,比如构建、测试或部署等
如果你有的工程需要部署到服务器,按照以往的步骤应该是:
- 拉取代码,
git clone xxx - 安装依赖,
npm install - 代码开发,
coding - 打包工程,
npm run build - 将打包的工程
dist拷贝到服务器 - 配置nginx指向
dist路径 - 重启nginx,
nginx reload
使用github actions,我们就监听代码的push过程,当发生push动作的时候,actions就自动启动进行上述步骤将新的打包目录发到服务器中,这样我们仅需要将代码提交,就能完成自动化部署,这篇文不讲述自动化部署的内容,如有需要可以找其他文
工程构建
在github中创建一个仓库robot,并且clone到本地
主任务代码
在工程中,创建文件main.js,用于执行主任务,创建目录pic,用于存放图片
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, "pic");
// 这一步的处理,因为github获取的时间时区是美国时区,所以获取到的时间格式是5/28/2022,我们可以先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`));
如果request库引用失败,可以先执行pnpm add request安装依赖,别忘了先初始化工程pnpm init
在本地控制台执行node main.js,就能获取到图片并保存到本地目录pic中
actions相关配置
在工程中创建目录.github,在.github目录下创建目录workflows,workflows下的yml文件,就是actions的相关配置文件,也叫workflow文件
github actions有一些自己的术语:
- workflow: 工作流程,持续集成一次运行的过程,就是一个workflow
- job:任务,一个workflow由一个或多个jobs构成,含义是一次持续集成的运行,可以完成多个任务
- step:步骤,每个job由多个step构成,一步步完成
- action:动作,每个step可以依次执行一个或多个命令
在workflows目录下创建robot.yml文件,github发现工程中含有.github/workflows目录下有yml文件,就会自动执行该文件
workflow文件有很多配置字段,可以看官方文档,这里我只讲解我用到的字段
- name:workflow文件的名称,这个名称会出现在
Actions页的Workflows列,如果没有name,就会用当前yml文件名作为name - on:触发workflow的条件,比如我这次用的是
schedule用于定时任务,也可以用push用于在提交代码的时候执行,完整的触发事件可以看官方文档 - jobs:该字段就能写workflow执行的任务,后面跟任务的名称,比如
这样就表示该workflow文件下有两个任务,分别是jobs: task1: xxx task2: xxxtask1和task2,注意,下面的字段介绍用[task-name]表示任务名称需要你替换成你真正的任务名称- jobs.[task-name].run-on:指定运行所需要的虚拟机环境,必填字段,我这里指定为
ubuntu-latest表示最新的ubuntu环境 - jobs.[task-name].steps:指定每个job的执行步骤,比如我以下的步骤:
- Checkout code:获取代码
- Set node:指定运行的node版本
- Install:安装依赖
- Run bash:运行主任务
- Commit:使用
EndBug/add-and-commit插件提交代码,with后的是commit的内容- env:注入需要的环境变量,这里需要加上
GITHUB_TOKEN才能进行commit操作,后面会讲解怎么添加环境变量
- env:注入需要的环境变量,这里需要加上
- jobs.[task-name].run-on:指定运行所需要的虚拟机环境,必填字段,我这里指定为
完整的配置
name: automatic-save-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: npx pnpm i
- name: "Run bash"
run: node main.js
- name: "Commit"
uses: EndBug/add-and-commit@v4
with:
message: "chroe: save robot"
add: "pic/*"
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
添加环境变量
可以看到在Commit步骤需要添加GITHUB_TOKEN才能完成提交动作,按照以下的步骤进行:
- 在github主页点击头像,下拉菜单选择
Setting Setting页的左侧菜单,选择Developer settingsDeveloper settings页中选择Personal access tokens,在这里点击Generate new token来生成token,将生成的token复制- 回到你的工程页,选择工程页的
Setting,选择左侧菜单的Secrets-Actions,点击New repository secret创建环境变量 - 注意,这个环境变量的命名是在配置中写的命名,比如我的环境变量名叫
ACCESS_TOKEN - 在配置中使用环境变量格式是:
${{ secrets.ACCESS_TOKEN }}
结果检验
将上述的步骤都提交之后,就能每天蹲点你定的时间来看是否有触发定时任务,比如我定的时间是cron: "0 0 * * *",GitHub的时间是GMT时间,国内的北京时间是GMT+8,也就是中国会比Github的服务器快8个小时,所以是每天的早上8点执行定时任务
每天的定时任务都会在
Actions页中展示,点击每个workflow可以看到具体的执行步骤
可以看到,我的
jobs名叫bots,点击bots能看到每个job的执行步骤
可以看到,在
bots下的每个step都会展示在界面中,并且右侧能看到具体的执行时间,点击每个step左侧的小箭头还能看到具体的执行步骤过程
如果你是使用vscode开发,也可以安装插件Github Actions,能在左侧菜单就能看到actions的执行记录