引言
在云原生时代,CI/CD流水线是保障微服务持续交付的核心能力。本文将基于Sealos云操作系统,结合SpringCloud项目,详解如何构建从代码提交到生产环境的全自动化部署流水线。通过GitLab CI与ArgoCD的深度集成,实现多环境一致性部署、快速回滚和可视化监控。
一、环境准备
1.1 Sealos集群部署
# 部署Kubernetes基础集群
sealos run ghcr.io/labring/sealos/kubernetes:v1.28.15 \
--masters 192.168.0.2,192.168.0.3 \
--nodes 192.168.0.4,192.168.0.5 -p 'your-ssh-passwd'
# 部署网络插件
sealos run ghcr.io/labring/sealos/cilium:v1.17.1
# 部署证书管理
sealos run ghcr.io/labring/sealos/cert-manager:v1.14.6
注:需提前配置好SSH免密登录环境
1.2 ArgoCD部署
# deploy/base/argocd/install.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/argoproj/argo-helm
targetRevision: main
chart: argo-cd
helm:
values: |
server:
service:
type: ClusterIP
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
二、流水线设计
2.1 GitLab CI配置
# .gitlab-ci.yml
stages:
- build
- test
- deploy-dev
- deploy-staging
- deploy-prod
variables:
DOCKER_HOST: tcp://docker:2375
KUBECONFIG: /etc/deploy/.kube/config
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} .
- docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
test:
stage: test
image: maven:3.8.6
script:
- mvn clean test -Dspring.profiles.active=test
deploy-dev:
stage: deploy-dev
image: bitnami/kubectl:latest
script:
- kubectl config set-cluster sealos --server=${K8S_DEV_SERVER}
- kubectl config set-credentials dev-admin --token=${DEV_TOKEN}
- kubectl set image deployment/springcloud-demo-1 springcloud-demo= ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} -n dev
only:
- dev
2.2 ArgoCD应用清单
# deploy/applications/springcloud-dev.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: springcloud-dev
namespace: argocd
spec:
project: default
source:
repoURL: https://gitlab.com/myorg/springcloud-demo.git
targetRevision: dev
path: deploy/overlays/dev
destination:
server: https://kubernetes.default.svc
namespace: dev
syncPolicy:
automated:
prune: true
selfHeal: true
三、多环境部署策略
3.1 命名空间隔离
# 创建环境命名空间
kubectl create namespace dev --labels=env=development
kubectl create namespace staging --labels=env=staging
kubectl create namespace prod --labels=env=production
3.2 蓝绿部署配置
# deploy/overlays/prod/rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: springcloud-demo
spec:
replicas: 3
strategy:
blueGreen:
activeService: springcloud-demo-active
previewService: springcloud-demo-preview
autoPromotionEnabled: false
autoPromotionSeconds: 30
template:
spec:
containers:
- name: springcloud-demo
image: registry.gitlab.com/myorg/springcloud-demo:latest
3.3 金丝雀发布策略
# deploy/overlays/prod/canary.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: springcloud-demo-canary
spec:
replicas: 5
strategy:
canary:
steps:
- setWeight: 20
- pause: {duration: 5m}
- setWeight: 50
- pause: {duration: 5m}
- setWeight: 100
四、监控与告警
4.1 ArgoCD通知配置
# deploy/base/argocd/notifications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-notifications
annotations:
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: #prod-alerts
notifications.argoproj.io/subscribe.on-sync-failed.slack: #prod-alerts
4.2 健康检查配置
# deploy/overlays/prod/healthchecks.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
spec:
destinations:
- namespace: prod
server: https://kubernetes.default.svc
syncWindows:
- applications:
- '*'
kind: allow
schedule: '* * * * *'
duration: 1h
五、SpringCloud项目适配
5.1 Kubernetes资源清单
# deploy/manifests/service.yaml
apiVersion: v1
kind: Service
metadata:
name: springcloud-demo
spec:
selector:
app: springcloud-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
5.2 配置中心集成
# config-server/config-repo/application-prod.yml
spring:
cloud:
config:
server:
git:
uri: https://gitlab.com/myorg/config-repo
search-paths: '{application}/{profile}'
通过Sealos与GitLab CI/ArgoCD的深度集成,我们构建了一套完整的SpringCloud项目CI/CD流水线。该方案实现了从代码提交到生产部署的全自动化,支持多环境隔离和智能发布策略。