目标
假定当前项目下有一个 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 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
|
这里有几点需要注意:
首先,很多教程里 git 的名字和邮箱都是直接明文写在了配置文件里,这样其实有隐私泄露的风险。正确的做法应该是将信息写入到仓库的 Setting - Secrets 中并在运行时读取。
如果不想把提交设置为自己,可以配置成:
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-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
|