diff --git a/.github/workflows/BuildLauncher.yml b/.github/workflows/BuildLauncher.yml index f2853dd..faf2e71 100644 --- a/.github/workflows/BuildLauncher.yml +++ b/.github/workflows/BuildLauncher.yml @@ -1,6 +1,6 @@ name: 构建启动器 on: - workflow_dispatch: # 允许手动触发 + workflow_dispatch: inputs: build_modules: description: '构建 Modules' @@ -42,7 +42,7 @@ jobs: apt update -y apt install zip unzip nodejs -y - - name: 克隆代码 + - name: 检出代码 uses: actions/checkout@v4 - name: 配置环境 @@ -60,9 +60,9 @@ jobs: - name: 获取 Managed.zip id: managed - if: ${{ github.event.inputs.build_modules == 'true' }} + if: inputs.build_modules == true run: | - MANAGED_URL="${{ github.event.inputs.managed_zip_url }}" + MANAGED_URL="${{ inputs.managed_zip_url }}" if [ -z "$MANAGED_URL" ]; then echo "错误:未提供 Managed.zip 路径或URL" @@ -138,11 +138,11 @@ jobs: id: params run: | # 是否构建modules - BUILD_MODULES="${{ github.event.inputs.build_modules || 'true' }}" + BUILD_MODULES="${{ inputs.build_modules || 'true' }}" 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 # 构建后是否压缩为zip diff --git a/.github/workflows/BuildServer.yml b/.github/workflows/BuildServer.yml new file mode 100644 index 0000000..2c0f7aa --- /dev/null +++ b/.github/workflows/BuildServer.yml @@ -0,0 +1,138 @@ +name: 构建服务端镜像 + +on: + workflow_dispatch: + inputs: + runner_os: + description: | + 选择运行器操作系统: + - ubuntu-latest: 最新的 Ubuntu + - ubuntu-24.04: Ubuntu 24.04 LTS + - ubuntu-host: 自建运行器所在宿主机 + type: choice + required: true + default: 'ubuntu-latest' + options: + - ubuntu-latest + - ubuntu-24.04 + - ubuntu-host + push_to_docker: + description: 是否推送到 Docker Hub + type: boolean + default: true + 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 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 "用户选择不推送镜像" + 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: 安装依赖 + run: | + sudo apt update + sudo apt install -y jq + + - name: 构建 Docker 镜像 + run: | + # 运行构建脚本 + ./build-server.sh + + - 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.check-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 + 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 \ No newline at end of file diff --git a/build-server.sh b/build-server.sh index 6e58cca..ca9d5ad 100644 --- a/build-server.sh +++ b/build-server.sh @@ -16,12 +16,28 @@ echo "SPT服务端提交ID:$SPT_COMMIT_ID" echo "适用客户端版本:$CLIENT_VERSION" echo "构建日期:$DATE_TIME" -docker buildx build \ - --platform linux/amd64 \ - -t yhl452493373/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID \ +IMAGE_TAG="yhl452493373/spt-server:$SPT_VERSION-$DATE_TIME-$SPT_COMMIT_ID" + +echo "开始构建镜像" + +# 先删除可能存在的旧标签文件 +rm -rf image_tag.txt + +docker build \ + -t $IMAGE_TAG \ --build-arg SPT_VERSION=$SPT_VERSION \ --build-arg SPT_BUILD_TYPE=$SPT_BUILD_TYPE \ --build-arg SPT_BUILD_CONFIG=Release \ -f Dockerfile . +# 检查上一个命令的退出状态 +if [ $? -ne 0 ]; then + echo "错误:Docker 镜像构建失败!" + exit 1 +fi + echo "镜像构建完毕" + +# 构建成功后,将镜像标签保存到文件 +echo "$IMAGE_TAG" > image_tag.txt +echo "镜像标签已保存到 image_tag.txt: $IMAGE_TAG"