-
Notifications
You must be signed in to change notification settings - Fork 0
209 lines (180 loc) · 6.73 KB
/
Copy pathci.yml
File metadata and controls
209 lines (180 loc) · 6.73 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# OpenBlog:push 到 master 时编译后端、打包前端,并将静态资源与 Docker 相关文件同步到阿里云,在服务器执行 docker.sh 更新 Nginx 容器。
# 后端部署到内网自托管 Runner。
#
# 需在仓库 Settings → Secrets and variables → Actions 中配置:
# SERVER_SSH_KEY 服务器 SSH 私钥(完整 PEM)
# SERVER_REMOTE_HOST 公网 IP 或域名
# SERVER_REMOTE_USER SSH 登录用户(如 root 或 deploy)
# SERVER_TARGET 服务器上部署目录绝对路径(如 /opt/openblog/web),该目录下会有 dist、Dockerfile、docker.sh、nginx.conf
#
# 后端 Spring Boot 需在**同一台机器宿主机**上监听 8082(java -jar 或 systemd),容器内 Nginx 通过 host.docker.internal 反代到宿主机。
# 前端容器默认映射宿主机端口 18088 → 容器 80,访问 http://IP:18088/ ,请在安全组放行 TCP 18088。
name: Build and deploy OpenBlog
on:
workflow_dispatch:
push:
branches:
- master
paths:
- 'OpenBlog-business/**'
- 'OpenBlog-framework*/**'
- 'vue/**'
- 'pom.xml'
- '.github/workflows/ci.yml'
jobs:
# 检测变更范围,供后续 job 条件判断
changes:
runs-on: ubuntu-latest
outputs:
backend: ${{ steps.filter.outputs.backend }}
frontend: ${{ steps.filter.outputs.frontend }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
backend:
- 'OpenBlog-business/**'
- 'OpenBlog-framework*/**'
- 'OpenBlog-email/**'
- 'OpenBlog-email-api/**'
- 'pom.xml'
frontend:
- 'vue/**'
build-backend:
needs: changes
if: ${{ needs.changes.outputs.backend == 'true' || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: "temurin"
cache: "maven"
- name: Build backend (Maven)
run: mvn -B -ntp package -DskipTests -pl OpenBlog-business -am
- name: Upload backend JAR
uses: actions/upload-artifact@v4
with:
name: backend-jar
path: OpenBlog-business/target/OpenBlog-business-*.jar
retention-days: 1
deploy-backend:
needs: build-backend
if: ${{ needs.build-backend.result == 'success' || github.event_name == 'workflow_dispatch' }}
runs-on: openblog-backend
steps:
- name: Download backend JAR
uses: actions/download-artifact@v4
with:
name: backend-jar
- name: Deploy to internal server
run: |
JAR_FILE=$(ls OpenBlog-business-*.jar | head -1)
TARGET_DIR="/www/wwwroot/java/openblog"
TARGET_JAR="$TARGET_DIR/OpenBlog-business-1.0.0-SNAPSHOT.jar"
JAVA_HOME="/www/server/java/jdk-17.0.8"
SERVICE_NAME="openblog"
# 确保 systemd service 文件存在
if [ ! -f /etc/systemd/system/${SERVICE_NAME}.service ]; then
cat > /etc/systemd/system/${SERVICE_NAME}.service << 'SVC'
[Unit]
Description=OpenBlog Backend
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/www/wwwroot/java/openblog
ExecStart=/www/server/java/jdk-17.0.8/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/java/openblog/OpenBlog-business-1.0.0-SNAPSHOT.jar
Restart=on-failure
RestartSec=10
StandardOutput=append:/www/wwwroot/java/openblog/app.log
StandardError=append:/www/wwwroot/java/openblog/app.log
[Install]
WantedBy=multi-user.target
SVC
systemctl daemon-reload
fi
# 停止旧服务
systemctl stop ${SERVICE_NAME} || true
# 备份旧 jar
if [ -f "$TARGET_JAR" ]; then
mkdir -p "$TARGET_DIR/backup"
cp "$TARGET_JAR" "$TARGET_DIR/backup/OpenBlog-business-$(date +%Y%m%d-%H%M%S).jar" 2>/dev/null || true
fi
# 复制新 jar
cp "$JAR_FILE" "$TARGET_JAR"
# 启动服务
systemctl start ${SERVICE_NAME}
echo "Deployed $JAR_FILE → $TARGET_JAR"
systemctl status ${SERVICE_NAME} --no-pager || true
build-frontend:
needs: changes
if: ${{ needs.changes.outputs.frontend == 'true' || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "npm"
cache-dependency-path: vue/package-lock.json
- name: Install frontend dependencies and build
working-directory: vue
run: |
npm ci
npm run build
- name: Prepare release bundle for server
run: |
mkdir -p release
cp -r vue/dist release/dist
cp vue/Dockerfile vue/docker.sh vue/nginx.conf release/
- name: Build Docker image on runner
run: |
docker build -t openblog-web release/
docker save openblog-web | gzip > release/openblog-web.tar.gz
- name: Upload release bundle
uses: actions/upload-artifact@v4
with:
name: release-frontend
path: release/
deploy-frontend:
needs: build-frontend
if: ${{ needs.build-frontend.result == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Download release bundle
uses: actions/download-artifact@v4
with:
name: release-frontend
path: release/
- name: Deploy files to server
uses: easingthemes/ssh-deploy@v5.1.1
with:
SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
ARGS: "-rlgoDzvc --delete --exclude=dist/.user.ini"
SOURCE: "release/dist release/Dockerfile release/docker.sh release/nginx.conf release/openblog-web.tar.gz"
REMOTE_HOST: ${{ secrets.SERVER_REMOTE_HOST }}
REMOTE_USER: ${{ secrets.SERVER_REMOTE_USER }}
TARGET: ${{ secrets.SERVER_TARGET }}
SCRIPT_BEFORE: ls -la
- name: Run Docker commands on server
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.SERVER_REMOTE_HOST }}
username: ${{ secrets.SERVER_REMOTE_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
command_timeout: 30m
script: |
cd ${{ secrets.SERVER_TARGET }}
sh docker.sh