Skip to content

Commit 6548747

Browse files
committed
v1.4.2
1 parent dc4dea7 commit 6548747

File tree

4 files changed

+236
-115
lines changed

4 files changed

+236
-115
lines changed

.github/workflows/build-and-release.yml

Lines changed: 236 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ on:
88
required: true
99
type: string
1010

11+
permissions:
12+
contents: write
13+
1114
jobs:
15+
# ====================================================
16+
# Job 1: 核心构建 (只在 Ubuntu 上运行一次,节省资源)
17+
# ====================================================
1218
build:
1319
runs-on: ubuntu-latest
1420
env:
@@ -22,7 +28,7 @@ jobs:
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
@@ -65,7 +71,7 @@ jobs:
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

.github/workflows/release-docker.yml

Lines changed: 0 additions & 54 deletions
This file was deleted.

img/main.png

-42.9 KB
Loading

img/main.zh-cn.png

-47.8 KB
Loading

0 commit comments

Comments
 (0)