CI/CD流水线构建完全指南
CI/CD概述
CI/CD是持续集成和持续部署的缩写,是现代软件开发的核心实践,能够自动化构建、测试和部署流程。
CI/CD流程
代码提交 → 自动构建 → 自动测试 → 自动部署 → 监控反馈
GitHub Actions
基础配置
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
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 -- --coverage
- name: Build
run: npm run build
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
file: ./coverage/lcov.info
部署工作流
# .github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build -t myapp:${{ github.sha }} .
docker tag myapp:${{ github.sha }} myapp:latest
- name: Login to Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push image
run: |
docker push ghcr.io/${{ github.repository }}/myapp:${{ github.sha }}
docker push ghcr.io/${{ github.repository }}/myapp:latest
- name: Deploy to Kubernetes
uses: steebchen/kubectl@v2.0.0
with:
config: ${{ secrets.KUBE_CONFIG }}
command: set image deployment/myapp myapp=ghcr.io/${{ github.repository }}/myapp:${{ github.sha }}
- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
fields: repo,message,commit,author
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
GitLab CI
# .gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- node_modules/
build:
stage: build
image: maven:3.8-openjdk-17
script:
- mvn clean package -DskipTests
artifacts:
paths:
- target/*.jar
expire_in: 1 hour
test:
stage: test
image: maven:3.8-openjdk-17
script:
- mvn test
coverage: '/Total.*?([0-9]{1,3})%/'
docker-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
only:
- main
deploy-staging:
stage: deploy
environment:
name: staging
url: https://staging.example.com
script:
- kubectl set image deployment/myapp myapp=$DOCKER_IMAGE
only:
- develop
deploy-production:
stage: deploy
environment:
name: production
url: https://example.com
script:
- kubectl set image deployment/myapp myapp=$DOCKER_IMAGE
when: manual
only:
- main
Jenkins Pipeline
Declarative Pipeline
// Jenkinsfile
pipeline {
agent any
environment {
DOCKER_IMAGE = "myapp:${BUILD_NUMBER}"
REGISTRY = "registry.example.com"
}
tools {
nodejs 'NodeJS-18'
docker 'docker'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install') {
steps {
sh 'npm ci'
}
}
stage('Test') {
steps {
sh 'npm test'
junit 'test-results/*.xml'
}
post {
always {
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'coverage',
reportFiles: 'index.html',
reportName: 'Coverage Report'
])
}
}
}
stage('Build') {
steps {
sh 'npm run build'
archiveArtifacts 'dist/**'
}
}
stage('Docker Build') {
when {
branch 'main'
}
steps {
sh "docker build -t ${REGISTRY}/${DOCKER_IMAGE} ."
withCredentials([usernamePassword(
credentialsId: 'registry-creds',
usernameVariable: 'DOCKER_USER',
passwordVariable: 'DOCKER_PASS'
)]) {
sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASS} ${REGISTRY}"
}
sh "docker push ${REGISTRY}/${DOCKER_IMAGE}"
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh "kubectl set image deployment/myapp myapp=${REGISTRY}/${DOCKER_IMAGE}"
}
}
}
post {
success {
slackSend(color: 'good', message: "Build ${BUILD_NUMBER} succeeded")
}
failure {
slackSend(color: 'danger', message: "Build ${BUILD_NUMBER} failed")
}
}
}
部署策略
蓝绿部署
金丝雀发布
# Istio金丝雀发布 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: myapp spec: hosts: - myapp http: - route: - destination: host: myapp subset: stable weight: 90 - destination: host: myapp subset: canary weight: 10最佳实践
- 小步快跑:频繁提交,快速反馈
- 自动化测试:单元测试、集成测试、E2E测试
- 环境隔离:开发、测试、生产环境分离
- 回滚机制:保留历史版本,快速回滚
- 监控告警:部署后自动监控
CI/CD是现代软件开发的基石,构建可靠的流水线能够大幅提升团队效率。
本文链接:https://www.kkkliao.cn/?id=759 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡
号卡合伙人
产品服务
关于本站
