Skip to main content

GitHub Actions 快速手册

•1 min•80 words

github-actions - head

简单理解

github仓库读取到action配置文件之后,首先注册事件处理。对应事件触发会执行对应的工作流,工作流定义了很多jobs,以及环境、权限。jobs中是具体的命令,包括在哪些执行,用什么执行,执行的结果处理。以及执行的内容:由步骤与执行动作构成。

事件驱动模型

事件驱动模型:CI/CD的核心

通过维护事件流,将对应事件的处理方法绑定,等待事件自动触发执行。

可以在配置文件中,详细指明触发事件的特征:

  • 代码事件:如 push(代码推送)、pull_request(拉取请求)。

    • 可配置项:可以指定分支(如 branches: [main])、路径(如 paths: ['src/**']),甚至 PR 的活动类型(如 types: [opened, synchronize])。
  • 定时事件:通过 schedule 关键词和 Cron 语法,实现定时执行,例如每周一凌晨2点。

  • 手动事件:使用 workflow_dispatch,允许你通过 GitHub 的 Actions 标签页手动点击按钮来触发工作流。

  • 其他事件:响应如 release(发布)、issue_comment(Issue评论)等多种 GitHub 活动。

工作流

工作流:事件触发后的处理方法

一个事件触发那么对应一个工作流的执行。工作流负责具体要执行的操作定义。

工作流 (Workflow) 配置 - 紫色节点。工作流中主要负责的是整个环境的配置。

  • 环境变量
  • 权限控制
  • 名称定义

而更具体的操作模块化为 job 任务。

gitub提供了secrets存储功能,我们上传密钥与字段配置,然后就能在工作流中用上。

可以添加两种,Repository Secrets 作用于整个代码仓库,而 Environment Secrets 则与特定的“环境”(如 dev, staging, production)绑定,提供了更高级的保护。

Job任务

Job任务:定义一个任务的需要与贡献

内部具体的执行同样不重要,先关注任务本身的执行。任务所需的条件,任务完成后的成果的标准。使得任务能在工作流中与其他任务协作。

  • runs-on:指定作业运行在哪种运行器(Runner) 上。

  • needs:定义作业间的依赖关系。例如,build 作业 needs: test 表示它必须等 test 作业成功后才会运行。

  • strategy:使用矩阵策略(Matrix Strategy),让你可以在多个环境(如不同 Node.js 版本、不同操作系统)下并行测试。

  • outputs:定义作业的输出,可以被后续依赖它的作业使用。

运行器:为了满足各种job的运行需要,我们需要不同的运行器容器

通常可以使用Github提供的托管,ubuntu-latest、windows-latest 或 macos-latest 等预定义环境。
或者我们可以提供自己机器的连接、调用方式作为运行器。

步骤与动作

步骤与动作:一段命令、或者预设的脚本

步骤是作业内的最小执行单元,按顺序运行。步骤的核心就是执行一个“动作(Action)”或一段 Shell 命令。

  • uses:引用一个预构建的动作。可以从 GitHub Marketplace 选用社区分享的现成 Action,比如 actions/checkout@v4 用于拉取代码,或 appleboy/ssh-action@v1 用于通过 SSH 连接服务器。

  • run:直接运行 Shell 命令,比如 npm ci 或 npm test。

  • with:为 uses 引用的 Action 传入输入参数,如 node-version: '20'。

  • env:为当前步骤设置环境变量。

  • if:设置条件执行。例如,if: failure() 表示仅当上一步失败时才运行。

  • id:为步骤设置一个唯一标识符,方便后续步骤引用它的输出。

案例

push 后调用云服务器同步与编译

任务

部署github action 实现在git push 到 github 之后,github action 自动帮我同步到我的云服务器,并帮我调用云服务器上zola build来ssg新的静态内容。

思路如下:

  1. 需要让github actions 通过ssh连接到云服务器。
  2. 在目标目录下执行 git pull 和 zola build 两条命令。

在仓库的 .github/workflows/deploy.yml中

name: Remote Zola Build

# 触发条件:当代码推送到 main 分支时执行
on:
  push:
    branches:
      - main

jobs:
  build-on-vps:  # 自定义的作业 ID
    runs-on: ubuntu-latest # 连接到云服务器的步骤都是在 ubuntu:latest上执行
    steps:
      - name: Connect VPS and Build
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            cd /var/www/blog
            git pull origin main
            zola build