返回首页

如何使用 GitHub Actions 设置 CI/CD 流水线 – 指南

本综合指南解释了如何使用 GitHub Actions 设置 CI/CD 流水线,涵盖从基本工作流到高级 Docker 部署的所有内容。您将学习使用实用的 YAML 示例、作业依赖、缓存策略和安全密钥管理来自动化测试、构建和部署。

使用 GitHub Actions 的 CI/CD 流水线:完整设置
Advertisement 728x90

使用 GitHub Actions 搭建 CI/CD 流水线:完整配置指南

在现代软件开发中,每次代码变更后手动测试和运行部署脚本已成为拖慢交付速度、引入人为错误的瓶颈。CI/CD 流水线能够自动化整个流程,从代码测试到生产环境部署。本指南将通过实用的 YAML 示例,教你如何使用功能强大且深度集成的自动化平台 GitHub Actions 搭建 CI/CD 流水线,让你更快速、更可靠地交付代码。

你将学到什么

学完本指南后,你将理解持续集成和持续部署(CI/CD)的核心概念,并能够使用 GitHub Actions 实现多阶段流水线。你将学会编写用于自动化测试、构建 Docker 镜像和部署应用的工作流。你将获得可直接用于测试、构建和部署自己项目(无论是 Python、Node.js 还是容器化应用)的 YAML 代码

理解 GitHub Actions 基础

GitHub Actions 是一个事件驱动的自动化平台,直接集成在 GitHub 仓库中。它允许你运行由 pushpull_requestrelease 等事件触发的自动化工作流。工作流定义在位于 .github/workflows/ 目录下的 YAML 文件中,默认情况下包含一个或多个并行运行的作业,每个作业由一系列步骤组成。

Google AdInline article slot

核心组件

  • 事件(on:触发工作流的事件,例如推送到特定分支或创建拉取请求。
  • 运行器(runs-on:执行作业的机器。ubuntu-latest 是最常用且推荐的选择,因其性能优越且软件支持广泛。
  • 步骤:作业中的单个任务。可以是 shell 脚本(run)或来自 GitHub Marketplace 的预构建操作(uses)。
  • 操作:可复用的代码单元,例如 actions/checkout@v4 用于克隆仓库,或 actions/setup-node@v4 用于安装 Node.js。

入门基础工作流

最简单的做法是让工作流在每次推送时触发。创建 .github/workflows/main.yml 文件,运行一个基本的 "Hello World" 命令。

name: example
on: push
jobs:
  greeting:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Hello, CI/CD World!"

将此文件提交并推送到仓库后,你可以在 GitHub 仓库的 "Actions" 标签页中查看作业的输出。

构建全面的 CI 流水线

流水线中的 "CI" 部分确保代码变更在合并前自动通过测试和验证。这通常包括代码检查、类型检查和运行单元测试。

Google AdInline article slot

CI 工作流文件

创建 .github/workflows/ci.yml。该工作流会在每次推送到 main 分支或创建针对 main 分支的拉取请求时触发。以下示例展示了 Node.js 项目的完整流水线,但该模式同样适用于其他语言(例如使用 actions/setup-python 的 Python 项目)。

name: CI Pipeline

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

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    needs: lint
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm test

  build:
    runs-on: ubuntu-latest
    needs: [lint, test]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run build

关键特性说明

  1. 依赖缓存actions/setup-node 中的 cache: 'npm' 选项通过复用之前运行的依赖,显著加快工作流速度。
  2. 作业依赖needs 关键字定义了执行顺序。例如,build 作业仅在 linttest 作业成功后才运行,从而避免浪费时间构建有问题的代码。
  3. 环境变量:对于数据库等服务,你可以定义环境变量。例如,test 作业可以启动一个 PostgreSQL 服务容器,并使用 env 连接到它。

高级场景:容器化与多环境部署

对于现代应用,流水线通常涉及构建容器镜像和部署。下表概述了常见的部署策略及其触发器。

部署触发器对比

策略 部署触发器 适用场景
基于分支 推送到 main 分支 持续部署最新开发代码
基于标签 推送新标签(例如 v1.0.0 向生产环境发布稳定的版本化软件
基于发布 在 GitHub 上发布 Release 官方产品发布,同时生成发布说明

示例:使用 CI/CD 工作流部署 Docker 容器

这个综合示例演示了测试 Python 应用、构建 Docker 镜像并将其推送到镜像仓库的流水线。它使用一系列官方 Docker 操作来实现安全、高性能的构建。

Google AdInline article slot

创建 .github/workflows/deploy.yml

name: Complete CI/CD Pipeline

on:
  push:
    branches: [ main ]
  release:
    types: [published]

env:
  DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
  DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }}
  IMAGE_NAME: my-app

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - run: pip install -r requirements.txt
      - run: pytest

  build-and-push:
    runs-on: ubuntu-latest
    needs: test
    if: github.event_name == 'push' || github.event_name == 'release'
    steps:
      - uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ env.DOCKER_HUB_USERNAME }}
          password: ${{ env.DOCKER_HUB_TOKEN }}
      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.DOCKER_HUB_USERNAME }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=raw,value=latest,enable={{is_default_branch}}
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    runs-on: ubuntu-latest
    needs: build-and-push
    if: github.event_name == 'release'
    steps:
      - name: Execute Deployment Script
        run: |
          echo "Deploying image ${{ env.DOCKER_HUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ github.event.release.tag_name }}"

重要提示:密钥管理

要使上述工作流正常运行,你必须将凭据安全地存储在 GitHub 仓库中。导航到 Settings > Secrets and variables > Actions,然后添加以下密钥:

  1. DOCKER_HUB_USERNAME:你的 Docker Hub 用户名。
  2. DOCKER_HUB_TOKEN:具有读写权限的 Docker Hub 个人访问令牌。

⚠️ 安全警告:切勿将密码、令牌或其他敏感数据直接硬编码在 YAML 文件中。始终使用 GitHub 密钥,这些密钥经过加密,仅在运行工作流时可访问。

参考来源

— Editorial Team

Advertisement 728x90

继续阅读