DevOps实践:CI/CD与自动化
DevOps实践:CI/CD与自动化
概述
DevOps是开发和运维协作的实践。本教程介绍CI/CD流水线和自动化部署。
1. CI/CD流水线
# Jenkins Pipeline
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('SonarQube') {
steps {
sh 'mvn sonar:sonar'
}
}
stage('Docker Build') {
steps {
sh 'docker build -t my-app:${BUILD_NUMBER} .'
}
}
stage('Deploy') {
steps {
sh 'kubectl set image deployment/my-app my-app=my-app:${BUILD_NUMBER}'
}
}
}
}
2. GitHub Actions
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean package
- name: Run tests
run: mvn test
- name: Build Docker image
run: docker build -t my-app:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker tag my-app:${{ github.sha }} myregistry/my-app:${{ github.sha }}
docker push myregistry/my-app:${{ github.sha }}
3. 实际应用示例
Docker构建
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Kubernetes部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 8080
4. 最佳实践
- 自动化构建:使用CI工具自动化构建
- 自动化测试:集成单元测试和集成测试
- 代码质量:使用SonarQube进行代码质量检查
- 容器化:使用Docker容器化应用
- 自动化部署:使用Kubernetes进行自动化部署
总结
DevOps是开发和运维协作的实践。掌握CI/CD流水线和自动化部署,可以实现快速、可靠的软件交付。