Skip to main content

Github Action

Github Action 是 Github 推出的持续集成工具. 我们可以借用GitHub提供的各种类型的虚拟机,流水线式的完成程序的编译 测试 打包 部署。更重要的是它完全免费,每个账户每个月可以白嫖2000分钟的使用时长。有了这些免费时长,我们甚至可以不买服务器,使用action就能定时执行一些小任务,比如定时天气推送,签到薅羊毛等等。

基本概念

  • workflow (工作流程) : 持续集成一次运行的过程,就是一个 workflow。
  • job (任务) : 一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  • step (步骤) : 每个 job 由多个 step 构成,一步步完成。
  • action (动作) : 每个 step 可以依次执行一个或多个命令(action)。

workflow 文件

tip
  • Github Action 的配置文件称为 workflow 文件, 存放在仓库 .github/workflows/ 目录中, 且采用 YAML 格式编写, 文件名可以任意取, 但是后缀必须统一为 .yml 文件
  • 个库可以有多个 workflow 文件。GitHub 只要发现 .github/workflows 目录里面有 .yml 文件,就会自动运行该文件。

workflow 文件的配置字段有很多, 下面进行一些简单的介绍, 详细内容查看官方文档

  1. name : 这个字段是 workflow 的名称, 默认是当前 workflow 的文件名称
  2. on : 指定触发 workflow 的条件: 手动触发、定时触发、事件触发、限定分支和标签
    on:
    workflow_dispatch: # 手动触发

    schedule: # 设置为定时触发为 UTC 时间, UTC23点 对应北京时间早7点
    - cron : '00 23 * * *' # 事件表达式

    [push, pull_request]: # push事件或pull_request事件都可以触发 (事件数组)
    branches: # 只在特定分支/标签上触发
    - main # 具体是指 `main` 分支时触发
  3. jobs : 表示此次 workflow 中需要执行的一项或多项任务, 在 job 字段里面, 需要写出每一项任务的job_id,具体名称自定义。
    1. jobs.<job_id>.name : 用户描述本次任务

      jobs:
      job1:
      name: 第一个任务
      job2:
      name: 第二个任务
    2. jobs.<job_id>needs : 指定当前任务的依赖关系,即运行顺序。

      jobs:
      job1:
      job2:
      needs: job1
      job3:
      needs: [job1, job2]
      tip

      在上面的代码中, job 必须先于 job2 完成,而 job3 等待 job1job2 的完成才能运行。因此,这个 workflow 的运行顺序依次为:job1->job2->job3

    3. 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
    4. jobs.<job_id>.steps : 指定每个 Job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。

      - jobs.<job_id>.steps.name:步骤名称。
      - jobs.<job_id>.steps.run:该步骤运行的命令或者 action。
      - jobs.<job_id>.steps.env:该步骤所需的环境变量。
workflow 文件的范例
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

20240529222735

每个 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 配置文件, 尤其关注其中的 useswith 参数即可

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 介绍

secrets 表明该值是从 Repository secrets 中获取的, 需要自行配置, 比如我的如下所示

20240529224131

参考