diff --git a/.github/workflows/BuildLauncher.yml b/.github/workflows/BuildLauncher.yml index 00886d4..5ce31c4 100644 --- a/.github/workflows/BuildLauncher.yml +++ b/.github/workflows/BuildLauncher.yml @@ -1,31 +1,229 @@ name: 构建启动器 -on: workflow_dispatch +on: + workflow_dispatch: # 允许手动触发 + inputs: + build_modules: + description: '构建 Modules' + required: true + default: true + type: boolean + build_launcher: + description: '构建 Launcher' + required: true + default: true + type: boolean + managed_zip_url: + description: 'Managed.zip 文件路径' + required: false + default: '' + type: string + +env: + MODULES_BRANCH: master + LAUNCHER_BRANCH: master + BUILD_BRANCH: main + COMPRESS: true + BUILD_SCRIPT_DIR: /tmp/build + BUILD_SCRIPT_OUTPUT_DIR: ${{ env.BUILD_SCRIPT_DIR }}/output + MANAGED_ZIP_FILE: Managed.zip jobs: - build-launcher: - runs-on: ubuntu-24.04 + build-spt: + runs-on: ubuntu-latest + container: refringe/spt-build-dotnet:2.1.0 + steps: - - id: checkout - name: checkout + - name: 克隆代码 uses: actions/checkout@v4 - - id: build - name: build launcher + - name: 配置环境 run: | - chmod a+x ./bin/* - chmod a+x build-launcher.sh - ./build-launcher.sh -l -c + # 安装必要工具 + echo "安装zip和unzip" + chmod a+x bin/* + cp bin/* /usr/bin/ + + # 创建脚本目录和输出目录 + echo "创建脚本目录${{ env.BUILD_SCRIPT_DIR }}和输出目录${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" + mkdir -p ${{ env.BUILD_SCRIPT_DIR }} + mkdir -p ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} - - id: get-filename - name: get zip filename + # 构建脚本允许执行 + echo "执行脚本赋权,并复制到${{ env.BUILD_SCRIPT_DIR }}" + chmod a+x build.sh + # 复制构建脚本 + cp build.sh ${{ env.BUILD_SCRIPT_DIR }} + + - name: 获取Managed.zip + id: managed + if: ${{ github.event.inputs.build_modules == 'true' }} run: | - ZIP_FILE=$(ls build-output/*.zip) + MANAGED_URL="${{ github.event.inputs.managed_zip_url }}" + + # 检查输入是否为空 + if [ -z "$MANAGED_URL" ]; then + echo "错误:未提供 Managed.zip 路径或URL" + exit 1 + fi + + echo "输入的 Managed.zip 路径: $MANAGED_URL" + + # 检查是否是本地文件路径(以 /、./、../ 开头,或者是文件名) + if [[ "$MANAGED_URL" =~ ^/.* ]] || [[ "$MANAGED_URL" =~ ^\./.* ]] || [[ "$MANAGED_URL" =~ ^\.\./.* ]] || [[ ! "$MANAGED_URL" =~ ^https?:// ]]; then + echo "检测到本地文件路径" + + # 检查文件是否存在 + if [ ! -f "$MANAGED_URL" ]; then + echo "错误:本地文件 $MANAGED_URL 不存在" + echo "当前目录文件列表:" + ls -la + exit 1 + fi + + echo "找到本地文件: $(ls -la "$MANAGED_URL")" + + # 复制本地文件到工作目录 + cp "$MANAGED_URL" ${{ env.MANAGED_ZIP_FILE }} + echo "本地文件复制成功" + else + # 如果是URL,则下载 + echo "检测到URL,开始下载..." + wget -O ${{ env.MANAGED_ZIP_FILE }} "$MANAGED_URL" + + # 验证下载是否成功 + if [ ! -f "${{ env.MANAGED_ZIP_FILE }}" ]; then + echo "错误:Managed.zip 下载失败" + exit 1 + fi + echo "Managed.zip 下载成功" + fi + + # 复制到构建目录 + echo "复制文件到构建目录..." + cp ${{ env.MANAGED_ZIP_FILE }} ${{ env.BUILD_SCRIPT_DIR }} + + FINAL_PATH="${{ env.BUILD_SCRIPT_DIR }}/${{ env.MANAGED_ZIP_FILE }}" + echo "文件准备完成,最终路径: $FINAL_PATH" + echo "final_path=$FINAL_PATH" >> $GITHUB_OUTPUT + + - name: 获取版本信息 + id: versions + run: | + # 设置版本信息 + DATE_TIME=$(date +%Y%m%d) + echo "date_time=$DATE_TIME" >> $GITHUB_OUTPUT + + # 获取 SPT 版本 + SPT_VERSION=$(git ls-remote --tags "https://github.com/sp-tarkov/server-csharp.git" | awk -F'/' '{print $NF}' | grep -v '\^{}' | sort -V | tail -1) + SPT_VERSION=$(echo "$SPT_VERSION" | cut -d'-' -f1) + echo "spt_version=$SPT_VERSION" >> $GITHUB_OUTPUT + echo "SPT Version: $SPT_VERSION" + + # 获取客户端版本 + CLIENT_VERSION=$(wget -qO- "https://raw.githubusercontent.com/sp-tarkov/server-csharp/develop/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json" | jq -r '.compatibleTarkovVersion') + echo "client_version=$CLIENT_VERSION" >> $GITHUB_OUTPUT + echo "Client Version: $CLIENT_VERSION" + + # 获取 Modules Commit ID + MODULES_COMMIT_ID=$(git ls-remote "https://github.com/sp-tarkov/modules.git" "refs/heads/master" | awk '{print $1}') + MODULES_COMMIT_ID=${MODULES_COMMIT_ID:0:8} + echo "modules_commit=$MODULES_COMMIT_ID" >> $GITHUB_OUTPUT + echo "Modules Commit: $MODULES_COMMIT_ID" + + # 获取 Launcher Commit ID + LAUNCHER_COMMIT_ID=$(git ls-remote "https://github.com/sp-tarkov/launcher.git" "refs/heads/master" | awk '{print $1}') + LAUNCHER_COMMIT_ID=${LAUNCHER_COMMIT_ID:0:8} + echo "launcher_commit=$LAUNCHER_COMMIT_ID" >> $GITHUB_OUTPUT + echo "Launcher Commit: $LAUNCHER_COMMIT_ID" + + - name: 生成构建参数 + id: params + run: | + # 是否构建modules + BUILD_MODULES="${{ github.event.inputs.build_modules || 'true' }}" + echo "build_modules=$BUILD_MODULES" >> $GITHUB_OUTPUT + + # 是否构建启动器 + BUILD_LAUNCHER="${{ github.event.inputs.build_launcher || 'true' }}" + echo "build_launcher=$BUILD_LAUNCHER" >> $GITHUB_OUTPUT + + # 构建后是否压缩为zip + COMPRESS="${{ env.COMPRESS }}" + echo "compress=$COMPRESS" >> $GITHUB_OUTPUT + echo "COMPRESS: $COMPRESS" + + # 生成压缩文件名称 + DATE_TIME="${{ steps.versions.outputs.date_time }}" + SPT_VERSION="${{ steps.versions.outputs.spt_version }}" + CLIENT_VERSION="${{ steps.versions.outputs.client_version }}" + MODULES_COMMIT="${{ steps.versions.outputs.modules_commit }}" + LAUNCHER_COMMIT="${{ steps.versions.outputs.launcher_commit }}" + if [ "$BUILD_MODULES" = "true" ] && [ "$BUILD_LAUNCHER" = "true" ]; then + ARCHIVE_NAME="SPT-Launcher-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-L${LAUNCHER_COMMIT}-M${MODULES_COMMIT}.zip" + elif [ "$BUILD_MODULES" = "true" ]; then + ARCHIVE_NAME="SPT-Modules-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-${MODULES_COMMIT}.zip" + else + ARCHIVE_NAME="SPT-Launcher-${SPT_VERSION}-$DATE_TIME-${CLIENT_VERSION}-${LAUNCHER_COMMIT}.zip" + fi + echo "archive_name=$ARCHIVE_NAME" >> $GITHUB_OUTPUT + echo "Archive Name: $ARCHIVE_NAME" + + # 构建modules时的Manage.zip文件路径 + MANAGED_ZIP_FILE="${{ steps.managed.outputs.final_path }}" + echo "managed_zip_file=$MANAGED_ZIP_FILE" >> $GITHUB_OUTPUT + echo "MANAGED_ZIP_FILE: $MANAGED_ZIP_FILE" + + # 构建modules的分支 + MODULES_BRANCH="${{ env.MODULES_BRANCH }}" + echo "modules_branch=$MODULES_BRANCH" >> $GITHUB_OUTPUT + echo "MODULES_BRANCH: $MODULES_BRANCH" + + # 构建launcher的分支 + LAUNCHER_BRANCH="${{ env.LAUNCHER_BRANCH }}" + echo "launcher_branch=$LAUNCHER_BRANCH" >> $GITHUB_OUTPUT + echo "LAUNCHER_BRANCH: $LAUNCHER_BRANCH" + + # 打包时使用的build的分支 + BUILD_BRANCH="${{ env.BUILD_BRANCH }}" + echo "build_branch=$BUILD_BRANCH" >> $GITHUB_OUTPUT + echo "BUILD_BRANCH: $BUILD_BRANCH" + + - name: 构建编译 + run: | + # 执行构建脚本 + ${{ env.BUILD_SCRIPT_DIR }}/build.sh \ + "${{ steps.versions.outputs.date_time }}" \ + "${{ steps.versions.outputs.spt_version }}" \ + "${{ steps.versions.outputs.client_version }}" \ + "${{ steps.versions.outputs.modules_commit }}" \ + "${{ steps.versions.outputs.launcher_commit }}" \ + "${{ steps.params.outputs.build_modules }}" \ + "${{ steps.params.outputs.build_launcher }}" \ + "${{ steps.params.outputs.compress }}" \ + "${{ steps.params.outputs.archive_name }}" \ + "${{ steps.params.outputs.managed_zip_file }}" \ + "${{ steps.params.outputs.modules_branch }}" \ + "${{ steps.params.outputs.launcher_branch }}" \ + "${{ steps.params.outputs.build_branch }}" + + - name: 获取上传文件名称 + id: filename + run: | + if [ ! -d "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" ]; then + echo "错误:输出目录 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 不存在" + exit 1 + fi + ZIP_FILE=$(ls "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}"/*.zip 2>/dev/null | head -1) + if [ -z "$ZIP_FILE" ]; then + echo "错误:在 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 中未找到 zip 文件" + ls -la "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" || echo "目录内容无法列出" + exit 1 + fi echo "zip_file=$ZIP_FILE" >> $GITHUB_OUTPUT echo "artifact_name=$(basename $ZIP_FILE)" >> $GITHUB_OUTPUT - - id: upload - name: upload + - name: 上传 uses: https://github.com/christopherHX/gitea-upload-artifact@v4 with: - name: ${{ steps.get-filename.outputs.artifact_name }} - path: ${{ steps.get-filename.outputs.zip_file }} \ No newline at end of file + name: ${{ steps.filename.outputs.artifact_name }} + path: ${{ steps.filename.outputs.zip_file }} \ No newline at end of file diff --git a/Managed-0.16.9.40087.zip b/Managed-0.16.9.40087.zip new file mode 100644 index 0000000..099bf34 Binary files /dev/null and b/Managed-0.16.9.40087.zip differ diff --git a/bin/unzip b/bin/unzip old mode 100644 new mode 100755 diff --git a/bin/zip b/bin/zip old mode 100644 new mode 100755 diff --git a/build-launcher.sh b/build-launcher.sh index 57e231d..4ee9b63 100644 --- a/build-launcher.sh +++ b/build-launcher.sh @@ -146,243 +146,12 @@ echo "==================" rm -rf "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR" -# 创建构建脚本 -BUILD_SCRIPT="/tmp/spt-build-$$.sh" -cat > "$BUILD_SCRIPT" << 'SCRIPT_EOF' -#!/bin/bash -set -e - -# 参数 -DATE_TIME="$1" -SPT_VERSION="$2" -CLIENT_VERSION="$3" -MODULES_COMMIT_ID="$4" -LAUNCHER_COMMIT_ID="$5" -BUILD_MODULES="$6" -BUILD_LAUNCHER="$7" -COMPRESS="$8" -ARCHIVE_NAME="$9" -MANAGED_ZIP_FILE="${10}" -SPT_MODULES_BRANCH="${11}" -SPT_LAUNCHER_BRANCH="${12}" -SPT_BUILD_BRANCH="${13}" -echo "开始执行构建脚本..." - -# 工作目录 -WORKSPACE="/tmp/build" -mkdir -p "$WORKSPACE" -cd "$WORKSPACE" - -echo "工作目录: $(pwd)" - -# 保存版本信息 -cat > "version.info" << VER_EOF -构建时间: $DATE_TIME -SPT版本: $SPT_VERSION -客户端版本: $CLIENT_VERSION -VER_EOF - -# 根据编译的组件添加相应信息 -if [ "$BUILD_MODULES" = "true" ]; then - cat >> "version.info" << VER_EOF -Modules分支: $SPT_MODULES_BRANCH -Modules Commit: $MODULES_COMMIT_ID -VER_EOF -fi - -if [ "$BUILD_LAUNCHER" = "true" ]; then - cat >> "version.info" << VER_EOF -Launcher分支: $SPT_LAUNCHER_BRANCH -Launcher Commit: $LAUNCHER_COMMIT_ID -VER_EOF -fi - -echo "版本信息已保存" - -# 编译 Modules -if [ "$BUILD_MODULES" = "true" ]; then - echo "=== 开始编译 Modules ===" - - # 克隆 Modules 仓库 - echo "克隆 Modules 仓库..." - git clone https://github.com/sp-tarkov/modules.git --branch "$SPT_MODULES_BRANCH" --depth 1 modules - - # 解压 Managed.zip 文件 - echo "解压 Managed.zip 文件..." - mkdir -p modules/project/Shared/Managed - cd modules/project/Shared/Managed - unzip -q -o "$MANAGED_ZIP_FILE" - echo "Managed.zip 解压完毕." - - # 检查解压后是否有子目录,如果有则移动文件到当前目录 - if [ "$(ls -A | wc -l)" -eq 1 ] && [ -d "$(ls)" ]; then - SUBDIR="$(ls)" - echo "检测到子目录: $SUBDIR,移动文件到当前目录..." - mv "$SUBDIR"/* . 2>/dev/null || true - rmdir "$SUBDIR" 2>/dev/null || true - echo "文件移动完成" - fi - - # 编译 Modules - echo "编译 Modules..." - cd "$WORKSPACE/modules/project" - dotnet build -c Release -p:Version="$SPT_VERSION" - echo "Modules 编译完成!" - - # 复制编译结果 - echo "复制编译结果..." - if [ -d 'Build' ]; then - cp -r Build /output/modules - echo "复制 Build 目录到 /output/modules" - else - mkdir -p /output/modules - find bin/Release -name '*.dll' -o -name '*.exe' -o -name '*.config' | xargs -I {} cp --parents {} /output/modules/ 2>/dev/null || true - echo "复制 bin/Release 文件到 /output/modules" - fi - - cd "$WORKSPACE" - echo "=== Modules 编译完成 ===" -fi - -# 编译 Launcher -if [ "$BUILD_LAUNCHER" = "true" ]; then - echo "=== 开始编译 Launcher ===" - - # 克隆 Launcher 仓库 - echo "克隆 Launcher 仓库..." - git clone https://github.com/sp-tarkov/launcher.git --branch "$SPT_LAUNCHER_BRANCH" --depth 1 launcher - - # 编译 Launcher - echo "编译 Launcher..." - cd launcher/project - dotnet build -c Release - echo "Launcher 编译完成!" - - # 复制编译结果 - echo "复制编译结果..." - if [ -d 'Build' ]; then - cp -r Build /output/launcher - echo "复制 Build 目录到 /output/launcher" - else - mkdir -p /output/launcher - find bin/Release -name '*.dll' -o -name '*.exe' -o -name '*.config' | xargs -I {} cp --parents {} /output/launcher/ 2>/dev/null || true - echo "复制 bin/Release 文件到 /output/launcher" - fi - - mkdir /output/launcher/SPT - mv /output/launcher/SPT_Data /output/launcher/SPT/SPT_Data - mv /output/launcher/SPT.Launcher.exe /output/launcher/SPT/SPT.Launcher.exe - mv /output/launcher/LICENSE-Launcher.txt /output/launcher/SPT/LICENSE-Launcher.txt - - cd "$WORKSPACE" - echo "=== Launcher 编译完成 ===" - - echo "=== 克隆 build 仓库并复制静态资源 ===" - - # 克隆 build 仓库 - echo "克隆 build 仓库..." - git clone https://github.com/sp-tarkov/build.git --branch "$SPT_BUILD_BRANCH" --depth 1 build-repo - - # 复制整个 static-assets-csharp 目录到 launcher - if [ -d "build-repo/static-assets-csharp" ]; then - echo "复制 static-assets-csharp 到 launcher..." - cp -r build-repo/static-assets-csharp/* /output/launcher/ - echo "静态资源复制完成" - else - echo "警告: static-assets-csharp 目录不存在" - fi - - cd "$WORKSPACE" - echo "=== 静态资源复制完成 ===" -fi - -# 复制版本信息 -echo "复制版本信息文件..." -cp "version.info" /output/ - -# 如果是构建全部,将 Modules 整合到 Launcher 中 -if [ "$BUILD_MODULES" = "true" ] && [ "$BUILD_LAUNCHER" = "true" ]; then - echo "=== 整合 Modules 到 Launcher ===" - cd /output - - # 如果存在 launcher 目录,将 modules 内容复制到 launcher 中 - if [ -d "launcher" ] && [ -d "modules" ]; then - echo "将 Modules 文件整合到 Launcher 中..." - - # 复制 Modules 的所有文件到 launcher/Modules - cp -r modules/* launcher/ - - echo "Modules 文件已整合到 Launcher 目录" - - # 删除原始的 modules 目录 - rm -rf modules - fi - - # 如果启用压缩,使用整合后的 launcher 目录进行压缩 - if [ "$COMPRESS" = "true" ]; then - echo "=== 开始压缩整合后的文件 ===" - cd /output - echo "压缩目录: $(pwd)" - echo "压缩文件: $ARCHIVE_NAME" - - zip -r -9 "$ARCHIVE_NAME" . - - # 计算文件信息 - FILE_SIZE=$(stat -c %s "$ARCHIVE_NAME") - FILE_SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $FILE_SIZE / 1024 / 1024}") - FILE_HASH=$(md5sum "$ARCHIVE_NAME" | awk '{print $1}' | xxd -r -p | base64) - - echo "压缩完成: $ARCHIVE_NAME" - echo "文件大小: ${FILE_SIZE_MB} MB" - echo "文件哈希: $FILE_HASH" - - # 清理未压缩的文件 - echo "清理原始文件..." - find . -maxdepth 1 ! -name "$ARCHIVE_NAME" -type f -delete - rm -rf launcher - echo "=== 压缩完成 ===" - fi -else - # 单个组件压缩 - if [ "$COMPRESS" = "true" ]; then - echo "=== 开始压缩 ===" - cd /output - echo "压缩目录: $(pwd)" - echo "压缩文件: $ARCHIVE_NAME" - - zip -r -9 "$ARCHIVE_NAME" . - - # 计算文件信息 - FILE_SIZE=$(stat -c %s "$ARCHIVE_NAME") - FILE_SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $FILE_SIZE / 1024 / 1024}") - FILE_HASH=$(md5sum "$ARCHIVE_NAME" | awk '{print $1}' | xxd -r -p | base64) - - echo "压缩完成: $ARCHIVE_NAME" - echo "文件大小: ${FILE_SIZE_MB} MB" - echo "文件哈希: $FILE_HASH" - - # 清理未压缩的文件 - echo "清理原始文件..." - find . -maxdepth 1 ! -name "$ARCHIVE_NAME" -type f -delete - rm -rf modules launcher - echo "=== 压缩完成 ===" - fi -fi - -echo "所有操作完成!" -SCRIPT_EOF - -# 设置脚本权限 -chmod +x "$BUILD_SCRIPT" - -echo "临时构建脚本已创建: $BUILD_SCRIPT" - # 构建 Docker 命令 DOCKER_CMD="docker run --rm" # 添加必要的卷挂载 -DOCKER_CMD="$DOCKER_CMD -v \"$(pwd)/$OUTPUT_DIR:/output\"" -DOCKER_CMD="$DOCKER_CMD -v \"$BUILD_SCRIPT:/build.sh:ro\"" +DOCKER_CMD="$DOCKER_CMD -v \"$(pwd)/$OUTPUT_DIR:/tmp/build/output\"" +DOCKER_CMD="$DOCKER_CMD -v \"./build.sh:/build.sh:ro\"" DOCKER_CMD="$DOCKER_CMD -v \"./bin/zip:/usr/bin/zip:ro\"" DOCKER_CMD="$DOCKER_CMD -v \"./bin/unzip:/usr/bin/unzip:ro\"" @@ -397,6 +166,9 @@ else MANAGED_ZIP_ARG="" fi +# zip和unzip权限设置为可执行 +chmod a+x bin/* + # 添加容器镜像和构建脚本 DOCKER_CMD="$DOCKER_CMD refringe/spt-build-dotnet:2.1.0" DOCKER_CMD="$DOCKER_CMD /build.sh" @@ -420,9 +192,9 @@ eval $DOCKER_CMD # 最终脚本示例 #docker run --rm \ -# -v "$(pwd)/$OUTPUT_DIR:/output" \ +# -v "$(pwd)/$OUTPUT_DIR:/tmp/build/output" \ # -v "$(realpath $MANAGED_ZIP_FILE):/Managed.zip:ro" \ -# -v "$BUILD_SCRIPT:/build.sh:ro" \ +# -v "./build.sh:/build.sh:ro" \ # -v "./bin/zip:/usr/bin/zip:ro" \ # -v "./bin/unzip:/usr/bin/unzip:ro" \ # refringe/spt-build-dotnet:2.1.0 \ @@ -442,10 +214,6 @@ eval $DOCKER_CMD # "$SPT_BUILD_BRANCH" -# 清理临时脚本 -rm -f "$BUILD_SCRIPT" -echo "临时构建脚本已清理" - echo "" echo "=== 构建完成 ===" if [ "$COMPRESS" = true ]; then diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..d27d9c6 --- /dev/null +++ b/build.sh @@ -0,0 +1,221 @@ +#!/bin/bash +set -e + +# 参数 +DATE_TIME="$1" +SPT_VERSION="$2" +CLIENT_VERSION="$3" +MODULES_COMMIT_ID="$4" +LAUNCHER_COMMIT_ID="$5" +BUILD_MODULES="$6" +BUILD_LAUNCHER="$7" +COMPRESS="$8" +ARCHIVE_NAME="$9" +MANAGED_ZIP_FILE="${10}" +SPT_MODULES_BRANCH="${11}" +SPT_LAUNCHER_BRANCH="${12}" +SPT_BUILD_BRANCH="${13}" +echo "开始执行构建脚本..." + +# 工作目录 +WORKSPACE="/tmp/build" +mkdir -p "$WORKSPACE" +cd "$WORKSPACE" + +echo "工作目录: $(pwd)" + +# 保存版本信息 +cat > "version.info" << VER_EOF +构建时间: $DATE_TIME +SPT版本: $SPT_VERSION +客户端版本: $CLIENT_VERSION +VER_EOF + +# 根据编译的组件添加相应信息 +if [ "$BUILD_MODULES" = "true" ]; then + cat >> "version.info" << VER_EOF +Modules分支: $SPT_MODULES_BRANCH +Modules Commit: $MODULES_COMMIT_ID +VER_EOF +fi + +if [ "$BUILD_LAUNCHER" = "true" ]; then + cat >> "version.info" << VER_EOF +Launcher分支: $SPT_LAUNCHER_BRANCH +Launcher Commit: $LAUNCHER_COMMIT_ID +VER_EOF +fi + +echo "版本信息已保存" + +# 编译 Modules +if [ "$BUILD_MODULES" = "true" ]; then + echo "=== 开始编译 Modules ===" + + # 克隆 Modules 仓库 + echo "克隆 Modules 仓库..." + git clone https://github.com/sp-tarkov/modules.git --branch "$SPT_MODULES_BRANCH" --depth 1 modules + + # 解压 Managed.zip 文件 + echo "解压 Managed.zip 文件..." + mkdir -p modules/project/Shared/Managed + cd modules/project/Shared/Managed + unzip -q -o "$MANAGED_ZIP_FILE" + echo "Managed.zip 解压完毕." + + # 检查解压后是否有子目录,如果有则移动文件到当前目录 + if [ "$(ls -A | wc -l)" -eq 1 ] && [ -d "$(ls)" ]; then + SUBDIR="$(ls)" + echo "检测到子目录: $SUBDIR,移动文件到当前目录..." + mv "$SUBDIR"/* . 2>/dev/null || true + rmdir "$SUBDIR" 2>/dev/null || true + echo "文件移动完成" + fi + + # 编译 Modules + echo "编译 Modules..." + cd "$WORKSPACE/modules/project" + dotnet build -c Release -p:Version="$SPT_VERSION" + echo "Modules 编译完成!" + + # 复制编译结果 + echo "复制编译结果..." + if [ -d 'Build' ]; then + cp -r Build "$WORKSPACE/output/modules" + echo "复制 Build 目录到 $WORKSPACE/output/modules" + else + mkdir -p "$WORKSPACE/output/modules" + find bin/Release -name '*.dll' -o -name '*.exe' -o -name '*.config' | xargs -I {} cp --parents {} "$WORKSPACE/output/modules/" 2>/dev/null || true + echo "复制 bin/Release 文件到 $WORKSPACE/output/modules" + fi + + cd "$WORKSPACE" + echo "=== Modules 编译完成 ===" +fi + +# 编译 Launcher +if [ "$BUILD_LAUNCHER" = "true" ]; then + echo "=== 开始编译 Launcher ===" + + # 克隆 Launcher 仓库 + echo "克隆 Launcher 仓库..." + git clone https://github.com/sp-tarkov/launcher.git --branch "$SPT_LAUNCHER_BRANCH" --depth 1 launcher + + # 编译 Launcher + echo "编译 Launcher..." + cd launcher/project + dotnet build -c Release + echo "Launcher 编译完成!" + + # 复制编译结果 + echo "复制编译结果..." + if [ -d 'Build' ]; then + cp -r Build "$WORKSPACE/output/launcher" + echo "复制 Build 目录到 $WORKSPACE/output/launcher" + else + mkdir -p "$WORKSPACE/output/launcher" + find bin/Release -name '*.dll' -o -name '*.exe' -o -name '*.config' | xargs -I {} cp --parents {} "$WORKSPACE/output/launcher/" 2>/dev/null || true + echo "复制 bin/Release 文件到 $WORKSPACE/output/launcher" + fi + + mkdir "$WORKSPACE/output/launcher/SPT" + mv "$WORKSPACE/output/launcher/SPT_Data" "$WORKSPACE/output/launcher/SPT/SPT_Data" + mv "$WORKSPACE/output/launcher/SPT.Launcher.exe" "$WORKSPACE/output/launcher/SPT/SPT.Launcher.exe" + mv "$WORKSPACE/output/launcher/LICENSE-Launcher.txt" "$WORKSPACE/output/launcher/SPT/LICENSE-Launcher.txt" + + cd "$WORKSPACE" + echo "=== Launcher 编译完成 ===" + + echo "=== 克隆 build 仓库并复制静态资源 ===" + + # 克隆 build 仓库 + echo "克隆 build 仓库..." + git clone https://github.com/sp-tarkov/build.git --branch "$SPT_BUILD_BRANCH" --depth 1 build-repo + + # 复制整个 static-assets-csharp 目录到 launcher + if [ -d "build-repo/static-assets-csharp" ]; then + echo "复制 static-assets-csharp 到 launcher..." + cp -r build-repo/static-assets-csharp/* "$WORKSPACE/output/launcher/" + echo "静态资源复制完成" + else + echo "警告: static-assets-csharp 目录不存在" + fi + + cd "$WORKSPACE" + echo "=== 静态资源复制完成 ===" +fi + +# 复制版本信息 +echo "复制版本信息文件..." +cp "version.info" "$WORKSPACE/output/" + +# 如果是构建全部,将 Modules 整合到 Launcher 中 +if [ "$BUILD_MODULES" = "true" ] && [ "$BUILD_LAUNCHER" = "true" ]; then + echo "=== 整合 Modules 到 Launcher ===" + cd "$WORKSPACE/output" + + # 如果存在 launcher 目录,将 modules 内容复制到 launcher 中 + if [ -d "launcher" ] && [ -d "modules" ]; then + echo "将 Modules 文件整合到 Launcher 中..." + + # 复制 Modules 的所有文件到 launcher/Modules + cp -r modules/* launcher/ + + echo "Modules 文件已整合到 Launcher 目录" + + # 删除原始的 modules 目录 + rm -rf modules + fi + + # 如果启用压缩,使用整合后的 launcher 目录进行压缩 + if [ "$COMPRESS" = "true" ]; then + echo "=== 开始压缩整合后的文件 ===" + cd "$WORKSPACE/output" + echo "压缩目录: $(pwd)" + echo "压缩文件: $ARCHIVE_NAME" + + zip -r -9 "$ARCHIVE_NAME" . + + # 计算文件信息 + FILE_SIZE=$(stat -c %s "$ARCHIVE_NAME") + FILE_SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $FILE_SIZE / 1024 / 1024}") + FILE_HASH=$(md5sum "$ARCHIVE_NAME" | awk '{print $1}' | xxd -r -p | base64) + + echo "压缩完成: $ARCHIVE_NAME" + echo "文件大小: ${FILE_SIZE_MB} MB" + echo "文件哈希: $FILE_HASH" + + # 清理未压缩的文件 + echo "清理原始文件..." + find . -maxdepth 1 ! -name "$ARCHIVE_NAME" -type f -delete + rm -rf launcher + echo "=== 压缩完成 ===" + fi +else + # 单个组件压缩 + if [ "$COMPRESS" = "true" ]; then + echo "=== 开始压缩 ===" + cd "$WORKSPACE/output" + echo "压缩目录: $(pwd)" + echo "压缩文件: $ARCHIVE_NAME" + + zip -r -9 "$ARCHIVE_NAME" . + + # 计算文件信息 + FILE_SIZE=$(stat -c %s "$ARCHIVE_NAME") + FILE_SIZE_MB=$(awk "BEGIN {printf \"%.2f\", $FILE_SIZE / 1024 / 1024}") + FILE_HASH=$(md5sum "$ARCHIVE_NAME" | awk '{print $1}' | xxd -r -p | base64) + + echo "压缩完成: $ARCHIVE_NAME" + echo "文件大小: ${FILE_SIZE_MB} MB" + echo "文件哈希: $FILE_HASH" + + # 清理未压缩的文件 + echo "清理原始文件..." + find . -maxdepth 1 ! -name "$ARCHIVE_NAME" -type f -delete + rm -rf modules launcher + echo "=== 压缩完成 ===" + fi +fi + +echo "所有操作完成!" \ No newline at end of file