LTDV10/.gitea/workflows/delopy.yml
3944Realms ae2cf090f5
Some checks failed
Deploy to Remote Server / deploy (push) Failing after 6s
正式版第一次提交(修复Action流问题9)
2026-05-01 23:44:30 +08:00

361 lines
14 KiB
YAML

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 from Gitea
run: |
echo "=== 从 Gitea 克隆代码 ==="
# 配置 Git 解决网络问题
git config --global http.version HTTP/1.1
git config --global http.postBuffer 524288000
# 克隆代码
git clone --depth 1 \
https://gitea.bot.leisuretimedock.top/R3944Realms/LTDV10.git \
.
echo "=== 验证克隆结果 ==="
ls -la
echo "=== packet 目录 ==="
ls -la packet/
- 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
"