mcpField
G
github-actions-templates

github-actions-templates

github.com/wshobson云与 DevOps41.9k17.7k 次安装2 周前更新
代码仓库

关于 github-actions-templates

为不同技术栈编写 GitHub Actions CI 与部署工作流的参考技能,涵盖测试、镜像发布、Kubernetes 部署、矩阵构建、可复用工作流及安全实践。

主要功能

  1. 01测试与部署工作流模式
  2. 02Docker 镜像构建与发布
  3. 03Kubernetes 部署示例
  4. 04矩阵与可复用工作流
  5. 05工作流安全实践

适用场景

  1. 01自动运行测试和部署
  2. 02构建并发布 Docker 镜像
  3. 03将应用部署到 Kubernetes
  4. 04扫描代码并测试多个环境

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wshobson/agents --skill github-actions-templates

安装后在 Claude Code 中输入/github-actions-templates确认已加载。

详细介绍

GitHub Actions 模板

用于测试、构建和部署应用的生产级 GitHub Actions 工作流模式。

用途

为各种技术栈创建高效、安全的 GitHub Actions 工作流,用于持续集成和持续部署。

何时使用

  • 自动化测试和部署
  • 构建 Docker 镜像并推送到镜像仓库
  • 部署到 Kubernetes 集群
  • 运行安全扫描
  • 为多环境实现矩阵构建

常见工作流模式

模式 1:测试工作流
name: Test

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x, 20.x]

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: "npm"

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test

      - name: Upload coverage
        uses: codecov/codecov-action@v4
        with:
          files: ./coverage/lcov.info
模式 2:构建并推送 Docker 镜像
name: Build and Push

on:
  push:
    branches: [main]
    tags: ["v*"]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v4

      - name: Log in to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}

      - 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
模式 3:部署到 Kubernetes
name: Deploy to Kubernetes

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-2

      - name: Update kubeconfig
        run: |
          aws eks update-kubeconfig --name production-cluster --region us-west-2

      - name: Deploy to Kubernetes
        run: |
          kubectl apply -f k8s/
          kubectl rollout status deployment/my-app -n production
          kubectl get services -n production

      - name: Verify deployment
        run: |
          kubectl get pods -n production
          kubectl describe deployment my-app -n production
模式 4:矩阵构建
name: Matrix Build

on: [push, pull_request]

jobs:
  build:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python-version: ["3.9", "3.10", "3.11", "3.12"]

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run tests
        run: pytest

工作流最佳实践

  1. 使用具体的 action 版本(@v4,而非 @latest)
  2. 缓存依赖以加快构建速度
  3. 使用 secrets 存储敏感数据
  4. 在 PR 上实施状态检查
  5. 使用矩阵构建进行多版本测试
  6. 设置适当的权限
  7. 使用可复用工作流处理常见模式
  8. 为生产环境实施审批门禁
  9. 为失败情况添加通知步骤
  10. 为敏感工作负载使用自托管 runner

可复用工作流

# .github/workflows/reusable-test.yml
name: Reusable Test Workflow

on:
  workflow_call:
    inputs:
      node-version:
        required: true
        type: string
    secrets:
      NPM_TOKEN:
        required: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
      - run: npm ci
      - run: npm test

使用可复用工作流:

jobs:
  call-test:
    uses: ./.github/workflows/reusable-test.yml
    with:
      node-version: "20.x"
    secrets:
      NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

安全扫描

name: Security Scan

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

jobs:
  security:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/[email protected]
        with:
          scan-type: "fs"
          scan-ref: "."
          format: "sarif"
          output: "trivy-results.sarif"

      - name: Upload Trivy results to GitHub Security
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: "trivy-results.sarif"

      - name: Run Snyk Security Scan
        uses: snyk/actions/[email protected]
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

带审批的部署

name: Deploy to Production

on:
  push:
    tags: ["v*"]

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment:
      name: production
      url: https://app.example.com

    steps:
      - uses: actions/checkout@v4

      - name: Deploy application
        run: |
          echo "Deploying to production..."
          # Deployment commands here

      - name: Notify Slack
        if: success()
        uses: slackapi/slack-github-action@v1
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          payload: |
            {
              "text": "Deployment to production completed successfully!"
            }

相关技能

  • gitlab-ci-patterns - 用于 GitLab CI 工作流
  • deployment-pipeline-design - 用于流水线架构
  • secrets-management - 用于 secrets 处理

评论

支持 Markdown