← 返回首页
🔄

CI/CD基础概念

📂 devops ⏱ 2 min 352 words

CI/CD基础概念

什么是CI/CD

CI(持续集成)

开发人员频繁地将代码集成到共享仓库,每次集成都通过自动化构建和测试验证。

CD(持续交付/持续部署)

CI/CD流程

代码提交 → 自动构建 → 自动测试 → 制品发布 → 部署 → 监控

CI/CD工具

工具 类型 特点
Jenkins 自建 功能强大,插件丰富
GitLab CI SaaS/自建 与GitLab深度集成
GitHub Actions SaaS 与GitHub集成
CircleCI SaaS 易用,性能好
ArgoCD 自建 GitOps风格

Jenkins

安装Jenkins

# Docker方式
docker run -d --name jenkins \
    -p 8080:8080 -p 50000:50000 \
    -v jenkins_home:/var/jenkins_home \
    jenkins/jenkins:lts

Jenkinsfile

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        
        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }
        
        stage('Test') {
            steps {
                sh 'npm test'
            }
        }
        
        stage('Docker Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        
        stage('Deploy') {
            steps {
                sh 'kubectl set image deployment/myapp myapp=myapp:${BUILD_NUMBER}'
            }
        }
    }
    
    post {
        always {
            cleanWs()
        }
        success {
            echo 'Build succeeded!'
        }
        failure {
            echo 'Build failed!'
        }
    }
}

GitLab CI

.gitlab-ci.yml

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: myapp

build:
  stage: build
  script:
    - npm install
    - npm run build
    - docker build -t $DOCKER_IMAGE:$CI_COMMIT_SHA .
  artifacts:
    paths:
      - dist/

test:
  stage: test
  script:
    - npm test
  coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'

deploy_staging:
  stage: deploy
  script:
    - kubectl set image deployment/myapp myapp=$DOCKER_IMAGE:$CI_COMMIT_SHA
  environment:
    name: staging
  only:
    - develop

deploy_production:
  stage: deploy
  script:
    - kubectl set image deployment/myapp myapp=$DOCKER_IMAGE:$CI_COMMIT_SHA
  environment:
    name: production
  when: manual
  only:
    - main

GitHub Actions

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

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

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run tests
        run: npm test
      
      - name: Build
        run: npm run build
      
      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}

实践:完整CI/CD流程

# .github/workflows/ci-cd.yml
name: CI/CD

on:
  push:
    branches: [main]

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

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: docker build -t myapp:${{ github.sha }} .
      - run: docker push myapp:${{ github.sha }}

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: kubectl set image deployment/myapp myapp=myapp:${{ github.sha }}

总结

CI/CD是现代软件开发的核心实践。选择合适的工具,建立自动化的构建、测试和部署流程,可以显著提高开发效率和软件质量。