diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e69de29..fb27e40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -0,0 +1,110 @@ +name: Plugin Release +"on": + push: + paths: + - 'package.json' + - 'package.v2.json' + workflow_dispatch: + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y jq zip + + - name: Build and release changed plugins + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + + # Track processed tags to avoid duplicates across package files + : > processed_tags.txt + + process_package() { + local pkg_file="$1" + [ -f "$pkg_file" ] || return 0 + + echo "Processing $pkg_file" + + # Extract entries with release == true: output format KEY|VERSION + mapfile -t entries < <(jq -r 'to_entries | map(select(.value.release == true)) | .[] | "\(.key)|\(.value.version)"' "$pkg_file") + + if [ "${#entries[@]}" -eq 0 ]; then + echo "No plugins with release=true in $pkg_file" + return 0 + fi + + for entry in "${entries[@]}"; do + plugin_id="${entry%%|*}" + plugin_version="${entry##*|}" + plugin_id_lc="$(echo "$plugin_id" | tr '[:upper:]' '[:lower:]')" + + dir1="plugins/${plugin_id_lc}" + dir2="plugins.v2/${plugin_id_lc}" + plugin_dir="" + if [ -d "$dir1" ]; then plugin_dir="$dir1"; fi + if [ -d "$dir2" ]; then plugin_dir="$dir2"; fi + + if [ -z "$plugin_dir" ]; then + echo "WARN: directory for $plugin_id not found under plugins/ or plugins.v2/, skip." + continue + fi + + tag="${plugin_id}_v${plugin_version}" + asset="${plugin_id_lc}_v${plugin_version}.zip" + + if grep -qxF "$tag" processed_tags.txt; then + echo "Tag $tag already processed, skip." + continue + fi + + # Find previous tag for this plugin (any version) + prev_tag="$(git tag --list "${plugin_id}_v*" --sort=-version:refname | head -n 1 || true)" + + changed=1 + if [ -n "$prev_tag" ]; then + if git diff --quiet "$prev_tag" -- "$plugin_dir"; then + changed=0 + fi + fi + + if [ "$changed" -eq 0 ]; then + echo "No changes in $plugin_dir since $prev_tag, skip packaging $plugin_id." + echo "$tag" >> processed_tags.txt + continue + fi + + echo "Packing $plugin_id from $plugin_dir -> $asset" + rm -f "$asset" + (cd "$(dirname "$plugin_dir")" && zip -r "$GITHUB_WORKSPACE/$asset" "$(basename "$plugin_dir")" -x "*/__pycache__/*" -x "*.pyc") >/dev/null + + # If same tag exists, delete release and remote tag first + if gh release view "$tag" >/dev/null 2>&1; then + echo "Release $tag exists, deleting..." + gh release delete "$tag" -y + git push origin :refs/tags/"$tag" || true + fi + + echo "Creating release $tag" + gh release create "$tag" "$asset" --title "$tag" --notes "Automated release of $plugin_id $plugin_version" --latest + + echo "$tag" >> processed_tags.txt + done + } + + process_package "package.json" + process_package "package.v2.json" + + diff --git a/README.md b/README.md index 0dabf3b..36b049c 100644 --- a/README.md +++ b/README.md @@ -1183,7 +1183,7 @@ def get_actions(self) -> List[Dict[str, Any]]: } ``` - 新增加的插件请配置在`package.json`中的末尾,这样可被识别为最新增加,可用于用户排序。 -- 默认通过遍历下载项目文件的方式安装插件,如果插件文件较多,可以使用release的方式发布插件,package对应的插件描述中增加`release`字段并设置为`true`,此时插件安装时会直接下载tag为`插件ID_插件版本号`的release包,release打包脚本参照插件仓库中的`release.yml`脚本。 +- 默认通过遍历下载项目文件的方式安装插件,如果插件文件较多,可以使用release的方式发布插件,package对应的插件描述中增加`release`字段并设置为`true`,此时插件安装时会直接下载tag为`插件ID_v插件版本号`的release包,release打包脚本参照插件仓库中的`release.yml`脚本。 ```json { "release": true diff --git a/package.v2.json b/package.v2.json index b1586b6..a78d41e 100644 --- a/package.v2.json +++ b/package.v2.json @@ -470,6 +470,7 @@ "icon": "Mihomo_Meta_A.png", "author": "wumode", "level": 1, + "release": true, "history": { "v1.3.2": "注册插件动作", "v1.3.1": "支持配置 Hosts",