GitHub Actions

45 阅读3分钟

1. 什么是 GitHub Actions?

GitHub Actions 是 GitHub 提供的一项功能,旨在帮助开发者自动化、定制和执行软件开发工作流。它集成在 GitHub 平台内,可以在代码库中直接配置和运行。通过 GitHub Actions,开发者可以在代码提交、拉取请求、发布等事件发生时自动触发一系列任务,从而提高开发效率和代码质量。

2. GitHub Actions 的核心概念

  • 工作流(Workflow):一个工作流是一个可配置的自动化过程,由一个或多个任务(Job)组成。工作流通常定义在代码库的 .github/workflows 目录下的 YAML 文件中。
  • 任务(Job):一个任务是一个独立的运行单元,包含一系列步骤(Step)。任务可以并行或串行执行。
  • 步骤(Step):步骤是任务中的最小执行单元,可以是运行命令或调用预定义的动作(Action)。
  • 动作(Action):动作是可重用的代码单元,用于完成特定的任务。GitHub 提供了许多内置的动作,开发者也可以创建自定义动作。
  • Runner:Runner 是执行工作流的计算环境。GitHub 提供了托管 Runner,开发者也可以使用自托管 Runner。

3. 创建和管理工作流

要创建一个新的工作流,可以在代码库的 .github/workflows 目录下创建一个 YAML 文件。例如,创建一个名为 ci.yml 的文件:

name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'
    - name: Install dependencies
      run: npm install
    - name: Run tests
      run: npm test

上述工作流将在每次代码推送或拉取请求时触发,执行以下任务:

  1. 检出代码库。
  2. 设置 Node.js 环境。
  3. 安装依赖。
  4. 运行测试。

4. 工作流语法详解

GitHub Actions 的工作流语法基于 YAML,主要包括以下几个部分:

  • 名称(name):工作流的名称,用于标识和管理工作流。
  • 触发器(on):定义工作流的触发条件,如 pushpull_requestschedule 等。
  • 任务(jobs):定义工作流中的任务,每个任务包含运行环境(runs-on)和步骤(steps)。
  • 步骤(steps):任务中的具体执行步骤,可以是运行命令(run)或调用动作(uses)。

5. 使用 GitHub 提供的 Runner

GitHub 提供了多种托管 Runner 环境,包括 Ubuntu、Windows 和 macOS。开发者可以在工作流中指定运行环境:

jobs:
  build:
    runs-on: ubuntu-latest

也可以使用自托管 Runner 来运行工作流:

jobs:
  build:
    runs-on: self-hosted

6. 触发器和事件

GitHub Actions 支持多种事件触发工作流,包括但不限于:

  • push:代码推送到仓库时触发。
  • pull_request:创建或更新拉取请求时触发。
  • schedule:定时触发工作流。
  • workflow_dispatch:手动触发工作流。

示例:

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  schedule:
    - cron: '0 0 * * *'

7. 安全性和权限管理

GitHub Actions 提供了多种安全性和权限管理机制,包括:

  • 机密管理:可以在仓库设置中添加机密(Secrets),并在工作流中使用。
  • 权限控制:可以通过 permissions 字段控制工作流的权限。

示例:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Use secret
      run: echo ${{ secrets.MY_SECRET }}