Github Action 简单实践

目标

假定当前项目下有一个 script.py 爬虫脚本,我们想要定期执行这个 Python 爬虫,并将运行结果(JSON 文件)推送回仓库。

编写

首先需要在项目的根目录下创建 .github/workflows 文件夹,并且在文件夹下创建 YAML 文件用于编写执行脚本,如 action.yml

名称

首先先要给整个工作流程设置一个名称:

1
name: action workflow practice

触发条件

接着设定该 Github Action 要在什么时候触发。我需要这个爬虫脚本每天 12 点自动运行,于是:

1
2
3
on:
schedule:
- cron: '0 4 * * *'

这里要注意的是时区问题,cron 用的是 UTC 时间,所以我们通常需要用北京时间减 8 小时。

触发条件还有许多种,例如推送时运行 push: 等。

环境变量

这里设定环境变量是因为接下去需要用到本地时间的设定。

1
2
env:
TZ: Asia/Shanghai

工作指令

接下去就要正式设定整个工作流程的具体命令了。格式如下:

1
2
3
4
5
jobs:
job1:
...
job2:
...

jobs 下可以包含一个或多个任务,任务之间可以顺序的执行,也可以同时执行。这里我只需要执行一个任务即可。

运行环境

在单个任务中,首先需要设置的是虚拟的运行环境,如:

1
2
job1:
runs-on: ubuntu-18.04

步骤

接下来就要设置每个步骤的指令,首先要 checkout the repository under $GITHUB_WORKSPACE :

1
2
3
steps:
- name: Checkout
uses: actions/checkout@v2

因为是 Python 爬虫,所以需要安装对应的依赖:

1
2
3
4
5
6
7
8
9
10
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.7
- name: Install requirements
run: |
python3 -m pip install --upgrade pip
pip3 install -r ./requirements.txt
- name: Running
run: python3 ./script.py

最后,需要把生成的文件提交回仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- name: Commit
env:
GIT_NAME: ${{ secrets.GIT_NAME }}
GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
run: |
git config --local user.name $GIT_NAME
git config --local user.email $GIT_EMAIL
git add .
git commit -m "Github action update at `date '+%Y-%m-%d %H:%M:%S'`."
- name: Push
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: master

这里有几点需要注意:

  1. 首先,很多教程里 git 的名字和邮箱都是直接明文写在了配置文件里,这样其实有隐私泄露的风险。正确的做法应该是将信息写入到仓库的 Setting - Secrets 中并在运行时读取。

  2. 如果不想把提交设置为自己,可以配置成:

    1
    2
    GIT_NAME: GitHub Actions[Bot]
    GIT_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com

完整的配置代码

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
39
40
41
42
name: Action Practice

on:
push:
schedule:
- cron: '0 0 * * *'

env:
TZ: Asia/Shanghai

jobs:
# a single job
a-job-name:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Python3
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install requirements
run: |
python3 -m pip install --upgrade pip
pip3 install -r ./requirements.txt
- name: Run
run: python3 ./script.py
- name: Commit
env:
GIT_NAME: ${{ secrets.GIT_NAME }}
GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
run: |
git config --local user.name $GIT_NAME
git config --local user.email $GIT_EMAIL
git add .
git commit -m "Github action update at `date '+%Y-%m-%d %H:%M:%S'`."
- name: Push
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: master