Compare commits
40 Commits
9dcf38f2bd
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bb6f4497f | ||
|
|
2aad592da7 | ||
|
|
64d19ca401 | ||
|
|
ab4288d289 | ||
|
|
22252d4539 | ||
|
|
bd4c31d40d | ||
|
|
6ca5b5d64a | ||
| 44d24bc2fc | |||
| 987b71a6b3 | |||
| f608e2ed38 | |||
|
|
054caa7721 | ||
|
|
1903273938 | ||
|
|
44ea36eff5 | ||
|
|
1a54cfa2b9 | ||
|
|
cd2f3a2d10 | ||
|
|
3d2d4a4533 | ||
|
|
e937850d37 | ||
|
|
43c080f13c | ||
|
|
35ee9e119e | ||
|
|
33c7cb2475 | ||
|
|
0b952b740d | ||
|
|
b9092320c2 | ||
|
|
cd44cb9c7c | ||
|
|
5dd3d42605 | ||
|
|
d3315cf45c | ||
|
|
eb89dca53b | ||
|
|
f8ae6319f5 | ||
|
|
4ec2ea1a7f | ||
|
|
9e76c29231 | ||
|
|
cf2c0d3619 | ||
|
|
79c4e5513b | ||
|
|
960ee44e9c | ||
|
|
231a8337e9 | ||
| 2b046e4684 | |||
| 9e03812171 | |||
| 8ceb323cda | |||
| 0c6491b222 | |||
| dfe4e90981 | |||
| 2f2f58f90c | |||
| 52162dcdc7 |
90
.github/workflows/BuildLauncher.yml
vendored
90
.github/workflows/BuildLauncher.yml
vendored
@@ -1,7 +1,17 @@
|
|||||||
name: 构建启动器
|
name: 构建启动器
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: # 允许手动触发
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
|
runner_os:
|
||||||
|
description: 选择运行器系统
|
||||||
|
type: choice
|
||||||
|
required: true
|
||||||
|
default: 'ubuntu-latest'
|
||||||
|
options:
|
||||||
|
- ubuntu-latest
|
||||||
|
- ubuntu-24.04
|
||||||
|
- ubuntu-22.04
|
||||||
|
- ubuntu-host
|
||||||
build_modules:
|
build_modules:
|
||||||
description: '构建 Modules'
|
description: '构建 Modules'
|
||||||
required: true
|
required: true
|
||||||
@@ -24,28 +34,29 @@ env:
|
|||||||
BUILD_BRANCH: main
|
BUILD_BRANCH: main
|
||||||
COMPRESS: true
|
COMPRESS: true
|
||||||
BUILD_SCRIPT_DIR: /tmp/build
|
BUILD_SCRIPT_DIR: /tmp/build
|
||||||
BUILD_SCRIPT_OUTPUT_DIR: ${{ env.BUILD_SCRIPT_DIR }}/output
|
BUILD_SCRIPT_OUTPUT_DIR: /tmp/build/output
|
||||||
MANAGED_ZIP_FILE: Managed.zip
|
MANAGED_ZIP_FILE: Managed.zip
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-spt:
|
build-launcher:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ inputs.runner_os }}
|
||||||
container: refringe/spt-build-dotnet:2.1.0
|
container: mcr.microsoft.com/dotnet/sdk:10.0
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 克隆代码
|
- name: 安装必要工具
|
||||||
run: |
|
run: |
|
||||||
# 直接克隆当前仓库
|
# 安装必要工具
|
||||||
git clone --depth 1 https://gitea.yanghuanglin.cn/${{ github.repository }} .
|
apt update -y
|
||||||
git checkout ${{ github.ref }}
|
apt install zip unzip nodejs -y
|
||||||
|
|
||||||
|
- name: 检出代码
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: 配置环境
|
- name: 配置环境
|
||||||
run: |
|
run: |
|
||||||
# 安装必要工具
|
|
||||||
cp bin/* /usr/bin/
|
|
||||||
apt update -y
|
|
||||||
apt install zip unzip wget jq nodejs -y
|
|
||||||
|
|
||||||
# 创建脚本目录和输出目录
|
# 创建脚本目录和输出目录
|
||||||
echo "创建脚本目录${{ env.BUILD_SCRIPT_DIR }}和输出目录${{ env.BUILD_SCRIPT_OUTPUT_DIR }}"
|
echo "创建脚本目录${{ env.BUILD_SCRIPT_DIR }}和输出目录${{ env.BUILD_SCRIPT_OUTPUT_DIR }}"
|
||||||
mkdir -p ${{ env.BUILD_SCRIPT_DIR }}
|
mkdir -p ${{ env.BUILD_SCRIPT_DIR }}
|
||||||
@@ -57,13 +68,12 @@ jobs:
|
|||||||
# 复制构建脚本
|
# 复制构建脚本
|
||||||
cp build.sh ${{ env.BUILD_SCRIPT_DIR }}
|
cp build.sh ${{ env.BUILD_SCRIPT_DIR }}
|
||||||
|
|
||||||
- name: 获取Managed.zip
|
- name: 获取 Managed.zip
|
||||||
id: managed
|
id: managed
|
||||||
if: ${{ github.event.inputs.build_modules == 'true' }}
|
if: inputs.build_modules == true
|
||||||
run: |
|
run: |
|
||||||
MANAGED_URL="${{ github.event.inputs.managed_zip_url }}"
|
MANAGED_URL="${{ inputs.managed_zip_url }}"
|
||||||
|
|
||||||
# 检查输入是否为空
|
|
||||||
if [ -z "$MANAGED_URL" ]; then
|
if [ -z "$MANAGED_URL" ]; then
|
||||||
echo "错误:未提供 Managed.zip 路径或URL"
|
echo "错误:未提供 Managed.zip 路径或URL"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -71,11 +81,19 @@ jobs:
|
|||||||
|
|
||||||
echo "输入的 Managed.zip 路径: $MANAGED_URL"
|
echo "输入的 Managed.zip 路径: $MANAGED_URL"
|
||||||
|
|
||||||
# 检查是否是本地文件路径(以 /、./、../ 开头,或者是文件名)
|
# 如果是http或https开头就是URL,否则就是本地文件
|
||||||
if [[ "$MANAGED_URL" =~ ^/.* ]] || [[ "$MANAGED_URL" =~ ^\./.* ]] || [[ "$MANAGED_URL" =~ ^\.\./.* ]] || [[ ! "$MANAGED_URL" =~ ^https?:// ]]; then
|
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 "检测到本地文件路径"
|
echo "检测到本地文件路径"
|
||||||
|
|
||||||
# 检查文件是否存在
|
|
||||||
if [ ! -f "$MANAGED_URL" ]; then
|
if [ ! -f "$MANAGED_URL" ]; then
|
||||||
echo "错误:本地文件 $MANAGED_URL 不存在"
|
echo "错误:本地文件 $MANAGED_URL 不存在"
|
||||||
echo "当前目录文件列表:"
|
echo "当前目录文件列表:"
|
||||||
@@ -84,21 +102,8 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "找到本地文件: $(ls -la "$MANAGED_URL")"
|
echo "找到本地文件: $(ls -la "$MANAGED_URL")"
|
||||||
|
|
||||||
# 复制本地文件到工作目录
|
|
||||||
cp "$MANAGED_URL" ${{ env.MANAGED_ZIP_FILE }}
|
cp "$MANAGED_URL" ${{ env.MANAGED_ZIP_FILE }}
|
||||||
echo "本地文件复制成功"
|
echo "本地文件复制成功"
|
||||||
else
|
|
||||||
# 如果是URL,则下载
|
|
||||||
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 下载成功"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 复制到构建目录
|
# 复制到构建目录
|
||||||
@@ -143,11 +148,11 @@ jobs:
|
|||||||
id: params
|
id: params
|
||||||
run: |
|
run: |
|
||||||
# 是否构建modules
|
# 是否构建modules
|
||||||
BUILD_MODULES="${{ github.event.inputs.build_modules || 'true' }}"
|
BUILD_MODULES="${{ inputs.build_modules || 'true' }}"
|
||||||
echo "build_modules=$BUILD_MODULES" >> $GITHUB_OUTPUT
|
echo "build_modules=$BUILD_MODULES" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# 是否构建启动器
|
# 是否构建启动器
|
||||||
BUILD_LAUNCHER="${{ github.event.inputs.build_launcher || 'true' }}"
|
BUILD_LAUNCHER="${{ inputs.build_launcher || 'true' }}"
|
||||||
echo "build_launcher=$BUILD_LAUNCHER" >> $GITHUB_OUTPUT
|
echo "build_launcher=$BUILD_LAUNCHER" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# 构建后是否压缩为zip
|
# 构建后是否压缩为zip
|
||||||
@@ -221,20 +226,21 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
cd ${{ env.BUILD_SCRIPT_OUTPUT_DIR }}
|
cd ${{ env.BUILD_SCRIPT_OUTPUT_DIR }}
|
||||||
ZIP_FILE_NAME=$(ls *.zip 2>/dev/null | head -1)
|
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
|
if [ -z "$ZIP_FILE_NAME" ]; then
|
||||||
echo "错误:在 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 中未找到 zip 文件"
|
echo "错误:在 ${{ env.BUILD_SCRIPT_OUTPUT_DIR }} 中未找到 zip 文件"
|
||||||
ls -la "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" || echo "目录内容无法列出"
|
ls -la "${{ env.BUILD_SCRIPT_OUTPUT_DIR }}" || echo "目录内容无法列出"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "zip_file=$ZIP_FILE" >> $GITHUB_OUTPUT
|
echo "zip_file_path=$ZIP_FILE_PATH" >> $GITHUB_OUTPUT
|
||||||
echo "ZIP_FILE: $ZIP_FILE"
|
echo "ZIP_FILE_PATH: $ZIP_FILE_PATH"
|
||||||
|
|
||||||
echo "artifact_name=$ZIP_FILE_NAME" >> $GITHUB_OUTPUT
|
echo "zip_file_name=$ZIP_FILE_NAME" >> $GITHUB_OUTPUT
|
||||||
echo "ZIP_FILE_NAME: $ZIP_FILE_NAME"
|
echo "ZIP_FILE_NAME: $ZIP_FILE_NAME"
|
||||||
|
|
||||||
- name: 上传
|
- name: 上传
|
||||||
uses: https://github.com/christopherHX/gitea-upload-artifact@v4
|
uses: christopherHX/gitea-upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ steps.file_info.outputs.artifact_name }}
|
name: ${{ steps.file_info.outputs.zip_file_name }}
|
||||||
path: ${{ steps.file_info.outputs.zip_file }}
|
path: ${{ steps.file_info.outputs.zip_file_path }}
|
||||||
|
|||||||
175
.github/workflows/BuildServer.yml
vendored
Normal file
175
.github/workflows/BuildServer.yml
vendored
Normal 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 "资源清理完成"
|
||||||
52
Dockerfile
52
Dockerfile
@@ -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"]
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -3,7 +3,7 @@
|
|||||||
+ [build-launcher.sh](build-launcher.sh) 用于在非docker环境中调用docker镜像构建启动器
|
+ [build-launcher.sh](build-launcher.sh) 用于在非docker环境中调用docker镜像构建启动器
|
||||||
+ [build.sh](build.sh) 是 [build-launcher.sh](build-launcher.sh)
|
+ [build.sh](build.sh) 是 [build-launcher.sh](build-launcher.sh)
|
||||||
和 [BuildLauncher.yml](.github/workflows/BuildLauncher.yml) 中调用的脚本
|
和 [BuildLauncher.yml](.github/workflows/BuildLauncher.yml) 中调用的脚本
|
||||||
+ [build-server.sh](build-server.sh) 用于构建服务端镜像
|
+ [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) 参数说明
|
||||||
@@ -53,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)
|
||||||
|
+ 镜像输出路径
|
||||||
|
- 如果提供了这个路径,服务端镜像构建完成后,会复制到这里
|
||||||
|
- 如果你在自己的宿主机上的运行器中运行,可以在这个路径下复制导出的镜像进行本地测试
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ fi
|
|||||||
chmod a+x bin/*
|
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\""
|
||||||
@@ -197,7 +197,7 @@ eval $DOCKER_CMD
|
|||||||
# -v "./build.sh:/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" \
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user