name: Deploy to Remote Server on: push: branches: [ main, master ] workflow_dispatch: env: REMOTE_HOST: "f2.leisuretimedock.top" REMOTE_USER: "root" REMOTE_PATH: "/opt/filebrowser/ltd v10" SSH_PORT: "22" # 保留文件配置 KEEP_FILES: "" jobs: deploy: runs-on: ubuntu-latest steps: # 使用手动克隆从 Gitea 检出代码 - name: Checkout code with SSH run: | echo "=== 配置 SSH ===" mkdir -p ~/.ssh chmod 700 ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # 添加主机密钥 ssh-keyscan -p 22 gitea.bot.leisuretimedock.top >> ~/.ssh/known_hosts 2>/dev/null echo "=== 使用 SSH 克隆代码 ===" git clone --depth 1 \ git@gitea.bot.leisuretimedock.top:R3944Realms/LTDV10.git \ . echo "=== 验证 ===" ls -la - name: Set executable permissions run: | echo "=== 设置文件执行权限 ===" if [ -f "./packet/packwiz" ]; then chmod +x ./packet/packwiz echo "✅ packet/packwiz 执行权限已设置" ls -la ./packet/packwiz else echo "⚠️ 未找到 packet/packwiz 文件" # 列出 packet 目录内容,帮助调试 echo "packet 目录内容:" ls -la packet/ fi - name: Read project configuration id: project-config run: | echo "=== 读取项目配置 ===" if [ -f ".project/globe.json" ]; then echo "找到 .project/globe.json 文件" cat .project/globe.json # 使用 jq 解析 JSON 文件 VERSION=$(jq -r '.version // "0.0.0.0"' .project/globe.json) INITIALIZED=$(jq -r '.initialized // "false"' .project/globe.json) NAME=$(jq -r '.name // "MyPack"' .project/globe.json) AUTHOR=$(jq -r '.author // "Unknown"' .project/globe.json) MC_VERSION=$(jq -r '.["mc-version"] // "1.20.1"' .project/globe.json) MODLOADER=$(jq -r '.modloader // "forge"' .project/globe.json) MODLOADER_VERSION=$(jq -r '.["modloader-version"] // "47.1.0"' .project/globe.json) INDEX_FILE=$(jq -r '.["index-file"] // "index.toml"' .project/globe.json) echo "版本: $VERSION" echo "已初始化: $INITIALIZED" echo "名称: $NAME" echo "作者: $AUTHOR" echo "MC版本: $MC_VERSION" echo "模组加载器: $MODLOADER" echo "模组加载器版本: $MODLOADER_VERSION" echo "索引文件: $INDEX_FILE" # 设置输出变量 echo "version=$VERSION" >> $GITHUB_OUTPUT echo "initialized=$INITIALIZED" >> $GITHUB_OUTPUT echo "name=$NAME" >> $GITHUB_OUTPUT echo "author=$AUTHOR" >> $GITHUB_OUTPUT echo "mc-version=$MC_VERSION" >> $GITHUB_OUTPUT echo "modloader=$MODLOADER" >> $GITHUB_OUTPUT echo "modloader-version=$MODLOADER_VERSION" >> $GITHUB_OUTPUT echo "index-file=$INDEX_FILE" >> $GITHUB_OUTPUT # 根据配置决定是否使用保留文件 if [ "$INITIALIZED" = "true" ]; then echo "项目已初始化,将使用保留文件: $KEEP_FILES" echo "use_keep_files=true" >> $GITHUB_OUTPUT else echo "项目未初始化,不使用保留文件" echo "use_keep_files=false" >> $GITHUB_OUTPUT fi else echo "⚠️ 未找到 .project/globe.json 文件,使用默认配置" echo "version=0.0.0.0" >> $GITHUB_OUTPUT echo "initialized=false" >> $GITHUB_OUTPUT echo "name=MyPack" >> $GITHUB_OUTPUT echo "author=Unknown" >> $GITHUB_OUTPUT echo "mc-version=1.20.1" >> $GITHUB_OUTPUT echo "modloader=forge" >> $GITHUB_OUTPUT echo "modloader-version=47.1.0" >> $GITHUB_OUTPUT echo "index-file=index.toml" >> $GITHUB_OUTPUT echo "use_keep_files=false" >> $GITHUB_OUTPUT fi - name: Update pack.toml if initialized is true if: steps.project-config.outputs.initialized == 'true' run: | echo "=== 更新 pack.toml 版本 ===" if [ -f "packet/pack.toml" ]; then echo "找到 packet/pack.toml 文件,更新版本..." CURRENT_VERSION=$(grep '^version =' packet/pack.toml | head -1 | cut -d'"' -f2) NEW_VERSION="${{ steps.project-config.outputs.version }}" echo "当前版本: $CURRENT_VERSION" echo "新版本: $NEW_VERSION" # 更新版本号 if [ "$CURRENT_VERSION" != "$NEW_VERSION" ]; then sed -i "s/version = \"$CURRENT_VERSION\"/version = \"$NEW_VERSION\"/" packet/pack.toml echo "✅ pack.toml 版本已更新为: $NEW_VERSION" else echo "版本相同,无需更新" fi # 显示更新后的文件内容 echo "=== 更新后的 pack.toml ===" cat packet/pack.toml else echo "⚠️ 未找到 packet/pack.toml 文件" fi - name: Update all mods if initialized is true if: steps.project-config.outputs.initialized == 'true' run: | echo "=== 更新所有模组 ===" # 进入 packet 目录执行命令 cd packet chmod +x ./packwiz ./packwiz update --all cd .. echo "✅ 模组更新完成" - name: Initialize pack if initialized is false if: steps.project-config.outputs.initialized == 'false' run: | echo "=== 初始化 packwiz 项目 ===" echo "名称: ${{ steps.project-config.outputs.name }}" echo "作者: ${{ steps.project-config.outputs.author }}" echo "版本: ${{ steps.project-config.outputs.version }}" echo "MC版本: ${{ steps.project-config.outputs.mc-version }}" echo "模组加载器: ${{ steps.project-config.outputs.modloader }}" echo "模组加载器版本: ${{ steps.project-config.outputs.modloader-version }}" echo "索引文件: ${{ steps.project-config.outputs.index-file }}" # 进入 packet 目录执行初始化 cd packet # 给 packwiz 添加执行权限 echo "=== 设置 packwiz 执行权限 ===" chmod +x ./packwiz ls -la ./packwiz # 执行 packwiz 初始化命令 ./packwiz init \ --name "${{ steps.project-config.outputs.name }}" \ --author "${{ steps.project-config.outputs.author }}" \ --version "${{ steps.project-config.outputs.version }}" \ --mc-version "${{ steps.project-config.outputs.mc-version }}" \ --modloader "${{ steps.project-config.outputs.modloader }}" \ --${{ steps.project-config.outputs.modloader }}-version "${{ steps.project-config.outputs.modloader-version }}" \ --index-file "${{ steps.project-config.outputs.index-file }}" \ --reinit echo "✅ packwiz 初始化完成" # 显示生成的 pack.toml echo "=== 生成的 pack.toml ===" cat pack.toml # 返回上级目录 cd .. - name: Display repository files run: | echo "=== 自动挂载的仓库文件 ===" echo "当前目录: $PWD" ls -la echo "=== packet 目录内容 ===" ls -la packet/ echo "=== 项目配置 ===" echo "版本: ${{ steps.project-config.outputs.version }}" echo "已初始化: ${{ steps.project-config.outputs.initialized }}" echo "使用保留文件: ${{ steps.project-config.outputs.use_keep_files }}" echo "保留文件列表: $KEEP_FILES" echo "=== packet 目录文件详情 ===" find packet/ -type f 2>/dev/null | head -20 || true echo "packet 目录文件数: $(find packet/ -type f 2>/dev/null | wc -l || echo 0)" echo "packet 目录数: $(find packet/ -type d 2>/dev/null | wc -l || echo 0)" - name: Setup SSH run: | mkdir -p ~/.ssh chmod 700 ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa cat > ~/.ssh/config << EOF Host $REMOTE_HOST HostName $REMOTE_HOST User $REMOTE_USER Port $SSH_PORT StrictHostKeyChecking no UserKnownHostsFile /dev/null EOF - name: Clean remote directory (conditionally) if: steps.project-config.outputs.use_keep_files == 'true' run: | ssh $REMOTE_HOST " mkdir -p '$REMOTE_PATH' echo '=== 清理目录(保留文件不会被删除)===' echo '保留文件: $KEEP_FILES' cd '$REMOTE_PATH' # 获取当前目录的所有文件和文件夹(除了隐藏文件和保留文件) find . -mindepth 1 -not -path '*/\.*' | while read item; do should_keep=false for pattern in $KEEP_FILES; do # 检查是否匹配保留模式 if [[ \"\$item\" == *\"\$pattern\"* ]] || [[ \"\$item\" == \"\$pattern\" ]] || [[ \"\$pattern\" == *\"*\"* && \"\$item\" == \${pattern%%/*}* ]]; then should_keep=true break fi done if [ \"\$should_keep\" = \"false\" ]; then echo \"删除: \$item\" rm -rf \"\$item\" 2>/dev/null || true else echo \"保留: \$item\" fi done echo '目录清理完成' " - name: Clean remote directory (full cleanup) if: steps.project-config.outputs.use_keep_files == 'false' run: | ssh $REMOTE_HOST " mkdir -p '$REMOTE_PATH' echo '=== 完全清理目录(无保留文件)===' find '$REMOTE_PATH' -mindepth 1 -delete 2>/dev/null || true echo '目录清理完成' " - name: Deploy packet directory run: | echo "开始部署 packet 目录..." echo "项目版本: ${{ steps.project-config.outputs.version }}" echo "已初始化: ${{ steps.project-config.outputs.initialized }}" # 进入 packet 目录进行打包 cd packet # 如果有保留文件,创建排除列表 if [ "${{ steps.project-config.outputs.use_keep_files }}" = "true" ]; then echo "使用保留文件: $KEEP_FILES" echo "=== 创建排除列表 ===" echo ".git" > exclude_list.txt echo ".gitea" >> exclude_list.txt # 添加保留文件到排除列表 for pattern in $KEEP_FILES; do if [[ "$pattern" == *"*"* ]]; then # 对于通配符模式,找到所有匹配的文件并排除 for file in $pattern; do if [ -e "$file" ]; then echo "$file" >> exclude_list.txt fi done else echo "$pattern" >> exclude_list.txt fi done echo "排除列表:" cat exclude_list.txt # 使用排除列表打包 packet 目录内容 tar czf - --exclude-from=exclude_list.txt . | ssh $REMOTE_HOST "cd '$REMOTE_PATH' && tar xzf -" rm -f exclude_list.txt else # 没有保留文件,直接打包 packet 目录所有文件 echo "无保留文件,部署 packet 目录所有文件" tar czf - --exclude='.git' --exclude='.gitea' . | ssh $REMOTE_HOST "cd '$REMOTE_PATH' && tar xzf -" fi echo "✅ packet 目录部署完成" - name: Update project configuration on server run: | echo "=== 更新服务器上的项目配置 ===" # 创建项目配置目录并上传配置信息 ssh $REMOTE_HOST " mkdir -p '$REMOTE_PATH/.project' cat > '$REMOTE_PATH/.project/globe.json' << 'EOF' { \"version\": \"${{ steps.project-config.outputs.version }}\", \"initialized\": ${{ steps.project-config.outputs.initialized }}, \"name\": \"${{ steps.project-config.outputs.name }}\", \"author\": \"${{ steps.project-config.outputs.author }}\", \"mc-version\": \"${{ steps.project-config.outputs.mc-version }}\", \"modloader\": \"${{ steps.project-config.outputs.modloader }}\", \"modloader-version\": \"${{ steps.project-config.outputs.modloader-version }}\", \"index-file\": \"${{ steps.project-config.outputs.index-file }}\" } EOF echo '服务器项目配置已更新' cat '$REMOTE_PATH/.project/globe.json' " - name: Verify deployment run: | ssh $REMOTE_HOST " echo '=== 部署验证 ===' echo '目录: $REMOTE_PATH' echo '大小: \$(du -sh \"$REMOTE_PATH\")' echo '文件数量: \$(find \"$REMOTE_PATH\" -type f | wc -l)' echo '=== 项目配置 ===' if [ -f \"$REMOTE_PATH/.project/globe.json\" ]; then cat \"$REMOTE_PATH/.project/globe.json\" else echo '⚠️ 未找到项目配置文件' fi echo '=== pack.toml 内容 ===' if [ -f \"$REMOTE_PATH/pack.toml\" ]; then cat \"$REMOTE_PATH/pack.toml\" else echo '⚠️ 未找到 pack.toml 文件' fi echo '=== 目录结构 ===' ls -la '$REMOTE_PATH' echo '=== 保留文件状态 ===' if [ \"${{ steps.project-config.outputs.use_keep_files }}\" = \"true\" ]; then for pattern in $KEEP_FILES; do if [ -e \"$REMOTE_PATH/\$pattern\" ]; then echo \"✅ 保留文件: \$pattern\" else echo \"⚠️ 保留文件不存在: \$pattern\" fi done else echo '无保留文件设置' fi "