Github Action 是 Github 平台提供的开发自动化工具,它可以监听项目的诸多事件,并触发预先设置好的自动化流程,完成构建、测试和部署等任务。理解 Github Action 的核心在于理解它的概念。

Github Action 的文档写得非常好,可以随时查阅。

Workflow

Workflow 是一种可配置的自动化流程,也就是最大的概念。它可以在 .github/workflows/ 中加入 Yaml 格式文件进行配置。每一个 yaml 文件对应一个 workflow 。一个 workflow 对应一组 events 和一组 jobs ,在 events 发生时,就会执行所有的 jobs 。

Event

event 用 on 关键字定义,比如说在 main 分支被 push 或者 pull_request 时,可以表示为:

on:
  push:
    branches:
      - main
  pull_request:

Job

Job 是一组在同一环境下执行的一组步骤 step ,用关键字 jobs 指定 job ,一般只有一个,比如说一个叫 mainjob

jobs:
  main:

所谓的 同一环境 ,具有很多配置选项,比如说执行所在的虚拟机,也被称为 runner ,用关键字 runs-on 进行配置,如 main job 使用 ubuntu

main:
  runs-on: ubuntu-latest

也包括权限配置,用 permisssions 进行配置

permissions:
  id-token: write
  pages: write

还有一些其他配置没有列出。

不同 job 之间默认是没有依赖关系的,是并行运行的。

Step

Step 是具体的步骤,一共有两种类型,一种是利用已有的 action ,另一种是执行 shell 脚本。每个 step 都有一个 name 属性来指定名字。

其实还有一些其他参数,比如说 working-directory 来指定该 step 的工作目录。 if 用于指定该 step 运行的条件。

action 用 use 关键字描述,其后跟 user/action_name@branch 格式的已有 action 。 with 用来指定 action 的参数,如下所示:

- name: Generate org-roam-ui page
  uses: ikoamu/org-roam-ui-hosting@main
  with:
    org-roam-db-filename: org-roam.db
    deploy-to-pages: true
    site-title: Prime Radiant

shell script 用 run 关键字指定,如下所示:

- name: Copy org/img to ui/public/
  working-directory: action
  run: |
    if [ -d "../orgs/${{ inputs.org-roam-directory }}/img" ]; then
      cp -r ../orgs/${{ inputs.org-roam-directory }}/img ../ui/public
    fi
  shell: bash

自定义 action

这个部分我不太熟,我知道 action 的本质是一个 repostory 。里面有一个 action.yml 文件定义 workflow 。