Compare commits

...

31 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
7 changed files with 160 additions and 83 deletions

View File

@@ -2,6 +2,16 @@ 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
build_modules:
description: '构建 Modules'
required: true
@@ -28,9 +38,9 @@ env:
MANAGED_ZIP_FILE: Managed.zip
jobs:
build-spt:
runs-on: ubuntu-latest
container: refringe/spt-build-dotnet:2.1.0
build-launcher:
runs-on: ${{ inputs.runner_os }}
container: mcr.microsoft.com/dotnet/sdk:10.0
defaults:
run:
shell: bash

View File

@@ -4,22 +4,19 @@ on:
workflow_dispatch:
inputs:
runner_os:
description: |
选择运行器操作系统:
- ubuntu-latest: 最新的 Ubuntu
- ubuntu-24.04: Ubuntu 24.04 LTS
- ubuntu-host: 自建的运行器所在宿主机
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
description: 推送到 Docker Hub
type: boolean
default: true
default: false
required: true
output_path:
description: 镜像输出路径
@@ -38,6 +35,9 @@ jobs:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 检查 Docker Hub 配置
id: docker-config
run: |
@@ -64,15 +64,16 @@ jobs:
- name: 设置构建脚本执行权限
run: chmod +x build-server.sh
- name: 安装依赖
run: |
sudo apt update
sudo apt install -y jq
- 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
@@ -120,13 +121,13 @@ jobs:
echo "运行器操作系统: ${{ inputs.runner_os }}"
echo "镜像标签: ${{ steps.exist-tag.outputs.tag }}"
echo "用户选择推送到 Docker Hub: ${{ inputs.push_to_docker }}"
echo "实际是否推送到 Docker Hub: ${{ steps.check-docker-config.outputs.push_available }}"
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.check-docker-config.outputs.push_available }}" = "true" ]; then
if [ "${{ steps.docker-config.outputs.push_available }}" = "true" ]; then
echo "已推送到 Docker Hub"
echo "推送的标签: ${{ steps.exist-tag.outputs.tag }}"
else
@@ -136,3 +137,39 @@ jobs:
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_BUILD_TYPE
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 && \
cd /snapshot && git lfs pull && \
cd /snapshot && \
dotnet publish ./SPTarkov.Server/SPTarkov.Server.csproj \
RUN apk add --no-cache git git-lfs wget && \
git clone -b develop --depth=1 https://github.com/sp-tarkov/server-csharp.git /src && \
cd /src && git lfs pull
WORKDIR /src
RUN dotnet publish ./SPTarkov.Server/SPTarkov.Server.csproj \
-c $SPT_BUILD_CONFIG \
-f net9.0 \
-r linux-x64 \
-p:IncludeNativeLibrariesForSelfExtract=true \
-r linux-musl-x64 \
-p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true \
--self-contained false \
-p:SptBuildType=$SPT_BUILD_TYPE \
-p:SptVersion=$SPT_VERSION \
-p:SptBuildTime=$( date +%Y%m%d ) \
-p:SptBuildTime=$(date +%Y%m%d) \
-p:SptCommit=$(git rev-parse --short HEAD) \
-p:IsPublish=true && \
rm SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-x64/publish/*.pdb && \
rm -rf /var/lib/apt/lists/*
ls -l /src/SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-musl-x64/publish
# ================================
# 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
LABEL author="yhl452493373 <yhl452493373@gmail.com>"
ENV TZ=Asia/Shanghai
COPY --from=server-builder /snapshot/SPTarkov.Server/bin/$SPT_BUILD_CONFIG/net9.0/linux-x64/publish/ /app/spt-server/
VOLUME /opt/spt-server
RUN apk add --no-cache bash coreutils sed gawk iproute2 ca-certificates
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
RUN chmod +x /entrypoint.sh
EXPOSE 6969
ENTRYPOINT ["/entrypoint.sh"]

View File

@@ -3,7 +3,7 @@
+ [build-launcher.sh](build-launcher.sh) 用于在非docker环境中调用docker镜像构建启动器
+ [build.sh](build.sh) 是 [build-launcher.sh](build-launcher.sh)
和 [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压缩和解压缩软件的二进制文件
## [build-launcher.sh](build-launcher.sh) 参数说明
@@ -53,3 +53,18 @@ services:
- 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)
+ 镜像输出路径
- 如果提供了这个路径,服务端镜像构建完成后,会复制到这里
- 如果你在自己的宿主机上的运行器中运行,可以在这个路径下复制导出的镜像进行本地测试

View File

@@ -170,7 +170,7 @@ fi
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 \"$DATE_TIME\""
DOCKER_CMD="$DOCKER_CMD \"$SPT_VERSION\""
@@ -197,7 +197,7 @@ eval $DOCKER_CMD
# -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 \
# mcr.microsoft.com/dotnet/sdk:9.0 \
# /build.sh \
# "$DATE_TIME" \
# "$SPT_VERSION" \

View File

@@ -1,6 +1,12 @@
#!/bin/bash
SPT_SERVER_REPOSITORY=sp-tarkov/server-csharp
SPT_SERVER_BRANCH=develop
SPT_SERVER_REPOSITORY="sp-tarkov/server-csharp"
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_VERSION=$(git ls-remote --tags "https://github.com/$SPT_SERVER_REPOSITORY.git" | awk -F'/' '{print $NF}' | grep -v '\^{}' | sort -V | tail -1)
@@ -10,24 +16,27 @@ 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')
DATE_TIME=$(date +%Y%m%d)
echo "Docker Hub 用户名: $DOCKER_USERNAME"
echo "SPT服务端构建类型$SPT_BUILD_TYPE"
echo "SPT服务端版本$SPT_VERSION"
echo "SPT服务端提交ID$SPT_COMMIT_ID"
echo "适用客户端版本:$CLIENT_VERSION"
echo "构建日期:$DATE_TIME"
IMAGE_TAG="yhl452493373/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID"
IMAGE_TAG="$DOCKER_USERNAME/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID"
echo "开始构建镜像"
# 先删除可能存在的旧标签文件
rm -rf image_tag.txt
docker build \
docker buildx build \
--platform linux/amd64 \
-t $IMAGE_TAG \
--build-arg SPT_VERSION=$SPT_VERSION \
--build-arg SPT_BUILD_TYPE=$SPT_BUILD_TYPE \
--build-arg SPT_BUILD_CONFIG=Release \
--load \
-f Dockerfile .
# 检查上一个命令的退出状态

View File

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