-
Notifications
You must be signed in to change notification settings - Fork 72
115 lines (102 loc) · 3.58 KB
/
Copy pathcd.yml
File metadata and controls
115 lines (102 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
name: CD
on:
push:
branches: [main, develop]
workflow_dispatch:
inputs:
deploy_development:
description: Deploy to the development environment
required: false
default: "false"
type: choice
options:
- "false"
- "true"
deploy_production:
description: Deploy to the production environment
required: false
default: "false"
type: choice
options:
- "false"
- "true"
jobs:
# ========== 部署到开发环境 ==========
deploy-dev:
name: Deploy to Development
runs-on: ubuntu-latest
if: >
(github.event_name == 'workflow_dispatch' && inputs.deploy_development == 'true') ||
(github.ref == 'refs/heads/develop' && vars.ENABLE_DEVELOPMENT_DEPLOY == 'true')
environment:
name: development
url: https://dev.super-dev.example.com
steps:
- uses: actions/checkout@v4
- name: Configure kubectl
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
kubeconfig: ${{ secrets.KUBE_CONFIG_DEV }}
- name: Deploy to Kubernetes
run: |
kubectl apply -f k8s/ -n dev
kubectl rollout restart deployment/super-dev -n dev
- name: Verify deployment
run: |
kubectl rollout status deployment/super-dev -n dev
# ========== 部署到生产环境 ==========
deploy-prod:
name: Deploy to Production
runs-on: ubuntu-latest
if: >
(github.event_name == 'workflow_dispatch' && inputs.deploy_production == 'true') ||
(github.ref == 'refs/heads/main' && vars.ENABLE_PRODUCTION_DEPLOY == 'true')
environment:
name: production
url: https://super-dev.example.com
steps:
- uses: actions/checkout@v4
- name: Configure kubectl
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
kubeconfig: ${{ secrets.KUBE_CONFIG_PROD }}
- name: Create backup
run: |
kubectl get deployment super-dev -n prod -o yaml > backup-${{ github.sha }}.yaml
- name: Deploy to Kubernetes
run: |
kubectl apply -f k8s/ -n prod
kubectl rollout restart deployment/super-dev -n prod
- name: Verify deployment
run: |
kubectl rollout status deployment/super-dev -n prod
- name: Health check
run: |
for i in {1..30}; do
if curl -f https://super-dev.example.com/api/health; then
echo "Health check passed"
exit 0
fi
echo "Waiting for health check... ($i/30)"
sleep 10
done
echo "Health check failed"
exit 1
- name: Rollback on failure
if: failure()
run: |
kubectl rollout undo deployment/super-dev -n prod
- name: Rollback notification
if: failure()
run: |
echo "## ⚠️ Production Deployment Rollback" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Commit:** \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Branch:** \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Triggered by:** ${{ github.actor }}" >> $GITHUB_STEP_SUMMARY
echo "**Timestamp:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "The deployment to **production** failed and was rolled back to the previous version." >> $GITHUB_STEP_SUMMARY
echo "Please investigate the failure and retry the deployment." >> $GITHUB_STEP_SUMMARY