19、持续集成/持续部署(CI/CD)与Git:GitHub Actions、GitLab CI 的基本配置与触发策略

聊到现代软件开发,有个词你肯定绕不开——CI/CD。说白了,就是让机器替你做那些重复、容易出错的事情。我刚开始带团队那会儿,大家还习惯手动合并、手动部署,每次上线都像在拆弹。后来引入了CI/CD,整个人都轻松了。

这一章,我们就来聊聊CI/CD和Git怎么配合。重点放在GitHub Actions和GitLab CI上,看看它们的基本配置和触发策略。

CI/CD 到底在解决什么问题?

先想一个问题:你写完代码,提交到Git仓库,然后呢?

传统做法是:同事拉下来,本地编译、跑测试、没问题再手动部署到服务器。这个过程慢、容易出错,而且特别依赖人的责任心。

CI/CD的思路是:你只管push代码,剩下的交给流水线。自动编译、自动测试、自动部署。如果哪一步挂了,流水线会立刻告诉你。

核心价值:缩短反馈周期,减少人为失误,让团队更专注于写代码本身。

GitHub Actions 的基本配置

GitHub Actions 是 GitHub 自家的CI/CD工具。它的配置方式很直观——在仓库里放一个YAML文件就行。

我个人习惯把配置文件放在 .github/workflows/ 目录下。每个YAML文件就是一个工作流(Workflow)。

一个最简单的例子

假设你有一个Node.js项目,想在每次push时自动跑测试。可以这样写:

name: Node.js CI

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

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: 使用 Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    - run: npm ci
    - run: npm test

这个配置做了几件事:

  • 监听 main 分支的 push 和 pull_request 事件
  • 在 Ubuntu 最新环境上运行
  • 拉取代码、安装依赖、跑测试

嗯,这里要注意:npm cinpm install 更快更可靠,因为它严格依赖 package-lock.json。我在项目中遇到过好几次因为 npm install 意外升级了依赖版本导致测试失败的情况,后来就全面改用 npm ci 了。

触发策略:不只是 push

GitHub Actions 的触发方式很灵活。除了 pushpull_request,你还可以:

  • 定时触发:schedule 事件,比如每天凌晨跑一次
  • 手动触发:workflow_dispatch,可以在GitHub页面上点按钮运行
  • 标签触发:打tag时自动构建并发布

举个例子,我想在打tag时自动发布到npm:

on:
  push:
    tags:
      - 'v*'

这样只要推送一个以 v 开头的标签,流水线就会触发。我曾经用这个策略配合语义化版本,实现了自动发布——每次打tag,流水线自动构建、测试、发布到npm,省了不少事。

GitLab CI 的基本配置

GitLab CI 的配置方式和 GitHub Actions 类似,也是用YAML文件。不过它放在项目根目录,文件名固定为 .gitlab-ci.yml

一个简单的 GitLab CI 配置

stages:
  - test
  - build
  - deploy

test-job:
  stage: test
  script:
    - npm ci
    - npm test

build-job:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/

deploy-job:
  stage: deploy
  script:
    - scp -r dist/ user@server:/var/www/
  only:
    - main

这个配置定义了三个阶段:测试、构建、部署。每个阶段可以有一个或多个任务。注意 artifacts 关键字——它把构建产物传递给后续阶段。这个设计很巧妙,避免了重复构建。

小技巧:GitLab CI 的 onlyexcept 关键字可以用来控制任务在哪些分支上运行。不过在新版本中,官方更推荐用 rules 关键字,它更灵活。

触发策略:GitLab CI 的特色

GitLab CI 的触发策略和 GitHub Actions 大同小异,但有几个特色功能:

  • Merge Request 触发:当MR被创建或更新时自动运行
  • Pipeline 调度:类似 cron 定时任务
  • 多项目流水线:一个项目的流水线可以触发另一个项目的流水线

我个人特别喜欢 GitLab 的 Merge Request 流水线。它会在MR页面直接显示测试结果,如果测试没通过,合并按钮是灰色的。这相当于在代码合入前加了一道自动门禁。

两种工具的对比

特性 GitHub Actions GitLab CI
配置文件位置 .github/workflows/*.yml .gitlab-ci.yml(根目录)
触发方式 push、PR、schedule、workflow_dispatch 等 push、MR、schedule、多项目触发等
运行环境 GitHub 托管的 runner 或自托管 GitLab 托管的 runner 或自托管
市场生态 丰富的 Actions 市场 模板和集成较多
免费额度 公开仓库免费,私有仓库有额度限制 自托管免费,SaaS版有额度限制

选哪个?说实话,看你的代码托管在哪。如果项目在GitHub上,就用Actions;在GitLab上,就用GitLab CI。没必要为了CI工具迁移代码仓库。

CI/CD 与 Git 的协作流程

最后,我想用一张图来展示CI/CD和Git是怎么配合的。这张图是我自己总结的,希望能帮你理清思路。

CI/CD 与 Git 协作流程 开发者 git push / git merge Git 仓库 触发事件 CI/CD 流水线 自动构建/测试 部署 反馈(成功/失败通知) 代码检查 单元测试 构建打包 部署 流水线阶段 (按顺序执行)

这张图展示了从开发者提交代码到最终部署的完整链路。注意那个虚线反馈箭头——如果流水线失败,开发者会立刻收到通知,可以马上修复。这就是CI/CD的核心价值:快速反馈。

避坑指南:我曾经犯过一个错误——把生产环境的密钥直接写在YAML文件里。结果不小心把仓库设为公开,密钥全泄露了。后来我改用GitHub的Secrets和GitLab的Variables来管理敏感信息。记住:永远不要在配置文件中硬编码密码、Token等敏感信息。

好了,这一章的内容就到这里。CI/CD的配置其实不难,难的是设计出适合你团队的流水线。多试试,多调整,慢慢就会找到感觉。


公众号:蓝海资料掘金营,微信deep3321