Skip to main content

CI/CD 自动化部署实践 - GitHub Actions 详解

·556 words·2 mins

概述
#

CI/CD(持续集成/持续部署)是现代软件开发的标准实践。本文以 GitHub Actions 为例讲解自动化部署。

核心概念
#

CI (持续集成)
#

每次代码提交后自动构建和测试,确保代码质量。

CD (持续部署)
#

代码通过测试后自动部署到生产环境。

工作流 (Workflow)
#

使用 YAML 文件定义自动化流程。

GitHub Actions 基础
#

语法结构
#

name: 工作流名称

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: 运行构建
        run: npm run build
        
      - name: 部署
        run: echo "Deploying..."

常用事件
#

事件 触发条件
push 代码推送到仓库
pull_request 创建或更新 PR
workflow_dispatch 手动触发
schedule 定时任务

实战示例
#

静态网站部署
#

name: Deploy Static Site

on:
  push:
    branches:
      - main

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          
      - name: Install Dependencies
        run: npm ci
        
      - name: Build
        run: npm run build
        
      - name: Deploy to Server
        run: |
          rsync -avz ./dist/ user@server:/var/www/site/

Docker 镜像构建
#

name: Build and Push Docker Image

on:
  push:
    branches:
      - main
    tags:
      - 'v*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Build Docker Image
        run: docker build -t myapp:${{ github.sha }} .
        
      - name: Push to Registry
        run: |
          docker tag myapp:${{ github.sha }} myregistry/myapp:${{ github.sha }}
          docker push myregistry/myapp:${{ github.sha }}

Node.js 应用部署
#

name: Deploy Node.js App

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          
      - name: Install Dependencies
        run: npm ci
        
      - name: Run Tests
        run: npm test
        
      - name: Build
        run: npm run build
        
      - name: Deploy
        uses: appleboy/scp-action@v1.0.0
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          source: "dist/*"
          target: "/var/www/app"

变量与密钥
#

环境变量
#

env:
  NODE_ENV: production
  API_URL: ${{ secrets.API_URL }}

密钥管理
#

在仓库 Settings → Secrets and variables → Actions 中添加:

  • SSH_KEY - SSH 私钥
  • DEPLOY_PASSWORD - 部署密码
  • API_TOKEN - API 访问令牌

最佳实践
#

  1. 分离 build 和 deploy - 便于调试
  2. 使用缓存 - 加速构建
  3. 健康检查 - 确保部署成功
  4. 回滚机制 - 快速恢复
  5. 通知 - 部署成功/失败通知

总结
#

CI/CD 是提高开发效率和软件质量的重要工具。GitHub Actions 提供了强大的自动化能力。