Build and Release #32
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |