利用Github Actions创建定时脚本任务

Published at Reading time 4 minutes

当前有一个需求,需要定时执行一个爬虫脚本,并将爬取到的数据存储到数据库中。正常来说这需要一个服务器来定时执行crontab命令, 但是还有一种白嫖Github Actions的方法,可以省去自行处理服务器的麻烦。

前置准备

首先,如果没有自己的数据库服务器,可以选择使用一些serverless数据库,如planetscalesupabase。然后在相应平台上新建数据后拿到数据库链接信息。 主要包括:

DB_URL='' // 数据库
DB_USER='',
DB_HOST='',
DB_PORT='',
DB_PASSWORD='',

这些信息属于敏感信息,要放到环境变量里。

然后,在Github上新建一个仓库,依次进入 Settings, Secrets and variables, Actions 选项中通过New repository secret 添加这些信息供Github Actions中的环境变量使用。

脚本和actions配置

在本地新建目录,进入目录通过pnpm init (npm或yarn)初始化项目。

node.js脚本

根据自己需要编写node.js脚本,如在根目录下新建 scripts/everyday.js 文件,并编写爬虫和存储代码。为了演示,假设everyday.js中仅为:

console.log('start crawlering')

然后,根目录下新建.github/workflows目录,在该目录下新建everyday.yml的文件,该文件是GitHub Actions的配置文件。该文件的大致内容如下:

name: everday job
on:
schedule:
- cron: '30 0 * * *' // 每天0点30分执行
- cron: '30 12 * * *' // 每天12点30分执行
jobs:
doodle_crawler_console:
runs-on: ubuntu-latest
steps:
- name: prepare
run: echo "script is starting"
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: latest
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install
- name: Execute Script
env:
DB_URL: ${{ secrets.DB_URL }} // 环境变量
DB_USER: ${{ secrets.DB_USER }}
DB_DATABASE: ${{ secrets.DB_DATABASE }}
DB_HOST: ${{ secrets.DB_HOST }}
DB_PORT: ${{ secrets.DB_PORT }}
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
run: node script/everyday.js

其中,定时任务的配置在schedule下面,命令与crontab一致。上述配置表示每天的0点30分和12点30分执行everyday.js脚本。

最后,将代码上传至之前新建的仓库。成功后即能在仓库 Actions 选项查看任务的执行日志了。

注意事项

  • 任务是否能按指定时间准时执行?

    不一定,Gihub官方解释称因为服务器成本问题,定时任务有可能会排队。如果对时间要求比较高,推荐自建服务器或其他专业的定时服务。

Category: TechTags: Github Actions