88 required : true
99 type : string
1010
11+ permissions :
12+ contents : write
13+
1114jobs :
15+ # ====================================================
16+ # Job 1: 核心构建 (只在 Ubuntu 上运行一次,节省资源)
17+ # ====================================================
1218 build :
1319 runs-on : ubuntu-latest
1420 env :
2228 with :
2329 repository : Java-Chains/chains
2430 token : ${{ secrets.DEPENDENCY_REPO_TOKEN }}
25- fetch-depth : 0 # Required to fetch all history for tag detection
31+ fetch-depth : 0
2632
2733 - name : Set up Temurin JDK ${{ env.JAVA_VERSION }}
2834 uses : actions/setup-java@v4
6571 mvn clean install -DskipTests
6672 cd ..
6773
68- # 前端
74+ # 前端构建
6975 - name : Set up Node.js ${{ env.NODE_VERSION }}
7076 uses : actions/setup-node@v3
7177 with :
@@ -93,81 +99,250 @@ jobs:
9399 - name : Build Backend
94100 run : mvn clean package -DskipTests
95101
96- - name : Create Release Directory
97- run : mkdir release
98-
99- - name : Copy Java-Chains JAR to Release
100- run : cp java-chains-*.jar release/java-chains.jar
101-
102- - name : Copy Chain-All JAR to Release
103- run : cp chains-all-*.jar release /chains-all.jar
102+ - name : Prepare Base Artifacts
103+ run : |
104+ mkdir release_base
105+ cp java-chains-*.jar release_base/java-chains.jar
106+
107+ # 克隆配置并在 artifacts 阶段就准备好,避免后续重复克隆
108+ git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/chains-config.git release_base/chains-config
109+ rm -rf release_base /chains-config/.git
104110
105- - name : Upload Release Artifact (for non-tag pushes)
111+ - name : Upload Base Artifacts
106112 uses : actions/upload-artifact@v4
107113 with :
108- name : release-${{ inputs.version }}
109- path : release/
110-
114+ name : base-artifacts
115+ path : release_base/
111116
112- release_draft :
117+ # ====================================================
118+ # Job 2: 创建 Release (作为后续上传的目标)
119+ # ====================================================
120+ create_release :
113121 needs : build
114- permissions : write-all
115122 runs-on : ubuntu-latest
123+ steps :
124+ - name : Checkout (Only for GH CLI context)
125+ uses : actions/checkout@v3
126+
127+ - name : Create Draft Release
128+ env :
129+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
130+ run : |
131+ gh release create "${{ inputs.version }}" \
132+ --draft \
133+ --title "Release ${{ inputs.version }}" \
134+ --repo "$GITHUB_REPOSITORY" \
135+ --notes "Auto-generated release for version ${{ inputs.version }}"
136+
137+ # ====================================================
138+ # Job 3: 矩阵打包 (并行处理5种架构 + JDK集成)
139+ # ====================================================
140+ bundle_assets :
141+ needs : [ build, create_release ]
142+ runs-on : ubuntu-latest
143+ strategy :
144+ fail-fast : false
145+ matrix :
146+ include :
147+ # AMD Linux
148+ - os_api : linux
149+ arch_api : x64
150+ suffix : linux-amd64
151+ ext : tar.gz
152+ # ARM Linux
153+ - os_api : linux
154+ arch_api : aarch64
155+ suffix : linux-aarch64
156+ ext : tar.gz
157+ # Windows x64
158+ - os_api : windows
159+ arch_api : x64
160+ suffix : windows-amd64
161+ ext : zip
162+ # Intel MacOS
163+ - os_api : mac
164+ arch_api : x64
165+ suffix : macos-amd64
166+ ext : tar.gz
167+ # Apple Silicon (M1/M2/M3)
168+ - os_api : mac
169+ arch_api : aarch64
170+ suffix : macos-aarch64
171+ ext : tar.gz
116172
117173 steps :
118- - name : Download Artifact
174+ - name : Download Base Artifacts
119175 uses : actions/download-artifact@v4
120176 with :
121- name : release-${{ inputs.version }}
122- path : release/
177+ name : base-artifacts
178+ path : base
123179
124- - name : Create Release
125- id : create_release
126- uses : actions/create-release@v1
127- env :
128- GITHUB_TOKEN : ${{ secrets.JAVA_CHAINS_RELEASE_TOKEN }}
129- with :
130- tag_name : ${{ inputs.version }}
131- release_name : Release ${{ inputs.version }}
132- draft : true
180+ - name : Download JDK 8 (${{ matrix.suffix }})
181+ run : |
182+ # 默认使用 Adoptium API
183+ API_URL="https://api.adoptium.net/v3/binary/latest/8/ga/${{ matrix.os_api }}/${{ matrix.arch_api }}/jdk/hotspot/normal/eclipse"
184+
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"
192+ fi
193+
194+ echo "Fetching JDK from: $API_URL"
195+
196+ 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
200+ 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
205+ fi
206+
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 下唯一的子目录并移动内容
213+ SUBDIR=$(ls jdk_extracted | head -n 1)
214+ 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
224+ fi
225+
226+ - name : Create Distribution Structure
227+ run : |
228+ DIST_DIR="java-chains-${{ inputs.version }}-${{ matrix.suffix }}"
229+ mkdir -p "$DIST_DIR"
230+
231+ # 复制 JAR
232+ cp base/java-chains.jar "$DIST_DIR/"
233+
234+ # 复制 Config
235+ cp -r base/chains-config "$DIST_DIR/"
236+
237+ # 移动 JDK
238+ mv jdk_final "$DIST_DIR/jdk"
239+
240+ echo "DIST_DIR=$DIST_DIR" >> $GITHUB_ENV
133241
134- - name : Upload Java-Chains Release Asset
135- id : upload-java-chains-release-asset
136- uses : actions/upload-release-asset@v1
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'
255+ run : |
256+ 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
264+
265+ - name : Compress Asset
266+ run : |
267+ ASSET_NAME="${{ env.DIST_DIR }}.${{ matrix.ext }}"
268+ if [ "${{ matrix.ext }}" == "zip" ]; then
269+ zip -r -q "$ASSET_NAME" "${{ env.DIST_DIR }}"
270+ else
271+ tar -czf "$ASSET_NAME" "${{ env.DIST_DIR }}"
272+ fi
273+ echo "ASSET_NAME=$ASSET_NAME" >> $GITHUB_ENV
274+
275+ - name : Upload Asset to Release
137276 env :
138- GITHUB_TOKEN : ${{ secrets.JAVA_CHAINS_RELEASE_TOKEN }}
277+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
278+ run : |
279+ gh release upload "${{ inputs.version }}" "${{ env.ASSET_NAME }}" --repo "$GITHUB_REPOSITORY"
280+
281+ # ====================================================
282+ # Job 4: 上传标准包 (不带 JDK 的通用包)
283+ # ====================================================
284+ upload_standard_assets :
285+ needs : [ build, create_release ]
286+ runs-on : ubuntu-latest
287+ steps :
288+ - name : Download Base Artifacts
289+ uses : actions/download-artifact@v4
139290 with :
140- upload_url : ${{ steps.create_release.outputs.upload_url }}
141- asset_path : release/java-chains.jar
142- asset_name : java-chains-${{ inputs.version }}.jar
143- asset_content_type : application/java-archive
144-
145- - name : Upload Chains-All Release Asset
146- id : upload-chains-all-release-asset
147- uses : actions/upload-release-asset@v1
291+ name : base-artifacts
292+ path : base
293+
294+
295+ - name : Create and Upload Universal Tarball (No JDK)
148296 env :
149- GITHUB_TOKEN : ${{ secrets.JAVA_CHAINS_RELEASE_TOKEN }}
297+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
298+ run : |
299+ cd base
300+ # 创建不含 JDK 的纯净版 tar.gz
301+ 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"
306+
307+ # ====================================================
308+ # Job 5: 构建并推送 Docker 镜像 (直接使用构建产物)
309+ # ====================================================
310+ docker_build :
311+ needs : build # 依赖 build 任务完成
312+ runs-on : ubuntu-latest
313+ 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
150320 with :
151- upload_url : ${{ steps.create_release.outputs.upload_url }}
152- asset_path : release/chains-all.jar
153- asset_name : chains-all-${{ inputs.version }}.jar
154- asset_content_type : application/java-archive
321+ name : base-artifacts
322+ path : .
155323
156- - name : Clone chains-config And Create Distribution Archive
157- run : |
158- cd release
159- git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/chains-config.git chains-config
160- rm -rf chains-config/.git
161- tar -czvf java-chains-all.tar.gz java-chains.jar chains-config
162- cd ..
324+ # 此时当前目录下有 java-chains.jar 和 chains-config 目录
325+ # 正好符合 Dockerfile 的 COPY 需求 (假设你的 Dockerfile 是 COPY 这些文件)
163326
164- - name : Upload Release Asset (Tarball)
165- id : upload-release-asset-tar
166- uses : actions/upload-release-asset@v1
167- env :
168- GITHUB_TOKEN : ${{ secrets.JAVA_CHAINS_RELEASE_TOKEN }}
327+ - name : Set up QEMU
328+ uses : docker/setup-qemu-action@v3
329+
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
335+ with :
336+ username : ${{ secrets.DOCKER_HUB_USERNAME }}
337+ password : ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
338+
339+ - name : Build and push image to Docker Hub
340+ uses : docker/build-push-action@v6
169341 with :
170- upload_url : ${{ steps.create_release.outputs.upload_url }}
171- asset_path : release/java-chains-all.tar.gz
172- asset_name : java-chains-${{ inputs.version }}-all.tar.gz
173- asset_content_type : application/gzip
342+ file : Dockerfile
343+ context : .
344+ platforms : linux/amd64,linux/arm64
345+ push : true
346+ tags : |
347+ javachains/javachains:${{ inputs.version }}
348+ javachains/javachains:latest
0 commit comments