@@ -13,7 +13,7 @@ permissions:
1313
1414jobs :
1515 # ====================================================
16- # Job 1: 核心构建 (只在 Ubuntu 上运行一次,节省资源)
16+ # Job 1: 核心构建
1717 # ====================================================
1818 build :
1919 runs-on : ubuntu-latest
2323 PNPM_VERSION : ' 9.13.2'
2424
2525 steps :
26- - name : Checkout Backend Code
26+ - name : Checkout Code
2727 uses : actions/checkout@v3
2828 with :
2929 repository : Java-Chains/chains
@@ -57,28 +57,19 @@ jobs:
5757 bash mvn_install.sh
5858 cd ..
5959
60- - name : Build and Install java-echo-generator
60+ - name : Build and Install Generators
6161 run : |
6262 git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/java-echo-generator.git java-echo-generator
63- cd java-echo-generator
64- mvn clean install -DskipTests
65- cd ..
66-
67- - name : Build and Install java-memshell-generator
68- run : |
63+ cd java-echo-generator && mvn clean install -DskipTests && cd ..
6964 git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/java-memshell-generator.git java-memshell-generator
70- cd java-memshell-generator
71- mvn clean install -DskipTests
72- cd ..
65+ cd java-memshell-generator && mvn clean install -DskipTests && cd ..
7366
74- # 前端构建
75- - name : Set up Node.js ${{ env.NODE_VERSION }}
67+ - name : Set up Node.js & pnpm
7668 uses : actions/setup-node@v3
7769 with :
7870 node-version : ${{ env.NODE_VERSION }}
7971
80- - name : Setup pnpm
81- uses : pnpm/action-setup@v2
72+ - uses : pnpm/action-setup@v2
8273 with :
8374 version : ${{ env.PNPM_VERSION }}
8475
@@ -89,22 +80,47 @@ jobs:
8980 pnpm install
9081 pnpm build:prod
9182 cd ..
92-
93- - name : Copy Frontend Assets to Backend
94- run : |
9583 mkdir -p java-chains/src/main/resources/static
9684 rm -rf java-chains/src/main/resources/static/*
9785 cp -r java-chains-front/dist/* java-chains/src/main/resources/static/
9886
99- - name : Build Backend
100- run : mvn clean package -DskipTests
87+ - name : Build Backend (Server & CLI)
88+ run : |
89+ mvn clean install -DskipTests -Dmaven.compiler.source=1.8 -Dmaven.compiler.target=1.8
10190
10291 - name : Prepare Base Artifacts
10392 run : |
10493 mkdir release_base
105- cp java-chains-*.jar release_base/java-chains.jar
10694
107- # 克隆配置并在 artifacts 阶段就准备好,避免后续重复克隆
95+ # 1. 复制主程序
96+ echo "Looking for java-chains Jar in ROOT directory..."
97+ SERVER_JAR=$(find . -maxdepth 1 -name "java-chains-*.jar" ! -name "*-sources.jar" ! -name "*-javadoc.jar" ! -name "*.original" | head -n 1)
98+
99+ if [ -f "$SERVER_JAR" ]; then
100+ echo "✅ Found Server Jar at ROOT: $SERVER_JAR"
101+ cp "$SERVER_JAR" release_base/java-chains.jar
102+ else
103+ echo "❌ Error: java-chains jar not found in root directory!"
104+ ls -la
105+ exit 1
106+ fi
107+
108+ # 2. 复制 CLI 工具 (依然需要复制出来,供 Job 4 单独打包,或备用)
109+ CLI_JAR=$(find cli-chains/target -name "cli-chains-*-jar-with-dependencies.jar" | head -n 1)
110+ if [ -z "$CLI_JAR" ]; then
111+ CLI_JAR=$(find . -maxdepth 1 -name "cli-chains-*-jar-with-dependencies.jar" | head -n 1)
112+ fi
113+
114+ if [ -f "$CLI_JAR" ]; then
115+ echo "✅ Found CLI Jar: $CLI_JAR"
116+ cp "$CLI_JAR" release_base/cli-chains.jar
117+ else
118+ echo "❌ Error: cli-chains jar not found!"
119+ ls -R cli-chains/target/
120+ exit 1
121+ fi
122+
123+ # 3. 复制配置
108124 git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/chains-config.git release_base/chains-config
109125 rm -rf release_base/chains-config/.git
110126
@@ -115,15 +131,13 @@ jobs:
115131 path : release_base/
116132
117133 # ====================================================
118- # Job 2: 创建 Release (作为后续上传的目标)
134+ # Job 2: Create Release
119135 # ====================================================
120136 create_release :
121137 needs : build
122138 runs-on : ubuntu-latest
123139 steps :
124- - name : Checkout (Only for GH CLI context)
125- uses : actions/checkout@v3
126-
140+ - uses : actions/checkout@v3
127141 - name : Create Draft Release
128142 env :
129143 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
@@ -135,7 +149,7 @@ jobs:
135149 --notes "Auto-generated release for version ${{ inputs.version }}"
136150
137151 # ====================================================
138- # Job 3: 矩阵打包 (并行处理5种架构 + JDK集成 )
152+ # Job 3: 矩阵打包 (主程序不包含 CLI )
139153 # ====================================================
140154 bundle_assets :
141155 needs : [ build, create_release ]
@@ -144,200 +158,157 @@ jobs:
144158 fail-fast : false
145159 matrix :
146160 include :
147- # AMD Linux
148161 - os_api : linux
149162 arch_api : x64
150163 suffix : linux-amd64
151164 ext : tar.gz
152- # ARM Linux
153165 - os_api : linux
154166 arch_api : aarch64
155167 suffix : linux-aarch64
156168 ext : tar.gz
157- # Windows x64
158169 - os_api : windows
159170 arch_api : x64
160171 suffix : windows-amd64
161172 ext : zip
162- # Intel MacOS
173+ - os_api : windows
174+ arch_api : arm64
175+ suffix : windows-arm64
176+ ext : zip
163177 - os_api : mac
164178 arch_api : x64
165179 suffix : macos-amd64
166180 ext : tar.gz
167- # Apple Silicon (M1/M2/M3)
168181 - os_api : mac
169182 arch_api : aarch64
170183 suffix : macos-aarch64
171184 ext : tar.gz
172185
173186 steps :
174- - name : Download Base Artifacts
175- uses : actions/download-artifact@v4
187+ - uses : actions/download-artifact@v4
176188 with :
177189 name : base-artifacts
178190 path : base
179191
180- - name : Download JDK 8 (${{ matrix.suffix }})
192+ - name : Download JDK 8
181193 run : |
182- # 默认使用 Adoptium API
183194 API_URL="https://api.adoptium.net/v3/binary/latest/8/ga/${{ matrix.os_api }}/${{ matrix.arch_api }}/jdk/hotspot/normal/eclipse"
184195
185- # 特殊处理:如果遇到 macOS aarch64,改用 Azul Zulu 下载链接
186- if [ "${{ matrix.os_api }}" == "mac" ] && [ "${{ matrix.arch_api }}" == "aarch64" ]; then
187- echo "Detected macOS aarch64 (Apple Silicon). Adoptium does not provide JDK 8 for this arch."
188- echo "Switching to Azul Zulu OpenJDK 8..."
189- # Azul Zulu JDK 8 for macOS ARM64 (这是直接下载链接,版本可能会变,建议使用 latest API 或固定版本)
190- # 为了稳定性,这里使用 Azul 的 API 获取最新 JDK 8 LTS
191- API_URL="https://api.azul.com/zulu/download/community/v1.0/bundles/latest/binary/?jdk_version=8&os=macos&arch=arm64&bundle_type=jdk&ext=tar.gz"
196+ USE_AZUL="false"
197+ if [ "${{ matrix.os_api }}" == "mac" ] && [ "${{ matrix.arch_api }}" == "aarch64" ]; then USE_AZUL="true"; fi
198+ if [ "${{ matrix.os_api }}" == "windows" ] && [ "${{ matrix.arch_api }}" == "arm64" ]; then
199+ API_URL="https://api.adoptium.net/v3/binary/latest/8/ga/windows/x64/jdk/hotspot/normal/eclipse"
200+ USE_AZUL="false"
201+ fi
202+
203+ if [ "$USE_AZUL" == "true" ]; then
204+ AZUL_OS="${{ matrix.os_api }}"
205+ if [ "$AZUL_OS" == "mac" ]; then AZUL_OS="macos"; fi
206+ API_URL="https://api.azul.com/zulu/download/community/v1.0/bundles/latest/binary/?jdk_version=8&os=$AZUL_OS&arch=${{ matrix.arch_api }}&bundle_type=jdk&ext=${{ matrix.ext }}"
192207 fi
193-
194- echo "Fetching JDK from: $API_URL"
195208
196209 if [ "${{ matrix.ext }}" == "zip" ]; then
197- # Windows
198- curl -L "$API_URL" -o jdk_bundle.zip
199- unzip -q jdk_bundle.zip -d jdk_extracted
210+ curl -L "$API_URL" -o jdk_bundle.zip && unzip -q jdk_bundle.zip -d jdk_extracted
200211 else
201- # Linux / Mac
202- curl -L "$API_URL" -o jdk_bundle.tar.gz
203- mkdir jdk_extracted
204- tar -xzf jdk_bundle.tar.gz -C jdk_extracted
212+ curl -L "$API_URL" -o jdk_bundle.tar.gz && mkdir jdk_extracted && tar -xzf jdk_bundle.tar.gz -C jdk_extracted
205213 fi
206214
207- # 重命名提取出的 JDK 目录为统一名称 'jdk'
208- # 注意:Azul 和 Adoptium 解压后的目录结构可能略有不同,需要通配符处理
209- # Azul 通常解压后是 zulu8.xx.xx-ca-jdk8.0.xx-macosx_aarch64
210- # Adoptium 解压后是 jdk8uXXX-bXX
211-
212- # 找到 jdk_extracted 下唯一的子目录并移动内容
213215 SUBDIR=$(ls jdk_extracted | head -n 1)
214216 mv "jdk_extracted/$SUBDIR" jdk_final
215-
216- # macOS 特殊处理:macOS 的 JDK 结构通常是 /Contents/Home 才是真正的 JAVA_HOME
217- if [ "${{ matrix.os_api }}" == "mac" ]; then
218- if [ -d "jdk_final/Contents/Home" ]; then
219- echo "Detected macOS bundle structure. Adjusting root..."
220- mv jdk_final/Contents/Home jdk_real
221- rm -rf jdk_final
222- mv jdk_real jdk_final
223- fi
217+ if [ "${{ matrix.os_api }}" == "mac" ] && [ -d "jdk_final/Contents/Home" ]; then
218+ mv jdk_final/Contents/Home jdk_real && rm -rf jdk_final && mv jdk_real jdk_final
224219 fi
225220
226221 - name : Create Distribution Structure
227222 run : |
228223 DIST_DIR="java-chains-${{ inputs.version }}-${{ matrix.suffix }}"
229224 mkdir -p "$DIST_DIR"
230225
231- # 复制 JAR
226+ # ✅ 仅复制主程序和配置
232227 cp base/java-chains.jar "$DIST_DIR/"
233-
234- # 复制 Config
235228 cp -r base/chains-config "$DIST_DIR/"
236-
237- # 移动 JDK
238229 mv jdk_final "$DIST_DIR/jdk"
239230
240231 echo "DIST_DIR=$DIST_DIR" >> $GITHUB_ENV
241232
242- - name : Generate Start Scripts (Linux/Mac)
243- if : matrix.os_api != 'windows'
244- run : |
245- cd ${{ env.DIST_DIR }}
246- cat <<EOF > start.sh
247- #!/bin/bash
248- BASE_DIR=\$(cd "\$(dirname "\$0")" && pwd)
249- "\$BASE_DIR/jdk/bin/java" -jar "\$BASE_DIR/java-chains.jar"
250- EOF
251- chmod +x start.sh
252-
253- - name : Generate Start Scripts (Windows)
254- if : matrix.os_api == 'windows'
233+ - name : Generate Start Scripts
255234 run : |
256235 cd ${{ env.DIST_DIR }}
257- # 创建 Windows 启动脚本
258- cat <<EOF > start.bat
259- @echo off
260- set "BASE_DIR=%~dp0"
261- "%BASE_DIR%jdk\bin\java.exe" -jar "%BASE_DIR%java-chains.jar"
262- pause
263- EOF
236+ # ✅ 只生成主程序的启动脚本
237+ if [ "${{ matrix.os_api }}" != "windows" ]; then
238+ echo '#!/bin/bash' > start.sh
239+ echo 'BASE_DIR=$(cd "$(dirname "$0")" && pwd)' >> start.sh
240+ echo '"$BASE_DIR/jdk/bin/java" -jar "$BASE_DIR/java-chains.jar"' >> start.sh
241+ chmod +x start.sh
242+ else
243+ echo '@echo off' > start.bat
244+ echo 'set "BASE_DIR=%~dp0"' >> start.bat
245+ echo '"%BASE_DIR%jdk\bin\java.exe" -jar "%BASE_DIR%java-chains.jar"' >> start.bat
246+ echo 'pause' >> start.bat
247+ fi
264248
265- - name : Compress Asset
249+ - name : Compress and Upload
250+ env :
251+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
266252 run : |
267253 ASSET_NAME="${{ env.DIST_DIR }}.${{ matrix.ext }}"
268254 if [ "${{ matrix.ext }}" == "zip" ]; then
269255 zip -r -q "$ASSET_NAME" "${{ env.DIST_DIR }}"
270256 else
271257 tar -czf "$ASSET_NAME" "${{ env.DIST_DIR }}"
272258 fi
273- echo "ASSET_NAME=$ASSET_NAME" >> $GITHUB_ENV
274-
275- - name : Upload Asset to Release
276- env :
277- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
278- run : |
279- gh release upload "${{ inputs.version }}" "${{ env.ASSET_NAME }}" --repo "$GITHUB_REPOSITORY"
259+ gh release upload "${{ inputs.version }}" "$ASSET_NAME" --repo "$GITHUB_REPOSITORY"
280260
281261 # ====================================================
282- # Job 4: 上传标准包 (不带 JDK 的通用包)
262+ # Job 4: 上传通用包 & CLI 独立包
283263 # ====================================================
284264 upload_standard_assets :
285265 needs : [ build, create_release ]
286266 runs-on : ubuntu-latest
287267 steps :
288- - name : Download Base Artifacts
289- uses : actions/download-artifact@v4
268+ - uses : actions/download-artifact@v4
290269 with :
291270 name : base-artifacts
292271 path : base
293272
294-
295- - name : Create and Upload Universal Tarball (No JDK)
273+ - name : Create and Upload Assets
296274 env :
297275 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
298276 run : |
299277 cd base
300- # 创建不含 JDK 的纯净版 tar.gz
278+ # 1. 通用包
301279 tar -czvf java-chains-${{ inputs.version }}.tar.gz java-chains.jar chains-config
302-
303- gh release upload "${{ inputs.version }}" \
304- "java-chains-${{ inputs.version }}.tar.gz" \
305- --repo "$GITHUB_REPOSITORY"
280+ gh release upload "${{ inputs.version }}" "java-chains-${{ inputs.version }}.tar.gz" --repo "$GITHUB_REPOSITORY"
281+
282+ # 2. CLI 独立包 (保持不变,单独发布供需要的人下载)
283+ mkdir cli_dist
284+ cp cli-chains.jar cli_dist/
285+ cp -r chains-config cli_dist/
286+ tar -czvf cli-chains-${{ inputs.version }}.tar.gz -C cli_dist .
287+ gh release upload "${{ inputs.version }}" "cli-chains-${{ inputs.version }}.tar.gz" --repo "$GITHUB_REPOSITORY"
306288
307289 # ====================================================
308- # Job 5: 构建并推送 Docker 镜像 (直接使用构建产物)
290+ # Job 5: Docker Build
309291 # ====================================================
310292 docker_build :
311- needs : build # 依赖 build 任务完成
293+ needs : build
312294 runs-on : ubuntu-latest
313295 steps :
314- - name : Checkout Dockerfile
315- uses : actions/checkout@v4
316-
317- # 直接下载 Job 1 生成的临时产物,不需要去 Release 下载
318- - name : Download Base Artifacts
319- uses : actions/download-artifact@v4
296+ - uses : actions/checkout@v4
297+ - uses : actions/download-artifact@v4
320298 with :
321299 name : base-artifacts
322300 path : .
323301
324- # 此时当前目录下有 java-chains.jar 和 chains-config 目录
325- # 正好符合 Dockerfile 的 COPY 需求 (假设你的 Dockerfile 是 COPY 这些文件)
326-
327- - name : Set up QEMU
328- uses : docker/setup-qemu-action@v3
302+ - name : Clean up CLI for Docker context
303+ run : rm -f cli-chains.jar
329304
330- - name : Set up Docker Buildx
331- uses : docker/setup-buildx-action@v3
332-
333- - name : Log in to the Docker hub
334- uses : docker/login-action@v3
305+ - uses : docker/setup-qemu-action@v3
306+ - uses : docker/setup-buildx-action@v3
307+ - uses : docker/login-action@v3
335308 with :
336309 username : ${{ secrets.DOCKER_HUB_USERNAME }}
337310 password : ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
338-
339- - name : Build and push image to Docker Hub
340- uses : docker/build-push-action@v6
311+ - uses : docker/build-push-action@v6
341312 with :
342313 file : Dockerfile
343314 context : .
0 commit comments