第1节:GitHub Actions 概述:它到底是什么?

GitHub Actions,说白了就是 GitHub 帮你内置的一套自动化流水线工具。你写代码、提 PR、打标签……这些动作都能触发它干活——比如跑测试、打包、部署。我刚开始接触 CI/CD 时总觉得这类工具都差不多,但用上 Actions 之后才发现,它最大的优势是跟仓库“长”在一起,不用额外搭 Jenkins 或者 GitLab Runner。

为什么会这样?因为 Actions 直接跑在 GitHub 的虚拟环境里,配置文件就放在仓库的 .github/workflows/ 目录下。你想想看,所有东西都在一个地方,维护成本自然就低了。

工作流程:一次事件触发的任务链

一个工作流(workflow)就是一组自动化作业的集合。它由 事件 启动,然后按顺序或并行执行多个 作业,每个作业里又包含若干 步骤。步骤里具体干什么?可以跑 shell 命令,也可以调用现成的 动作(action)。

我见过不少新手把“作业”和“步骤”搞混。记住一条:作业运行在不同的机器上,步骤运行在同一台机器上。举个例子,你可以让“测试”和“构建”两个作业并行跑,但“构建”里的“安装依赖”和“编译代码”必须按先后顺序。

核心概念速览表:
概念含义我的经验
工作流一个 .yml 文件,定义整个自动化流程一个仓库可以有多个工作流文件,互不干扰
事件触发工作流运行的条件比如 push、pull_request、定时 cron
作业一组步骤,运行在同一个 runner 上默认并行,也可以用 needs 控制依赖
步骤作业内的最小执行单元可以是命令,也可以是引用 action
动作可复用的步骤模板GitHub Marketplace 里有现成的,也可以自己写

事件:谁喊醒了工作流?

事件就是 GitHub 平台上的各种操作。最常见的:push(你提交代码)、pull_request(别人给你提 PR)、release(你发版)。

你还可以用 workflow_dispatch 事件,在 GitHub 页面手动点按钮触发——这个我经常用在临时调试场景。曾经有个坑:某次我把 push 事件写成了 pushs,结果工作流死活不跑,查了半天才发现是拼写错误……别笑,yml 文件里的 spell check 不会帮你纠错。

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

作业:把任务拆开跑

一个工作流可以包含多个作业。默认情况下它们并行执行——这能节省大量时间。但有些时候,你需要一个作业依赖另一个作业的结果,比如“先测试,测试通过再部署”。用 needs 关键字搞定。

个人习惯:我通常把“lint”、“test”、“build”拆成三个并行作业,再让“deploy”依赖它们三个全部成功。这样如果 lint 挂掉,部署不会白跑。

步骤:每个作业里的细节

步骤是命令的具体执行单元。你可以直接在 run 字段里写 bash 命令,也可以用 uses 引用一个现成的 action。

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Run tests
        run: npm test

注意:每一步都会在同一个 runner 的同一个工作目录下执行,所以上一步生成的文件下一步还能用。

动作:别重复造轮子

动作就是封装好的步骤。GitHub 官方和社区已经贡献了成千上万个动作,比如 actions/checkout(拉取代码)、actions/setup-node(配置 Node.js)、actions/upload-artifact(上传构建产物)。

我曾经自己写过几个内部动作,封装了公司私有的证书获取逻辑。后来发现直接发布到 Marketplace 反而更方便——当然,你完全可以在仓库内用相对路径引用本地 action。

完整工作流示例

name: CI Pipeline
on: [push, pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm run lint

  test:
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm test

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: dist/
曾经踩过的坑:把 needs 写成了 need,结果作业全部并行执行,test 还没跑完 build 就开始了,报错说找不到 node_modules —— 那叫一个惨。记住,yml 里 needs 是复数。

GitHub Actions 核心架构

下面这张图展示了事件如何触发工作流,工作流如何分解为作业和步骤,以及动作如何被复用。看完你应该对整个脉络有个清晰的印象。

GitHub Actions 核心架构 事件(Event) 工作流(Workflow) 作业1(Job) 作业2(Job) 步骤:Checkout 步骤:安装依赖 步骤:运行测试 动作(Action:可复用的步骤模板) 触发器(push/PR/cron)→ 工作流 → 并行/串行作业 → 步骤 → 可复用 Action 所有定义在 .github/workflows/*.yml 中

看完这张图,你应该能明白:事件进来,工作流启动,里面拆成多个作业,每个作业又一堆步骤,步骤里可以用现成的动作。这就是 GitHub Actions 的全部骨架。

一个小建议:刚开始学先写一个最简单的“hello world”工作流,只触发 push,只打印一句日志。跑通之后再慢慢加作业、加动作。别想着第一次就搞出完整的 CD 流水线,容易把自己绕晕。