345 lines
13 KiB
YAML
345 lines
13 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:
|
|
- name: Checkout code
|
|
uses: actions/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 文件"
|
|
# 列出 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
|
|
" |