Github Actions - ziliantech-org/doc-zilian-wiki GitHub Wiki

By yufeng97

基础概念

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

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

workflow文件

GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的 .github/workflows 目录。workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml,不能是.yaml

一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。

workflow 文件的配置字段非常多,详见官方文档。下面是一些基本字段。

on

on字段指定 work­flow 的触发条件,通常是某些事件,比如示例中的触发事件是 ,即在代码 push 到仓库后被触发。字段也可以是事件的数组,多种事件触发,比如在 push 或 pull request 时触发:

on: [push, pull_request]

push触发指定分支

on:
  push:
    branches:
      - main

jobs

workflow 文件的主体是 jobs 字段,表示要执行的一项或多项任务。 jobs字段里面,需要写出每一项任务的job_id,具体名称自定义。job_id里面的name字段是任务的说明。

jobs:   
    my_first_job:     
        name: My first job   
    my_second_job:     
        name: My second job

runs-on

runs-on 字段指定运行所需要的虚拟机环境。它是必填字段。目前可用的虚拟机如下。

  • ubuntu-latest (ubuntu-20.04),ubuntu-18.04或ubuntu-16.04
  • windows-latest,windows-2019或windows-2016
  • macOS-latest或macOS-10.14

下面代码指定虚拟机环境为ubuntu-18.04。

runs-on: 
    ubuntu-18.04

steps

steps 字段指定每个任务的运行步骤,可以包含一个或多个步骤。步骤开头使用 - 符号。每个步骤可以指定以下字段:

  • name:步骤名称。
  • uses:该步骤引用的action或 Docker 镜像。
  • run:该步骤运行的 bash 命令。
  • env:该步骤所需的环境变量。 其中 usesrun 是必填字段,每个步骤只能有其一。同样名称也是可以忽略的。

action

action 是 GitHub Ac­tions 中的重要组成部分,这点从名称中就可以看出,actions 是 action 的复数形式。它是已经编写好的步骤脚本,存放在 GitHub 仓库中。

对于初学者来说可以直接引用其它开发者已经写好的 action,可以在官方 action 仓库或者 https://github.com/marketplace?type=actions&query= 去获取。

既然 action 是代码仓库,当然就有版本的概念。引用某个具体版本的 action:

steps:
  - uses: actions/setup-node@74bc508 # 指定一个 commit
  - uses: actions/[email protected]    # 指定一个 tag
  - uses: actions/setup-node@master  # 指定一个分支

常用的actions

  • actions/checkout@v2
  • actions/setup-python@v3
  • actions/setup-node@v3
  • actions/cache@v2

示例

name: Build & deploy react-demo-with-github-actions

on:
  push:
    branches: [main]

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest

    steps:
      # 拉取代码
      - name: Checkout code
        uses: actions/checkout@v3
      # 使用缓存  
      - uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node

      - name: Install packages with npm
        run: npm install && npm run build

      - name: Build and deploy with gh-pages
        uses: JamesIves/github-pages-deploy-action@releases/v3
        with:
          ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          branch: gh-pages # The branch the action should deploy to.
          folder: build # The folder the action should deploy.

Reference