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 v11" SSH_PORT: "22" # 保留文件配置 KEEP_FILES: "" jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: https://gitee.com/actions-mirror/checkout@v4 - 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 文件" 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 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 "=== 更新所有模组 ===" 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 }}" cd packet echo "=== 设置 packwiz 执行权限 ===" chmod +x ./packwiz ls -la ./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 初始化完成" 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)" # ========== 使用官方 SSH Action 替代手动写入私钥 ========== - name: Clean remote directory (conditionally) if: steps.project-config.outputs.use_keep_files == 'true' uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | mkdir -p '${{ env.REMOTE_PATH }}' echo '=== 清理目录(保留文件不会被删除)===' echo '保留文件: ${{ env.KEEP_FILES }}' cd '${{ env.REMOTE_PATH }}' find . -mindepth 1 -not -path '*/\.*' | while read item; do should_keep=false for pattern in ${{ env.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' uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | mkdir -p '${{ env.REMOTE_PATH }}' echo '=== 完全清理目录(无保留文件)===' find '${{ env.REMOTE_PATH }}' -mindepth 1 -delete 2>/dev/null || true echo '目录清理完成' - name: Deploy packet directory uses: appleboy/scp-action@v0.1.5 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} source: "packet/" target: ${{ env.REMOTE_PATH }} rm: false strip_components: 1 overwrite: true - name: Remove excluded files if keep_files is true if: steps.project-config.outputs.use_keep_files == 'true' uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | cd '${{ env.REMOTE_PATH }}' echo "=== 移除需要排除的文件 ===" # 排除 .git 和 .gitea rm -rf .git .gitea 2>/dev/null || true # 排除保留文件列表中的文件 for pattern in ${{ env.KEEP_FILES }}; do if [[ "$pattern" == *"*"* ]]; then # 通配符模式,删除匹配的文件 for file in $pattern; do if [ -e "$file" ] && [ ! -d "$file" ]; then echo "删除排除文件: $file" rm -f "$file" 2>/dev/null || true fi done else if [ -e "$pattern" ] && [ ! -d "$pattern" ]; then echo "删除排除文件: $pattern" rm -f "$pattern" 2>/dev/null || true fi fi done echo "排除文件清理完成" - name: Update project configuration on server uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | echo '=== 更新服务器上的项目配置 ===' mkdir -p '${{ env.REMOTE_PATH }}/.project' cat > '${{ env.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 '${{ env.REMOTE_PATH }}/.project/globe.json' - name: Verify deployment uses: appleboy/ssh-action@v1.0.3 with: host: ${{ env.REMOTE_HOST }} username: ${{ env.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} port: ${{ env.SSH_PORT }} script: | echo '=== 部署验证 ===' echo '目录: ${{ env.REMOTE_PATH }}' echo "大小: $(du -sh '${{ env.REMOTE_PATH }}')" echo "文件数量: $(find '${{ env.REMOTE_PATH }}' -type f | wc -l)" echo '=== 项目配置 ===' if [ -f '${{ env.REMOTE_PATH }}/.project/globe.json' ]; then cat '${{ env.REMOTE_PATH }}/.project/globe.json' else echo '⚠️ 未找到项目配置文件' fi echo '=== pack.toml 内容 ===' if [ -f '${{ env.REMOTE_PATH }}/pack.toml' ]; then cat '${{ env.REMOTE_PATH }}/pack.toml' else echo '⚠️ 未找到 pack.toml 文件' fi echo '=== 目录结构 ===' ls -la '${{ env.REMOTE_PATH }}' echo '=== 保留文件状态 ===' if [ "${{ steps.project-config.outputs.use_keep_files }}" = "true" ]; then for pattern in ${{ env.KEEP_FILES }}; do if [ -e '${{ env.REMOTE_PATH }}/$pattern' ]; then echo "✅ 保留文件: $pattern" else echo "⚠️ 保留文件不存在: $pattern" fi done else echo '无保留文件设置' fi