Get the FREE Ultimate OpenClaw Setup Guide →
npx machina-cli add skill chaterm/terminal-skills/ci-cd --openclaw
Files (1)
SKILL.md
8.0 KB

CI/CD 流水线配置

概述

Jenkins、GitLab CI、GitHub Actions 等 CI/CD 工具配置技能。

GitHub Actions

基础工作流

# .github/workflows/ci.yml
name: CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run tests
        run: npm test
      
      - name: Build
        run: npm run build

矩阵构建

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node-version: [16, 18, 20]
    
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - run: npm test

Docker 构建与推送

jobs:
  docker:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: user/app:${{ github.sha }}

部署到 Kubernetes

jobs:
  deploy:
    runs-on: ubuntu-latest
    needs: build
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Configure kubectl
        uses: azure/k8s-set-context@v3
        with:
          kubeconfig: ${{ secrets.KUBE_CONFIG }}
      
      - name: Deploy
        run: |
          kubectl set image deployment/app app=user/app:${{ github.sha }}
          kubectl rollout status deployment/app

GitLab CI

基础配置

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE

test:
  stage: test
  image: node:18
  script:
    - npm ci
    - npm test
  coverage: '/Coverage: \d+\.\d+%/'

deploy:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/app app=$DOCKER_IMAGE
  only:
    - main
  environment:
    name: production
    url: https://app.example.com

多环境部署

.deploy_template: &deploy_template
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl config use-context $KUBE_CONTEXT
    - kubectl set image deployment/app app=$DOCKER_IMAGE

deploy_staging:
  <<: *deploy_template
  variables:
    KUBE_CONTEXT: staging
  environment:
    name: staging
  only:
    - develop

deploy_production:
  <<: *deploy_template
  variables:
    KUBE_CONTEXT: production
  environment:
    name: production
  only:
    - main
  when: manual

Jenkins

Jenkinsfile(声明式)

// Jenkinsfile
pipeline {
    agent any
    
    environment {
        DOCKER_IMAGE = "user/app:${BUILD_NUMBER}"
        DOCKER_CREDENTIALS = credentials('docker-hub')
    }
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        
        stage('Build') {
            steps {
                sh 'npm ci'
                sh 'npm run build'
            }
        }
        
        stage('Test') {
            steps {
                sh 'npm test'
            }
            post {
                always {
                    junit 'test-results/*.xml'
                }
            }
        }
        
        stage('Docker Build') {
            steps {
                sh "docker build -t ${DOCKER_IMAGE} ."
            }
        }
        
        stage('Docker Push') {
            steps {
                sh "echo ${DOCKER_CREDENTIALS_PSW} | docker login -u ${DOCKER_CREDENTIALS_USR} --password-stdin"
                sh "docker push ${DOCKER_IMAGE}"
            }
        }
        
        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                sh "kubectl set image deployment/app app=${DOCKER_IMAGE}"
            }
        }
    }
    
    post {
        always {
            cleanWs()
        }
        success {
            slackSend channel: '#deployments', message: "Build ${BUILD_NUMBER} succeeded"
        }
        failure {
            slackSend channel: '#deployments', message: "Build ${BUILD_NUMBER} failed"
        }
    }
}

Jenkinsfile(脚本式)

node {
    stage('Checkout') {
        checkout scm
    }
    
    stage('Build') {
        sh 'npm ci'
        sh 'npm run build'
    }
    
    stage('Test') {
        try {
            sh 'npm test'
        } finally {
            junit 'test-results/*.xml'
        }
    }
    
    if (env.BRANCH_NAME == 'main') {
        stage('Deploy') {
            sh 'kubectl apply -f k8s/'
        }
    }
}

通用模式

语义化版本发布

