Skip to content

Build and Release

Build and Release #32

name: Build and Release
on:
workflow_dispatch:
inputs:
version:
description: "Release version (e.g. 1.3.1)"
required: true
type: string
permissions:
contents: write
jobs:
# ====================================================
# Job 1: 核心构建
# ====================================================
build:
runs-on: ubuntu-latest
env:
JAVA_VERSION: '8'
NODE_VERSION: '23.2.0'
PNPM_VERSION: '9.13.2'
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
repository: Java-Chains/chains
token: ${{ secrets.DEPENDENCY_REPO_TOKEN }}
fetch-depth: 0
- name: Set up Temurin JDK ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ env.JAVA_VERSION }}
cache: 'maven'
- name: Set up Maven
uses: stCarolas/setup-maven@v5
with:
maven-version: 3.9.6
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Clone and Install Dev Jars
run: |
git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/chains-dev-jars.git chains-dev-jars
cd chains-dev-jars
bash mvn_install.sh
cd ..
- name: Build and Install Generators
run: |
git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/java-echo-generator.git java-echo-generator
cd java-echo-generator && mvn clean install -DskipTests && cd ..
git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/java-memshell-generator.git java-memshell-generator
cd java-memshell-generator && mvn clean install -DskipTests && cd ..
- name: Set up Node.js & pnpm
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- uses: pnpm/action-setup@v2
with:
version: ${{ env.PNPM_VERSION }}
- name: Build Frontend
run: |
git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-chains/java-chains-front.git java-chains-front
cd java-chains-front
pnpm install
pnpm build:prod
cd ..
mkdir -p java-chains/src/main/resources/static
rm -rf java-chains/src/main/resources/static/*
cp -r java-chains-front/dist/* java-chains/src/main/resources/static/
- name: Build Backend (Server & CLI)
run: |
mvn clean install -DskipTests -Dmaven.compiler.source=1.8 -Dmaven.compiler.target=1.8
- name: Prepare Base Artifacts
run: |
mkdir release_base
# 1. 复制主程序
echo "Looking for java-chains Jar in ROOT directory..."
SERVER_JAR=$(find . -maxdepth 1 -name "java-chains-*.jar" ! -name "*-sources.jar" ! -name "*-javadoc.jar" ! -name "*.original" | head -n 1)
if [ -f "$SERVER_JAR" ]; then
echo "✅ Found Server Jar at ROOT: $SERVER_JAR"
cp "$SERVER_JAR" release_base/java-chains.jar
else
echo "❌ Error: java-chains jar not found in root directory!"
ls -la
exit 1
fi
# 2. 复制 CLI 工具 (依然需要复制出来,供 Job 4 单独打包,或备用)
CLI_JAR=$(find cli-chains/target -name "cli-chains-*-jar-with-dependencies.jar" | head -n 1)
if [ -z "$CLI_JAR" ]; then
CLI_JAR=$(find . -maxdepth 1 -name "cli-chains-*-jar-with-dependencies.jar" | head -n 1)
fi
if [ -f "$CLI_JAR" ]; then
echo "✅ Found CLI Jar: $CLI_JAR"
cp "$CLI_JAR" release_base/cli-chains.jar
else
echo "❌ Error: cli-chains jar not found!"
ls -R cli-chains/target/
exit 1
fi
# 3. 复制配置
git clone https://${{ secrets.DEPENDENCY_REPO_TOKEN }}@github.com/Java-Chains/chains-config.git release_base/chains-config
rm -rf release_base/chains-config/.git
- name: Upload Base Artifacts
uses: actions/upload-artifact@v4
with:
name: base-artifacts
path: release_base/
# ====================================================
# Job 2: Create Release
# ====================================================
create_release:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Create Draft Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "${{ inputs.version }}" \
--draft \
--title "Release ${{ inputs.version }}" \
--repo "$GITHUB_REPOSITORY" \
--notes "Auto-generated release for version ${{ inputs.version }}"
# ====================================================
# Job 3: 矩阵打包 (主程序不包含 CLI)
# ====================================================
bundle_assets:
needs: [ build, create_release ]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- os_api: linux
arch_api: x64
suffix: linux-amd64
ext: tar.gz
- os_api: linux
arch_api: aarch64
suffix: linux-aarch64
ext: tar.gz
- os_api: windows
arch_api: x64
suffix: windows-amd64
ext: zip
- os_api: windows
arch_api: arm64
suffix: windows-arm64
ext: zip
- os_api: mac
arch_api: x64
suffix: macos-amd64
ext: tar.gz
- os_api: mac
arch_api: aarch64
suffix: macos-aarch64
ext: tar.gz
steps:
- uses: actions/download-artifact@v4
with:
name: base-artifacts
path: base
- name: Download JDK 8
run: |
API_URL="https://api.adoptium.net/v3/binary/latest/8/ga/${{ matrix.os_api }}/${{ matrix.arch_api }}/jdk/hotspot/normal/eclipse"
USE_AZUL="false"
if [ "${{ matrix.os_api }}" == "mac" ] && [ "${{ matrix.arch_api }}" == "aarch64" ]; then USE_AZUL="true"; fi
if [ "${{ matrix.os_api }}" == "windows" ] && [ "${{ matrix.arch_api }}" == "arm64" ]; then
API_URL="https://api.adoptium.net/v3/binary/latest/8/ga/windows/x64/jdk/hotspot/normal/eclipse"
USE_AZUL="false"
fi
if [ "$USE_AZUL" == "true" ]; then
AZUL_OS="${{ matrix.os_api }}"
if [ "$AZUL_OS" == "mac" ]; then AZUL_OS="macos"; fi
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 }}"
fi
if [ "${{ matrix.ext }}" == "zip" ]; then
curl -L "$API_URL" -o jdk_bundle.zip && unzip -q jdk_bundle.zip -d jdk_extracted
else
curl -L "$API_URL" -o jdk_bundle.tar.gz && mkdir jdk_extracted && tar -xzf jdk_bundle.tar.gz -C jdk_extracted
fi
SUBDIR=$(ls jdk_extracted | head -n 1)
mv "jdk_extracted/$SUBDIR" jdk_final
if [ "${{ matrix.os_api }}" == "mac" ] && [ -d "jdk_final/Contents/Home" ]; then
mv jdk_final/Contents/Home jdk_real && rm -rf jdk_final && mv jdk_real jdk_final
fi
- name: Create Distribution Structure
run: |
DIST_DIR="java-chains-${{ inputs.version }}-${{ matrix.suffix }}"
mkdir -p "$DIST_DIR"
# ✅ 仅复制主程序和配置
cp base/java-chains.jar "$DIST_DIR/"
cp -r base/chains-config "$DIST_DIR/"
mv jdk_final "$DIST_DIR/jdk"
echo "DIST_DIR=$DIST_DIR" >> $GITHUB_ENV
- name: Generate Start Scripts
run: |
cd ${{ env.DIST_DIR }}
# ✅ 只生成主程序的启动脚本
if [ "${{ matrix.os_api }}" != "windows" ]; then
echo '#!/bin/bash' > start.sh
echo 'BASE_DIR=$(cd "$(dirname "$0")" && pwd)' >> start.sh
echo '"$BASE_DIR/jdk/bin/java" -jar "$BASE_DIR/java-chains.jar"' >> start.sh
chmod +x start.sh
else
echo '@echo off' > start.bat
echo 'set "BASE_DIR=%~dp0"' >> start.bat
echo '"%BASE_DIR%jdk\bin\java.exe" -jar "%BASE_DIR%java-chains.jar"' >> start.bat
echo 'pause' >> start.bat
fi
- name: Compress and Upload
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ASSET_NAME="${{ env.DIST_DIR }}.${{ matrix.ext }}"
if [ "${{ matrix.ext }}" == "zip" ]; then
zip -r -q "$ASSET_NAME" "${{ env.DIST_DIR }}"
else
tar -czf "$ASSET_NAME" "${{ env.DIST_DIR }}"
fi
gh release upload "${{ inputs.version }}" "$ASSET_NAME" --repo "$GITHUB_REPOSITORY"
# ====================================================
# Job 4: 上传通用包 & CLI 独立包
# ====================================================
upload_standard_assets:
needs: [ build, create_release ]
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: base-artifacts
path: base
- name: Create and Upload Assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd base
# 1. 通用包
tar -czvf java-chains-${{ inputs.version }}.tar.gz java-chains.jar chains-config
gh release upload "${{ inputs.version }}" "java-chains-${{ inputs.version }}.tar.gz" --repo "$GITHUB_REPOSITORY"
# 2. CLI 独立包 (保持不变,单独发布供需要的人下载)
mkdir cli_dist
cp cli-chains.jar cli_dist/
cp -r chains-config cli_dist/
tar -czvf cli-chains-${{ inputs.version }}.tar.gz -C cli_dist .
gh release upload "${{ inputs.version }}" "cli-chains-${{ inputs.version }}.tar.gz" --repo "$GITHUB_REPOSITORY"
# ====================================================
# Job 5: Docker Build
# ====================================================
docker_build:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: base-artifacts
path: .
- name: Clean up CLI for Docker context
run: rm -f cli-chains.jar
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- uses: docker/build-push-action@v6
with:
file: Dockerfile
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
javachains/javachains:${{ inputs.version }}
javachains/javachains:latest