Skip to main content

自动化部署

本文档介绍如何使用Jenkins和Kubernetes实现自动化部署。

Jenkins流水线配置

Jenkinsfile示例

pipeline {
agent any

environment {
DOCKER_REGISTRY = 'registry.example.com'
IMAGE_NAME = 'myapp'
K8S_NAMESPACE = 'production'
}

stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/company/myapp.git'
}
}

stage('Test') {
steps {
sh 'npm ci'
sh 'npm test'
sh 'npm run lint'
}
}

stage('Build Image') {
steps {
script {
def image = docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${env.BUILD_NUMBER}")
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
image.push()
image.push('latest')
}
}
}
}

stage('Deploy') {
steps {
sh '''
kubectl set image deployment/myapp-deployment \\
myapp=${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER} \\
-n ${K8S_NAMESPACE}
kubectl rollout status deployment/myapp-deployment -n ${K8S_NAMESPACE}
'''
}
}
}

post {
success {
slackSend channel: '#deployments',
color: 'good',
message: "✅ 部署成功: ${env.JOB_NAME} - ${env.BUILD_NUMBER}"
}
failure {
slackSend channel: '#deployments',
color: 'danger',
message: "❌ 部署失败: ${env.JOB_NAME} - ${env.BUILD_NUMBER}"
}
}
}

Kubernetes部署配置

Deployment配置

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.example.com/myapp:latest
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: "production"
- name: DB_HOST
valueFrom:
secretKeyRef:
name: app-secrets
key: db-host
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5

Service配置

apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: production
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP