Compare commits

...

54 Commits

Author SHA1 Message Date
杨黄林
2bb6f4497f Update BuildLauncher.yml 2026-01-11 23:35:21 +08:00
杨黄林
2aad592da7 Update Dockerfile 2026-01-11 23:32:10 +08:00
杨黄林
64d19ca401 Update Dockerfile 2026-01-11 23:28:32 +08:00
杨黄林
ab4288d289 Update Dockerfile for build parameters 2026-01-11 23:22:36 +08:00
杨黄林
22252d4539 Update Docker container to nightly SDK version 2026-01-11 23:18:22 +08:00
杨黄林
bd4c31d40d Update Dockerfile 2026-01-11 23:15:44 +08:00
杨黄林
6ca5b5d64a server改回develop分支 2025-12-17 12:53:00 +08:00
44d24bc2fc server改为main分支 2025-12-12 23:29:44 +08:00
987b71a6b3 改为main分支 2025-12-12 23:27:14 +08:00
f608e2ed38 变更镜像地址 2025-11-26 13:50:45 +08:00
yhl452493373
054caa7721 launcher构建镜像切换为微软的dotnet sdk 9.0 2025-11-22 16:32:38 +08:00
yhl452493373
1903273938 更换容器 2025-11-22 16:26:55 +08:00
yhl452493373
44ea36eff5 增加ubuntu-22.04 2025-11-22 16:19:07 +08:00
yhl452493373
1a54cfa2b9 更新工作流 2025-11-22 16:17:55 +08:00
yhl452493373
cd2f3a2d10 更新工作流 2025-11-22 16:17:22 +08:00
yhl452493373
3d2d4a4533 服务端由debian改为alpine 2025-11-22 02:36:54 +08:00
yhl452493373
e937850d37 增加清理镜像功能 2025-11-22 01:01:39 +08:00
yhl452493373
43c080f13c 调整构建脚本 2025-11-22 00:39:02 +08:00
yhl452493373
35ee9e119e 更新说明,构建服务端时,支持传入docker hub用户名 2025-11-22 00:31:08 +08:00
yhl452493373
33c7cb2475 更新说明 2025-11-22 00:21:48 +08:00
yhl452493373
0b952b740d 更新说明 2025-11-22 00:21:03 +08:00
yhl452493373
b9092320c2 指定构建镜像为amd64 2025-11-22 00:19:58 +08:00
yhl452493373
cd44cb9c7c 优化说明 2025-11-22 00:08:00 +08:00
yhl452493373
5dd3d42605 优化说明 2025-11-22 00:06:54 +08:00
yhl452493373
d3315cf45c 优化说明 2025-11-22 00:05:18 +08:00
yhl452493373
eb89dca53b 优化说明 2025-11-22 00:01:24 +08:00
yhl452493373
f8ae6319f5 优化说明 2025-11-21 23:59:04 +08:00
yhl452493373
4ec2ea1a7f 移除工作流中多余步骤 2025-11-21 23:49:28 +08:00
yhl452493373
9e76c29231 优化工作流,使用buildx构建 2025-11-21 23:46:10 +08:00
yhl452493373
cf2c0d3619 优化工作流 2025-11-21 23:30:25 +08:00
yhl452493373
79c4e5513b 优化工作流 2025-11-21 23:29:54 +08:00
yhl452493373
960ee44e9c 优化工作流 2025-11-21 23:27:18 +08:00
yhl452493373
231a8337e9 优化工作流,增加构建docker镜像的工作流 2025-11-21 23:25:39 +08:00
2b046e4684 更新工作流 2025-11-21 19:23:56 +08:00
9e03812171 更新工作流 2025-11-21 19:18:42 +08:00
8ceb323cda 更新工作流 2025-11-21 19:17:20 +08:00
0c6491b222 更新工作流 2025-11-21 19:13:11 +08:00
dfe4e90981 更新工作流 2025-11-21 19:10:45 +08:00
2f2f58f90c 更新工作流 2025-11-21 19:08:44 +08:00
52162dcdc7 更新工作流 2025-11-21 19:05:36 +08:00
9dcf38f2bd 更新工作流 2025-11-21 19:02:33 +08:00
8cb587ed3a 更新工作流 2025-11-21 19:02:06 +08:00
98b0541d0a 更新工作流 2025-11-21 18:58:11 +08:00
dabfbd2108 更新工作流 2025-11-21 18:52:32 +08:00
31139ab6ad 更新工作流 2025-11-21 18:33:00 +08:00
151407face 更新工作流 2025-11-21 18:29:24 +08:00
5045f066f0 wget改成curl 2025-11-21 18:16:03 +08:00
75106a43f2 更新工作流 2025-11-21 18:10:34 +08:00
7d0c765b85 更新工作流 2025-11-21 18:05:58 +08:00
f9b4496d4d 更新README 2025-11-21 17:43:17 +08:00
694ed8aa70 优化构建工作流和脚本,增加0.16.9.40087的Managed 2025-11-21 17:23:15 +08:00
69da42ed00 上传时指定附件名 2025-11-21 13:55:42 +08:00
2c982a8ac5 更新upload的actions 2025-11-21 13:46:48 +08:00
621b3adf14 增加上传 2025-11-21 13:41:56 +08:00
11 changed files with 756 additions and 312 deletions

View File

@@ -1,14 +1,246 @@
name: 构建启动器 name: 构建启动器
on: workflow_dispatch on:
workflow_dispatch:
inputs:
runner_os:
description: 选择运行器系统
type: choice
required: true
default: 'ubuntu-latest'
options:
- ubuntu-latest
- ubuntu-24.04
- ubuntu-22.04
- ubuntu-host
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: /tmp/build/output
MANAGED_ZIP_FILE: Managed.zip
jobs: jobs:
build-launcher: build-launcher:
runs-on: ubuntu-24.04 runs-on: ${{ inputs.runner_os }}
container: mcr.microsoft.com/dotnet/sdk:10.0
defaults:
run:
shell: bash
steps: steps:
- name: checkout - name: 安装必要工具
uses: actions/checkout@v4
- name: build launcher
run: | run: |
chmod a+x ./bin/* # 安装必要工具
chmod a+x build-launcher.sh apt update -y
./build-launcher.sh -l -c apt install zip unzip nodejs -y
- name: 检出代码
uses: actions/checkout@v4
- name: 配置环境
run: |
# 创建脚本目录和输出目录
echo "创建脚本目录${{ env.BUILD_SCRIPT_DIR }}和输出目录${{ env.BUILD_SCRIPT_OUTPUT_DIR }}"
mkdir -p ${{ env.BUILD_SCRIPT_DIR }}
mkdir -p ${{ env.BUILD_SCRIPT_OUTPUT_DIR }}
# 构建脚本允许执行
echo "执行脚本赋权,并复制到${{ env.BUILD_SCRIPT_DIR }}"
chmod a+x build.sh
# 复制构建脚本
cp build.sh ${{ env.BUILD_SCRIPT_DIR }}
- name: 获取 Managed.zip
id: managed
if: inputs.build_modules == true
run: |
MANAGED_URL="${{ inputs.managed_zip_url }}"
if [ -z "$MANAGED_URL" ]; then
echo "错误:未提供 Managed.zip 路径或URL"
exit 1
fi
echo "输入的 Managed.zip 路径: $MANAGED_URL"
# 如果是http或https开头就是URL否则就是本地文件
if [[ "$MANAGED_URL" =~ ^https?:// ]]; then
echo "检测到URL开始下载..."
curl -L -o ${{ env.MANAGED_ZIP_FILE }} "$MANAGED_URL"
if [ ! -f "${{ env.MANAGED_ZIP_FILE }}" ]; then
echo "错误Managed.zip 下载失败"
exit 1
fi
echo "Managed.zip 下载成功"
else
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 "本地文件复制成功"
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=$(curl -s "https://raw.githubusercontent.com/sp-tarkov/server-csharp/develop/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json" | grep -o '"compatibleTarkovVersion":[[:space:]]*"[^"]*"' | sed -E 's/.*: *"([^"]*)".*/\1/')
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="${{ inputs.build_modules || 'true' }}"
echo "build_modules=$BUILD_MODULES" >> $GITHUB_OUTPUT
# 是否构建启动器
BUILD_LAUNCHER="${{ 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"
echo "构建日期: $DATE_TIME"
- name: 构建编译
run: |
# 执行构建脚本
echo "开始构建"
${{ 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: file_info
run: |
if [ ! -d "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" ]; then
echo "错误:输出目录 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 不存在"
exit 1
fi
cd ${{ env.BUILD_SCRIPT_OUTPUT_DIR }}
ZIP_FILE_NAME=$(ls *.zip 2>/dev/null | head -1)
ZIP_FILE_PATH="${{ env.BUILD_SCRIPT_OUTPUT_DIR }}/$ZIP_FILE_NAME"
if [ -z "$ZIP_FILE_NAME" ]; then
echo "错误:在 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 中未找到 zip 文件"
ls -la "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" || echo "目录内容无法列出"
exit 1
fi
echo "zip_file_path=$ZIP_FILE_PATH" >> $GITHUB_OUTPUT
echo "ZIP_FILE_PATH: $ZIP_FILE_PATH"
echo "zip_file_name=$ZIP_FILE_NAME" >> $GITHUB_OUTPUT
echo "ZIP_FILE_NAME: $ZIP_FILE_NAME"
- name: 上传
uses: christopherHX/gitea-upload-artifact@v4
with:
name: ${{ steps.file_info.outputs.zip_file_name }}
path: ${{ steps.file_info.outputs.zip_file_path }}

175
.github/workflows/BuildServer.yml vendored Normal file
View File

@@ -0,0 +1,175 @@
name: 构建服务端镜像
on:
workflow_dispatch:
inputs:
runner_os:
description: 选择运行器系统
type: choice
required: true
default: 'ubuntu-latest'
options:
- ubuntu-latest
- ubuntu-24.04
- ubuntu-22.04
- ubuntu-host
push_to_docker:
description: 推送到 Docker Hub
type: boolean
default: false
required: true
output_path:
description: 镜像输出路径
type: string
required: false
env:
IMAGE_TAG_FILE: image_tag.txt
IMAGE_FILE: spt-server-image.tar
jobs:
build-server:
runs-on: ${{ inputs.runner_os }}
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 检查 Docker Hub 配置
id: docker-config
run: |
if [ "${{ inputs.push_to_docker }}" = "true" ]; then
if [ -z "${{ secrets.DOCKERHUB_USERNAME }}" ] || [ -z "${{ secrets.DOCKERHUB_TOKEN }}" ]; then
echo "Docker Hub 用户名或令牌未配置,无法推送镜像"
echo "push_available=false" >> $GITHUB_OUTPUT
else
echo "Docker Hub 配置检查通过"
echo "push_available=true" >> $GITHUB_OUTPUT
fi
else
echo "用户选择不推送到 Docker Hub"
echo "push_available=false" >> $GITHUB_OUTPUT
fi
- name: 登录 Docker Hub
if: steps.docker-config.outputs.push_available == 'true'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: 设置构建脚本执行权限
run: chmod +x build-server.sh
- name: 构建 Docker 镜像
run: |
# 运行构建脚本
if [ -n "${{ secrets.DOCKERHUB_USERNAME }}" ]; then
echo "使用 secrets 中的 Docker Hub 用户名"
./build-server.sh "${{ secrets.DOCKERHUB_USERNAME }}"
else
echo "使用默认 Docker Hub 用户名"
./build-server.sh
fi
- name: 获取镜像标签
id: exist-tag
run: |
# 从文件中读取镜像标签
if [ -f ${{ env.IMAGE_TAG_FILE }} ]; then
TAG=$(cat ${{ env.IMAGE_TAG_FILE }} | head -1)
echo "从文件读取镜像标签: $TAG"
echo "tag=$TAG" >> $GITHUB_OUTPUT
else
echo "错误:${{ env.IMAGE_TAG_FILE }} 文件不存在,构建可能失败"
exit 1
fi
- name: 导出构建镜像
if: inputs.output_path != ''
run: |
# 临时导出镜像
docker save -o ${{ env.IMAGE_FILE }} ${{ steps.exist-tag.outputs.tag }}
echo "镜像已临时导出为: ${{ env.IMAGE_FILE }}"
- name: 复制镜像到输出目录
if: inputs.output_path != ''
run: |
# 创建输出目录并复制镜像
mkdir -p ${{ inputs.output_path }}
cp ${{ env.IMAGE_FILE }} ${{ inputs.output_path }}/
echo "镜像已复制到: ${{ inputs.output_path }}/${{ env.IMAGE_FILE }}"
- name: 清理临时文件
if: inputs.output_path != ''
run: |
# 删除临时文件
rm -f ${{ env.IMAGE_FILE }}
echo "已清理临时镜像文件"
- name: 推送 Docker 镜像
if: steps.docker-config.outputs.push_available == 'true'
run: |
docker push ${{ steps.exist-tag.outputs.tag }}
- name: 构建结果
run: |
echo "=== 构建结果 ==="
echo "运行器操作系统: ${{ inputs.runner_os }}"
echo "镜像标签: ${{ steps.exist-tag.outputs.tag }}"
echo "用户选择推送到 Docker Hub: ${{ inputs.push_to_docker }}"
echo "实际是否推送到 Docker Hub: ${{ steps.docker-config.outputs.push_available }}"
if [ "${{ inputs.output_path }}" != "" ]; then
echo "镜像文件保存到: ${{ inputs.output_path }}/${{ env.IMAGE_FILE }}"
else
echo "未提供输出路径,镜像文件未保存"
fi
if [ "${{ steps.docker-config.outputs.push_available }}" = "true" ]; then
echo "已推送到 Docker Hub"
echo "推送的标签: ${{ steps.exist-tag.outputs.tag }}"
else
if [ "${{ inputs.push_to_docker }}" = "true" ]; then
echo "推送失败Docker Hub 用户名或令牌未配置"
else
echo "镜像仅本地构建,用户选择不推送到 Docker Hub"
fi
fi
- name: 清理 Docker 镜像和缓存
run: |
echo "=== 开始清理 Docker 资源 ==="
# 1. 删除构建的镜像
IMAGE_TAG="${{ steps.exist-tag.outputs.tag }}"
if [ -n "$IMAGE_TAG" ]; then
echo "删除构建的镜像: $IMAGE_TAG"
docker rmi $IMAGE_TAG 2>/dev/null || echo "镜像已删除或不存在"
else
echo "未获取到镜像标签,跳过镜像删除"
fi
# 2. 清理所有悬空镜像
echo "清理悬空镜像..."
DANGLING_IMAGES=$(docker images -f "dangling=true" -q)
if [ -n "$DANGLING_IMAGES" ]; then
docker rmi $DANGLING_IMAGES 2>/dev/null || true
echo "已清理悬空镜像"
else
echo "无悬空镜像需要清理"
fi
# 3. 在磁盘空间不足时清理构建缓存
echo "检查磁盘使用情况..."
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 90 ]; then
echo "磁盘使用率 ${DISK_USAGE}%,清理构建缓存"
docker buildx prune -f
echo "构建缓存已清理"
else
echo "磁盘使用率 ${DISK_USAGE}%,保留构建缓存"
fi
echo "资源清理完成"

View File

@@ -1,34 +1,52 @@
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS server-builder # ================================
# BUILD STAGE
# ================================
#FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build
#FROM mcr.azure.cn/dotnet/sdk:9.0-alpine AS build
FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build
ARG SPT_VERSION ARG SPT_VERSION
ARG SPT_BUILD_TYPE ARG SPT_BUILD_TYPE
ARG SPT_BUILD_CONFIG ARG SPT_BUILD_CONFIG
RUN apt update && apt install -y git git-lfs wget && \
git clone -b develop --depth=1 https://github.com/sp-tarkov/server-csharp.git /snapshot && \ RUN apk add --no-cache git git-lfs wget && \
cd /snapshot && git lfs pull && \ git clone -b develop --depth=1 https://github.com/sp-tarkov/server-csharp.git /src && \
cd /snapshot && \ cd /src && git lfs pull
dotnet publish ./SPTarkov.Server/SPTarkov.Server.csproj \
WORKDIR /src
RUN dotnet publish ./SPTarkov.Server/SPTarkov.Server.csproj \
-c $SPT_BUILD_CONFIG \ -c $SPT_BUILD_CONFIG \
-f net9.0 \ -f net9.0 \
-r linux-x64 \ -r linux-musl-x64 \
-p:IncludeNativeLibrariesForSelfExtract=true \
-p:PublishSingleFile=true \ -p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true \
--self-contained false \ --self-contained false \
-p:SptBuildType=$SPT_BUILD_TYPE \ -p:SptBuildType=$SPT_BUILD_TYPE \
-p:SptVersion=$SPT_VERSION \ -p:SptVersion=$SPT_VERSION \
-p:SptBuildTime=$( date +%Y%m%d ) \ -p:SptBuildTime=$(date +%Y%m%d) \
-p:SptCommit=$(git rev-parse --short HEAD) \ -p:SptCommit=$(git rev-parse --short HEAD) \
-p:IsPublish=true && \ -p:IsPublish=true && \
rm SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-x64/publish/*.pdb && \ ls -l /src/SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-musl-x64/publish
rm -rf /var/lib/apt/lists/*
# ================================
# RUNTIME STAGE
# ================================
#FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine AS final
#FROM mcr.azure.cn/dotnet/aspnet:9.0-alpine AS final
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS final
FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim
ARG SPT_BUILD_CONFIG ARG SPT_BUILD_CONFIG
LABEL author="yhl452493373 <yhl452493373@gmail.com>"
ENV TZ=Asia/Shanghai RUN apk add --no-cache bash coreutils sed gawk iproute2 ca-certificates
COPY --from=server-builder /snapshot/SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-x64/publish/ /app/spt-server/
VOLUME /opt/spt-server
WORKDIR /opt/spt-server WORKDIR /opt/spt-server
EXPOSE 6969
COPY --from=build /src/SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-musl-x64/publish/ /app/spt-server/
COPY entrypoint.sh /entrypoint.sh COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh RUN chmod +x /entrypoint.sh
EXPOSE 6969
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]

BIN
Managed-0.16.9.40087.zip Normal file

Binary file not shown.

View File

@@ -1,7 +1,9 @@
# SPT塔科夫单机版 构建脚本 # SPT塔科夫单机版 构建脚本
+ [build-launcher.sh](build-launcher.sh) 用于构建启动器 + [build-launcher.sh](build-launcher.sh) 用于在非docker环境中调用docker镜像构建启动器
+ [build-server.sh](build-server.sh) 用于构建服务端镜像 + [build.sh](build.sh) 是 [build-launcher.sh](build-launcher.sh)
和 [BuildLauncher.yml](.github/workflows/BuildLauncher.yml) 中调用的脚本
+ [build-server.sh](build-server.sh) 用于构建服务端镜像,也是 [BuildServer.yml](.github/workflows/BuildServer.yml) 中调用的脚本,需要把里面的`yhl452493373`换成你自己的`Docker Hub`的用户名
+ [bin](bin)目录下的[zip](bin/zip)和[unzip](bin/unzip)是ubuntu中使用的zip压缩和解压缩软件的二进制文件 + [bin](bin)目录下的[zip](bin/zip)和[unzip](bin/unzip)是ubuntu中使用的zip压缩和解压缩软件的二进制文件
## [build-launcher.sh](build-launcher.sh) 参数说明 ## [build-launcher.sh](build-launcher.sh) 参数说明
@@ -18,9 +20,9 @@
示例: 示例:
+ ./build-launcher.sh -z ./Managed.zip -a -c # 编译全部并压缩,-z必须是第一个参数 + ./build-launcher.sh -z ./Managed.zip -a -c # 编译全部并压缩,-z 必须是第一个参数
+ ./ -z ./Managed.zip -m -c # 只编译 modules 并压缩,-z必须是第一个参数 + ./build-launcher.sh -z ./Managed.zip -m -c # 只编译 modules 并压缩,-z 必须是第一个参数
+ ./ -l -c # 只编译 launcher 并压缩,不需要-z + ./build-launcher.sh -l -c # 只编译 launcher 并压缩,不需要 -z
*`Managed.zip`为塔科夫目录下的`EscapeFromTarkov_Data/Managed`的zip压缩文件* *`Managed.zip`为塔科夫目录下的`EscapeFromTarkov_Data/Managed`的zip压缩文件*
@@ -51,3 +53,18 @@ services:
- backendPort=6969 - backendPort=6969
``` ```
## [BuildServer.yml](.github/workflows/BuildServer.yml) 工作流选项说明
+ 选择运行器系统
- `ubuntu-latest`最新的 Ubuntu
- `ubuntu-24.04`Ubuntu-24.04 LTS
- `ubuntu-host`自建的运行器,如果你没自建运行器,不要选这个
+ 推送到 Docker Hub
- 如果选中,则会尝试推送到 Docker Hub
- 选中后,需要在项目的工作流中设置两个密钥`DOCKERHUB_USERNAME``DOCKERHUB_TOKEN`
- `gitea`在 [这里](../../../settings/actions/secrets)
- `github`在 [这里](../../settings/secrets/actions)
+ 镜像输出路径
- 如果提供了这个路径,服务端镜像构建完成后,会复制到这里
- 如果你在自己的宿主机上的运行器中运行,可以在这个路径下复制导出的镜像进行本地测试

0
bin/unzip Normal file → Executable file
View File

0
bin/zip Normal file → Executable file
View File

View File

@@ -146,243 +146,12 @@ echo "=================="
rm -rf "$OUTPUT_DIR" rm -rf "$OUTPUT_DIR"
mkdir -p "$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 命令
DOCKER_CMD="docker run --rm" DOCKER_CMD="docker run --rm"
# 添加必要的卷挂载 # 添加必要的卷挂载
DOCKER_CMD="$DOCKER_CMD -v \"$(pwd)/$OUTPUT_DIR:/output\"" DOCKER_CMD="$DOCKER_CMD -v \"$(pwd)/$OUTPUT_DIR:/tmp/build/output\""
DOCKER_CMD="$DOCKER_CMD -v \"$BUILD_SCRIPT:/build.sh:ro\"" 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/zip:/usr/bin/zip:ro\""
DOCKER_CMD="$DOCKER_CMD -v \"./bin/unzip:/usr/bin/unzip:ro\"" DOCKER_CMD="$DOCKER_CMD -v \"./bin/unzip:/usr/bin/unzip:ro\""
@@ -397,8 +166,11 @@ else
MANAGED_ZIP_ARG="" MANAGED_ZIP_ARG=""
fi fi
# zip和unzip权限设置为可执行
chmod a+x bin/*
# 添加容器镜像和构建脚本 # 添加容器镜像和构建脚本
DOCKER_CMD="$DOCKER_CMD refringe/spt-build-dotnet:2.1.0" DOCKER_CMD="$DOCKER_CMD mcr.microsoft.com/dotnet/sdk:9.0"
DOCKER_CMD="$DOCKER_CMD /build.sh" DOCKER_CMD="$DOCKER_CMD /build.sh"
DOCKER_CMD="$DOCKER_CMD \"$DATE_TIME\"" DOCKER_CMD="$DOCKER_CMD \"$DATE_TIME\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_VERSION\"" DOCKER_CMD="$DOCKER_CMD \"$SPT_VERSION\""
@@ -420,12 +192,12 @@ eval $DOCKER_CMD
# 最终脚本示例 # 最终脚本示例
#docker run --rm \ #docker run --rm \
# -v "$(pwd)/$OUTPUT_DIR:/output" \ # -v "$(pwd)/$OUTPUT_DIR:/tmp/build/output" \
# -v "$(realpath $MANAGED_ZIP_FILE):/Managed.zip:ro" \ # -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/zip:/usr/bin/zip:ro" \
# -v "./bin/unzip:/usr/bin/unzip:ro" \ # -v "./bin/unzip:/usr/bin/unzip:ro" \
# refringe/spt-build-dotnet:2.1.0 \ # mcr.microsoft.com/dotnet/sdk:9.0 \
# /build.sh \ # /build.sh \
# "$DATE_TIME" \ # "$DATE_TIME" \
# "$SPT_VERSION" \ # "$SPT_VERSION" \
@@ -442,10 +214,6 @@ eval $DOCKER_CMD
# "$SPT_BUILD_BRANCH" # "$SPT_BUILD_BRANCH"
# 清理临时脚本
rm -f "$BUILD_SCRIPT"
echo "临时构建脚本已清理"
echo "" echo ""
echo "=== 构建完成 ===" echo "=== 构建完成 ==="
if [ "$COMPRESS" = true ]; then if [ "$COMPRESS" = true ]; then

View File

@@ -1,6 +1,12 @@
#!/bin/bash #!/bin/bash
SPT_SERVER_REPOSITORY=sp-tarkov/server-csharp SPT_SERVER_REPOSITORY="sp-tarkov/server-csharp"
SPT_SERVER_BRANCH=develop SPT_SERVER_BRANCH="develop"
# 设置默认用户名,支持从参数传入
DOCKER_USERNAME="yhl452493373"
if [ ! -z "$1" ]; then
DOCKER_USERNAME="$1"
fi
SPT_BUILD_TYPE=RELEASE #LOCAL, DEBUG, RELEASE, BLEEDING_EDGE, BLEEDING_EDGE_MODS SPT_BUILD_TYPE=RELEASE #LOCAL, DEBUG, RELEASE, BLEEDING_EDGE, BLEEDING_EDGE_MODS
SPT_VERSION=$(git ls-remote --tags "https://github.com/$SPT_SERVER_REPOSITORY.git" | awk -F'/' '{print $NF}' | grep -v '\^{}' | sort -V | tail -1) SPT_VERSION=$(git ls-remote --tags "https://github.com/$SPT_SERVER_REPOSITORY.git" | awk -F'/' '{print $NF}' | grep -v '\^{}' | sort -V | tail -1)
@@ -10,18 +16,37 @@ SPT_COMMIT_ID=${SPT_COMMIT_ID:0:8}
CLIENT_VERSION=$(wget -qO- "https://raw.githubusercontent.com/$SPT_SERVER_REPOSITORY/refs/heads/$SPT_SERVER_BRANCH/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json" | jq -r '.compatibleTarkovVersion') CLIENT_VERSION=$(wget -qO- "https://raw.githubusercontent.com/$SPT_SERVER_REPOSITORY/refs/heads/$SPT_SERVER_BRANCH/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/core.json" | jq -r '.compatibleTarkovVersion')
DATE_TIME=$(date +%Y%m%d) DATE_TIME=$(date +%Y%m%d)
echo "Docker Hub 用户名: $DOCKER_USERNAME"
echo "SPT服务端构建类型$SPT_BUILD_TYPE" echo "SPT服务端构建类型$SPT_BUILD_TYPE"
echo "SPT服务端版本$SPT_VERSION" echo "SPT服务端版本$SPT_VERSION"
echo "SPT服务端提交ID$SPT_COMMIT_ID" echo "SPT服务端提交ID$SPT_COMMIT_ID"
echo "适用客户端版本:$CLIENT_VERSION" echo "适用客户端版本:$CLIENT_VERSION"
echo "构建日期:$DATE_TIME" echo "构建日期:$DATE_TIME"
IMAGE_TAG="$DOCKER_USERNAME/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID"
echo "开始构建镜像"
# 先删除可能存在的旧标签文件
rm -rf image_tag.txt
docker buildx build \ docker buildx build \
--platform linux/amd64 \ --platform linux/amd64 \
-t yhl452493373/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID \ -t $IMAGE_TAG \
--build-arg SPT_VERSION=$SPT_VERSION \ --build-arg SPT_VERSION=$SPT_VERSION \
--build-arg SPT_BUILD_TYPE=$SPT_BUILD_TYPE \ --build-arg SPT_BUILD_TYPE=$SPT_BUILD_TYPE \
--build-arg SPT_BUILD_CONFIG=Release \ --build-arg SPT_BUILD_CONFIG=Release \
--load \
-f Dockerfile . -f Dockerfile .
# 检查上一个命令的退出状态
if [ $? -ne 0 ]; then
echo "错误Docker 镜像构建失败!"
exit 1
fi
echo "镜像构建完毕" echo "镜像构建完毕"
# 构建成功后,将镜像标签保存到文件
echo "$IMAGE_TAG" > image_tag.txt
echo "镜像标签已保存到 image_tag.txt: $IMAGE_TAG"

221
build.sh Executable file
View File

@@ -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 "所有操作完成!"

View File

@@ -1,5 +1,6 @@
#!/bin/bash #!/bin/sh
# 文件对比
if [ -f /opt/spt-server/SPTarkov.Server ]; then if [ -f /opt/spt-server/SPTarkov.Server ]; then
appHash=$(md5sum /app/spt-server/SPTarkov.Server | awk '{ print $1 }') appHash=$(md5sum /app/spt-server/SPTarkov.Server | awk '{ print $1 }')
exeHash=$(md5sum /opt/spt-server/SPTarkov.Server | awk '{ print $1 }') exeHash=$(md5sum /opt/spt-server/SPTarkov.Server | awk '{ print $1 }')
@@ -16,42 +17,29 @@ else
echo "Finished!" echo "Finished!"
fi fi
cd /opt/spt-server cd /opt/spt-server || exit
if [ -z "$ip" ]; then # IP 配置
IP="0.0.0.0" IP="${ip:-0.0.0.0}"
else
IP=$ip
fi
if [ -z "$backendIp" ]; then # 自动获取IP,端口等配置
BACKEND_IP=$(hostname -I | awk '{print $1}') BACKEND_IP="${backendIp:-$(ip route get 1 | awk '{print $7}')}"
else PORT="${backendPort:-6969}"
BACKEND_IP=$backendIp PINGDELAYMS="${webSocketPingDelayMs:-90000}"
fi
if [ -z "$backendPort" ]; then # 配置文件替换
PORT=6969 sed -Ei "s/\"ip\": \".*?\",/\"ip\": \"${IP}\",/g" SPT_Data/configs/http.json
else sed -Ei "s/\"port\": [0-9]+,/\"port\": ${PORT},/g" SPT_Data/configs/http.json
PORT=$backendPort sed -Ei "s/\"backendIp\": \".*?\",/\"backendIp\": \"${BACKEND_IP}\",/g" SPT_Data/configs/http.json
fi sed -Ei "s/\"backendPort\": [0-9]+,/\"backendPort\": ${PORT},/g" SPT_Data/configs/http.json
sed -Ei "s/\"webSocketPingDelayMs\": [0-9]+,/\"webSocketPingDelayMs\": ${PINGDELAYMS},/g" SPT_Data/configs/http.json
if [ -z "$webSocketPingDelayMs" ]; then
PINGDELAYMS=90000
else
PINGDELAYMS=$webSocketPingDelayMs
fi
sed -Ei "s/\"ip\": \"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\",/\"ip\": \"${IP}\",/g" SPT_Data/configs/http.json
sed -Ei "s/\"port\": ([0-9]|[1-9][1-9]{1,3}|[1-5][0-9]{4}|6[1-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]),/\"port\": ${PORT},/g" SPT_Data/configs/http.json
sed -Ei "s/\"backendIp\": \"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\",/\"backendIp\": \"${BACKEND_IP}\",/g" SPT_Data/configs/http.json
sed -Ei "s/\"backendPort\": ([0-9]|[1-9][1-9]{1,3}|[1-5][0-9]{4}|6[1-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]),/\"backendPort\": ${PORT},/g" SPT_Data/configs/http.json
sed -Ei "s/\"webSocketPingDelayMs\": ([0-9]{1,}),/\"webSocketPingDelayMs\": ${PINGDELAYMS},/g" SPT_Data/configs/http.json
# 日志文件创建
if [ ! -f "sptLogger.json" ]; then if [ ! -f "sptLogger.json" ]; then
if [ -f "sptLogger.Development.json" ]; then if [ -f "sptLogger.Development.json" ]; then
cp sptLogger.Development.json sptLogger.json cp sptLogger.Development.json sptLogger.json
fi fi
fi fi
chmod +x SPT.Server.Linux && ./SPT.Server.Linux chmod +x SPT.Server
exec ./SPT.Server