github actions 概览

在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。

# github actions 作用

将编程以外的步骤抽象出来,使可以复用可以共享,如拉代码、打包、部署:

大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。
很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。
如果你需要某个 action,不必自己写复杂的脚本,直接引用他人写好的 action 即可,整个持续集成过程,就变成了一个 actions 的组合。这就是 GitHub Actions 最特别的地方。[1]

# 基本概念

github actions 由以下几个部分构成

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。

  • job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。

  • step(步骤):每个 job 由多个 step 构成,一步步完成。

  • action (动作):每个 step 可以依次执行一个或多个命令(action)。

# github actions 文件组成[1]

文件位置:仓库的.github/workflows目录

文件语法:YAML (opens new window),文件后缀.yml

工具:YAML语法校验可上这个地址 (opens new window)

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。


name: publish learning blog # workflow 名称

on: # 指定触发 workflow 的条件,可以是工作流程存储库中发生的事件、定时、手动、repository_dispatch 事件
  push: # 也可以是事件的数组[push, pull_request],也支持外部事件触发,或者定时运行。
    branches: [main]
  workflow_dispatch:

jobs: # 表示要执行的一项或多项任务
  job1: # job_id,名称自定义
    runs-on: ubuntu-latest # 指定运行所需要的虚拟机环境。【必填】
    name: this job name # 任务说明
    steps:
      - name: Build Gitee Pages
        uses: yanglbme/gitee-pages-action@main
  job2: 
     needs: job1 # needs字段指定当前任务的依赖关系,即运行顺序。
     steps:
      - name: name
        run: # 运行的命令或者action
        env: # 该步骤所需的环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

工作流程触发器是导致工作流程运行的事件。 这些事件可以是[6]:

  • 工作流程存储库中发生的事件
  • 在 GitHub 之外发生并在 GitHub 上触发 repository_dispatch 事件的事件
  • 预定时间
  • 手动

eg: 打印

name: Greeting from Mona
on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
    - name: Print a greeting
      env:
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
        MIDDLE_NAME: The
        LAST_NAME: Octocat
      run: |
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

使用示例:https://github.com/2333Ge/my_actions

# 自定义操作[6]

编写自定义代码来创建操作,以你喜欢的方式与仓库交互,如定时调用第三方api签到、发布npm模块,可以用于共享(仓库必须是public)、用于自己的工作流

以JS actions为例,创建一个可分享的action,新建一个仓库,文件目录结构如下:

.
├── action.yml # 必须这个名字
├── index.js
├── node_modules # 此目录也需要放进仓库
├── package-lock.json
├── package.json
1
2
3
4
5
6

# package.json

两个基础依赖:

"dependencies": {
    "@actions/core": "^1.9.0",
    "@actions/github": "^5.0.3",
}
1
2
3
4

@actions/core: 为工作流命令、输入和输出变量、退出状态和调试消息提供了一个接口. @actions/github: 返回经验证的 Octokit REST 客户端和访问 GitHub Actions 上下文。

# action.yml

action.yml内容

name: "sign in" 
description: "签到"
inputs: # 调用此action需要的参数
  qq-email:
    description: "发送、接受邮件的账号"
    required: false
outputs: # actions 输出
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: "node16" # 指定运行时环境【必须】
  main: "index.js" # 入口代码文件【必须】
1
2
3
4
5
6
7
8
9
10
11
12

# index.js

然后就是index.js的 JS 逻辑,其中可通过下列方式,获取action调用参数:

const core = require("@actions/core");
const qqEmail = core.getInput("qq-email");
1
2

# 综合应用

自定义签到actions:https://github.com/2333Ge/join-in


本文持续更新版收录在此处 (opens new window)

# 相关链接

[1] GitHub Actions 入门教程 -- 阮一峰 (opens new window)

[2] YAML 语言教程 -- 阮一峰 (opens new window)

[3] 官网 (opens new window)

[4] YAML 格式化工具 (opens new window)

[5] 官方文档--自定义操作 (opens new window)

[6] 官方文档--触发工作流程 (opens new window)