# GitHub Actions
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Get version
        id: version
        run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
      
      - name: Build
        run: npm run build
      
      - name: Create Release
        uses: softprops/action-gh-release@v1
        with:
          files: dist/*
          generate_release_notes: true

缓存依赖

# GitHub Actions
- name: Cache node modules
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

# GitLab CI
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

并行测试

# GitHub Actions
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test -- --shard=${{ matrix.shard }}/4

条件执行

# GitHub Actions
jobs:
  deploy:
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying..."

# GitLab CI
deploy:
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual
    - if: $CI_COMMIT_TAG
      when: always

常见场景

场景 1:PR 检查

name: PR Check

on:
  pull_request:
    types: [opened, synchronize, reopened]

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

场景 2:定时任务

name: Scheduled Job

on:
  schedule:
    - cron: '0 2 * * *'  # 每天凌晨2点

jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Running cleanup..."

场景 3:手动触发

name: Manual Deploy

on:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Environment to deploy'
        required: true
        default: 'staging'
        type: choice
        options:
          - staging
          - production

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying to ${{ inputs.environment }}"

故障排查

问题排查方法
构建失败查看日志、本地复现
权限问题检查 secrets、token
缓存失效检查 cache key
超时增加 timeout、优化步骤

Source

git clone https://github.com/chaterm/terminal-skills/blob/main/devops/ci-cd/SKILL.mdView on GitHub

Overview

你可以在 GitHub Actions、GitLab CI、Jenkins 等工具中定义从构建到部署的完整流水线,并通过矩阵构建、缓存、密钥管理等机制提升效率与安全性。本技能覆盖三大主流工具的典型场景:基础构建/测试、镜像构建与推送、以及 Kubernetes 部署,适用于单环境与多环境(开发/测试/生产)的持续交付流程。

How This Skill Works

你通过声明式配置来描述流水线任务。GitHub Actions 使用 workflow YAML、GitLab CI 使用 .gitlab-ci.yml、Jenkins 提供 Declarative 与 Scripted 两种写法。流水线在 runner/agent 上执行,支持缓存、密钥/凭证、并行作业、以及与 Docker Hub、Kubernetes 等外部系统的集成。常见能力包括:矩阵构建、镜像构建与推送、Kubernetes 部署、以及环节间的依赖与触发条件。示例能力点:GitHub Actions 的 setup-node、docker/login-action、docker/build-push-action,以及 kubectl/ Azure K8s context 的集成;GitLab CI 的 DOCKER_IMAGE 变量、docker:dind 服务、kubectl 部署;Jenkins 的 Docker 构建/推送、Credentials、以及 Slack 通知。

When to Use It

  • 需要在每次提交或 PR 上自动执行构建、测试与静态分析(PR Check)
  • 需要构建并推送 Docker 镜像,并在后续阶段部署到 Kubernetes
  • 需要在开发、预生产和生产等多环境之间执行一致的部署流程(多环境部署)
  • 需要对不同操作系统或 Node.js 版本进行并行测试与矩阵构建
  • 需要定时任务或手动触发的部署场景(Scheduled/Manual Deploy)

Quick Start

  1. 1) 选择工具并创建配置文件(如 GitHub Actions 的 .github/workflows/ci.yml、GitLab 的 .gitlab-ci.yml、或 Jenkins 的 Jenkinsfile)。
  2. 2) 添加基础构建与测试步骤,例如 checkout、依赖安装、测试与打包。
  3. 3) 可选:添加镜像构建/推送与部署步骤(Docker 登录、docker build-push、kubectl set image 等)。
  4. 4) 提交变更并在 UI 中查看流水线执行与日志,逐步完善缓存、并行化和条件触发。

Best Practices

  • 使用缓存来加速构建,例如 GitHub Actions 的缓存节点模块、GitLab 的 cache 关键字;确保缓存键包含依赖锁文件的哈希。
  • 利用矩阵测试在不同操作系统和 Node.js 版本上验证兼容性,缩短回归时间。
  • 流水线各阶段应幂等,部署步骤尽量将产物版本化并避免重复部署。
  • 将密钥与凭证放置在安全的 secrets/credentials 中,避免日志输出敏感信息。
  • 对生产部署设置受控触发(如仅在 main 分支、或手动触发),并记录发布版本(如基于标签的语义化版本)。

Example Use Cases

  • 场景:GitHub Actions 基础 Node.js 项目,PR Check 包含 lint、test 与 build。你会看到 .github/workflows/ci.yml 的基本工作流,包含 checkout、Setup Node、npm ci、npm test、npm run build。
  • 场景:Docker 镜像构建与推送,并在 Kubernetes 中部署。流程包含 docker/login-action、docker/build-push-action、kubectl 部署,以及使用环境变量和镜像标签(如 ${GITHUB_SHA})进行版本控制。
  • 场景:GitLab CI 的多环境部署。通过 .gitlab-ci.yml 定义 build/test/deploy 三个阶段,使用 DOCKER_IMAGE、kubectl 进行生产环境的发布,同时提供 staging 的分支及环境分离。
  • 场景:Jenkins 流水线(Declarative 与 Scripted),从 Checkout、Build、Test、Docker Build/Push,到生产环境的 Kubernetes 部署,并通过 Slack 通知发布结果。
  • 场景:通过 GitHub Actions 的标签触发实现语义化版本发布,使用 v* 标签触发、版本提取、打包并发布 Release,以及 dist/ 文件上新的发布流程。

Frequently Asked Questions

Add this skill to your agents

Related Skills

Sponsor this space

Reach thousands of developers