LTDV11/.gitea/workflows/delopy.yml
Workflow config file is invalid. Please check your config file: yaml: line 283: could not find expected ':'

334 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 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