LTDV10/.gitea/workflows/delopy.yml
3944Realms c6c4556666
Some checks failed
Deploy to Remote Server / deploy (push) Has been cancelled
正式版第一次提交(修复Action流问题11)
2026-05-01 23:51:20 +08:00

378 lines
14 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 克隆代码 ==="
# 添加 --progress 显示详细进度
GIT_SSH_COMMAND="ssh -v" git clone --depth 1 --progress \
git@gitea.bot.leisuretimedock.top:R3944Realms/LTDV10.git \
temp_repo
echo "=== 移动文件到当前目录 ==="
if [ -d "temp_repo" ]; then
shopt -s dotglob
mv temp_repo/* . 2>/dev/null || true
mv temp_repo/.[!.]* . 2>/dev/null || true
rm -rf temp_repo
echo "✅ 克隆成功,文件已移动"
else
echo "❌ 克隆失败temp_repo 目录不存在"
exit 1
fi
echo "=== 验证文件 ==="
ls -la
echo "packet 目录:"
ls -la packet/ || echo "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
"