Github Action
Github Action 是 Github 推出的持续集成工具. 我们可以借用GitHub提供的各种类型的虚拟机,流水线式的完成程序的编译 测试 打包 部署。更重要的是它完 全免费,每个账户每个月可以白嫖2000分钟的使用时长。有了这些免费时长,我们甚至可以不买服务器,使用action就能定时执行一些小任务,比如定时天气推送,签到薅羊毛等等。
基本概念
- workflow (工作流程) : 持续集成一次运行的过程,就是一个 workflow。
- job (任务) : 一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
- step (步骤) : 每个 job 由多个 step 构成,一步步完成。
- action (动作) : 每个 step 可以依次执行一个或多个命令(action)。
workflow 文件
- Github Action 的配置文件称为
workflow
文件, 存放在仓库.github/workflows/
目录中, 且采用YAML
格式编写, 文件名可以任意取, 但是后缀必须统一为.yml
文件 - 个库可以有多个
workflow
文件。GitHub 只要发现.github/workflows
目录里面有.yml
文件,就会自动运行该文件。
workflow 文件的配置字段有很多, 下面进行一些简单的介绍, 详细内容查看官方文档
- name : 这个字段是 workflow 的名称, 默认是当前 workflow 的文件名称
- on : 指定触发 workflow 的条件: 手动触发、定时触发、事件触发、限定分支和标签
on:
workflow_dispatch: # 手动触发
schedule: # 设置为定时 触发为 UTC 时间, UTC23点 对应北京时间早7点
- cron : '00 23 * * *' # 事件表达式
[push, pull_request]: # push事件或pull_request事件都可以触发 (事件数组)
branches: # 只在特定分支/标签上触发
- main # 具体是指 `main` 分支时触发 - jobs : 表示此次 workflow 中需要执行的一项或多项任务, 在 job 字段里面, 需要写出每一项任务的job_id,具体名称自定义。
-
jobs.<job_id>.name
: 用户描述本次任务jobs:
job1:
name: 第一 个任务
job2:
name: 第二个任务 -
jobs.<job_id>needs
: 指定当前任务的依赖关系,即运行顺序。jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]tip在上面的代码中,
job
必须先于job2
完成,而job3
等待job1
和job2
的完成才能运行。因此,这个workflow
的运行顺序依次为:job1->job2->job3
-
jobs.<job_id>.runs-on
: 指定运行所需要的虚拟机环境。它是必填字段。目前可用虚拟机如下:- ubuntu-latest,ubuntu-18.04或ubuntu-16.04
- windows-latest,windows-2019或windows-2016
- macOS-latest或macOS-10.14
runs-on: ubuntu-18.04
-
jobs.<job_id>.steps
: 指定每个 Job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。- jobs.<job_id>.steps.name:步骤名称。
- jobs.<job_id>.steps.run:该步骤运行的命令或者 action。
- jobs.<job_id>.steps.env:该步骤所需的环境变量。
-
jobs:
job1:
name: 第一个任务 # 任务名称
runs-on: ubuntu-latest # 运行环境
steps: # job1 的运行步骤
- name: 第一步
env: # 设置环境变量
username: root
password: root
run: |
echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
job2:
name: 第二个任务
needs: job1
job3:
name: 第三个任务
needs: [job1, job2]
扩展
Actions 市场
Github 做了一个 官方市场 , 可以搜索到他人提交的 actions
每个 action 就是一个独立脚本,因此可以做成代码仓库,使用 userName/repoName
的语法引用 action。比如,actions/setup-node
就表示 github.com/actions/setup-node
这个仓库,它代表一个 action,作用是安装 Node.js。事实上,GitHub 官方的 actions 都放在 github.com/actions 里面。
既然 actions 是代码仓库,当然就有版本的概念,用户可以引用某个具体版本的 action。 下面都是合法的 action 引用,用的就是 Git 的指针概念,详见官方文档。
actions/setup-node@74bc508 # 指向一个 commit
actions/[email protected] # 指向一个标签
actions/setup-node@master # 指向一个分支
如果想要引用他人的 action, 需要使用 uses
参数进行配置, 同时可以看到下面的例子中有一个 with
参数, 这是对应的 action 配置参数
下面是我的 Blog 的 action 配置文件, 尤其关注其中的 uses
和 with
参数即可
name: Deploy Arden Github pages
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@main
with:
persist-credentials: false
- name: Install and Build
run: |
npm install
npm run-script build
- name: Deploy
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
BRANCH: gh-branch
FOLDER: build
BUILD_SCRIPT: npm install && npm run build
secrets 表明该值是从 Repository secrets
中获取的, 需要自行配置, 比如我的如下所示