Useful GitHub Action

最近在琢磨定时执行任务,实现对微博热搜榜单的抓取,并实现存档。

最开始以为需要一台服务器,但是我发现了gtihub action这个好东西,对于简单的python任务,最快可以每5min执行一次。

借助github action,我的想法很快落地,项目地址为:Euclid-Jie/weibo_hotlist

GitHub Action

简介

GitHub Actions 文档 - GitHub 文档

repo里的.github/workflows下配置一个.yml文件,github就会提供一个执行环境,按照此.yml中的步骤进行执行,可以设置为定时任务,或者是被某个动作触发执行,例如pushpull request

How to use

其实这个很简单,直接上例子,并配上说明

定期执行python程序

主要流程为在github提供的运行机器上,clone repo -> checkout branch -> run start.sh运行程序抓取数据比写入 -> 使用git提交代码并push

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: 5min定时抓取

on:
workflow_dispatch:
schedule:
- cron: '*/5 * * * *'

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@main
with:
persist-credentials: false
fetch-depth: 0

- name: run start.sh
run: |
pip install pandas
bash ./start.sh

- name: Set timestamp
id: timestamp
run: echo "::set-output name=timestamp::$(date +'%Y-%m-%d %H:%M')"

- name: Git add and commit
run: |
git config --global user.email "ouweijie123@outlook.com"
git config --global user.name "crawer actioner"
git add .
git commit -m "craw_5minly_${{ steps.timestamp.outputs.timestamp }}"

- name: GitHub Push
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.REPO_TOKEN }}
branch: master

以上.yml中需要注意的点有:

  1. cron: '*/5 * * * *'实现了每5min执行一次,但事实上可能比这个频率低,1h运行较为稳定

  2. 其中执行python的是.sh,具体内容为python3 ./weibo_hot_list_serach.py

  3. 使用git需要配置namemail,其中name是必须的

  4. 使用git push时,需要开启action的权限,不然会报错,如图

    image-20231225231602980

  5. 如果这个repo是公开的,secrets.REPO_TOKEN是非必须的

每个月进行存档

主要流程为在github提供的运行机器上,clone repo -> checkout branch -> 将hotlist目录下的.csv文件压缩到archive目录下,并删除原始.csv文件-> 使用git提交代码并push

目的是为了减少repo的空间占用,压缩比率在$15%$左右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: 每月存档

on:
workflow_dispatch:
schedule:
- cron: '0 0 1 * *'

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@main

- name: Create archive directory
run: |
if [ ! -d "archive" ]; then
mkdir archive
fi

- name: Set timestamp
id: timestamp
run: echo "::set-output name=timestamp::$(date +'%Y-%m')"

- name: Create archive
run: tar -czvf "archive/monthly_archive_${{ steps.timestamp.outputs.timestamp }}.tar.gz" hotlist/*.csv

- name: Delete original data
run: rm -rf hotlist/*.csv

- name: Git add and commit
run: |
git config --global user.email "ouweijie123@outlook.com"
git config --global user.name "archiver actioner"
git add .
git commit -m "monthly_archive_${{ steps.timestamp.outputs.timestamp }}"
git push

以上.yml中需要注意的点有:

先看上个例子中的注意事项

  1. cron: '0 0 1 * *'实现了每个月的1号执行一次

  2. 直接进行git push也行,不一定要使用别人的工具