1
0

plugin-release.yml 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. name: Plugin Release
  2. on:
  3. push:
  4. branches:
  5. - master
  6. paths:
  7. - '.claude-plugin/marketplace.json'
  8. - 'webnovel-writer/.claude-plugin/plugin.json'
  9. - 'README.md'
  10. - 'CHANGELOG.md'
  11. - 'releases/**'
  12. - 'webnovel-writer/scripts/sync_plugin_version.py'
  13. - 'webnovel-writer/scripts/validate_release_notes.py'
  14. - 'webnovel-writer/scripts/validate_plugin_package.py'
  15. - '.github/workflows/plugin-release.yml'
  16. workflow_dispatch:
  17. inputs:
  18. version:
  19. description: 'Plugin version to release, for example 6.2.0. Leave empty to read plugin.json.'
  20. required: false
  21. type: string
  22. permissions:
  23. contents: write
  24. jobs:
  25. release:
  26. runs-on: ubuntu-latest
  27. steps:
  28. - name: Checkout
  29. uses: actions/checkout@v4
  30. with:
  31. fetch-depth: 0
  32. - name: Setup Python
  33. uses: actions/setup-python@v5
  34. with:
  35. python-version: '3.11'
  36. - name: Resolve release version
  37. id: release_version
  38. env:
  39. INPUT_VERSION: ${{ github.event.inputs.version || '' }}
  40. run: |
  41. if [ -n "$INPUT_VERSION" ]; then
  42. version="$INPUT_VERSION"
  43. else
  44. version="$(python -c 'import json; from pathlib import Path; print(json.loads(Path("webnovel-writer/.claude-plugin/plugin.json").read_text(encoding="utf-8"))["version"])')"
  45. fi
  46. echo "version=$version" >> "$GITHUB_OUTPUT"
  47. echo "Release version: $version"
  48. - name: Validate release metadata
  49. env:
  50. RELEASE_VERSION: ${{ steps.release_version.outputs.version }}
  51. run: |
  52. python webnovel-writer/scripts/sync_plugin_version.py \
  53. --check \
  54. --expected-version "$RELEASE_VERSION"
  55. - name: Validate release notes
  56. env:
  57. RELEASE_VERSION: ${{ steps.release_version.outputs.version }}
  58. run: |
  59. python webnovel-writer/scripts/validate_release_notes.py \
  60. --version "$RELEASE_VERSION"
  61. - name: Validate plugin package
  62. run: python webnovel-writer/scripts/validate_plugin_package.py
  63. - name: Check release tag
  64. id: release_tag
  65. env:
  66. RELEASE_VERSION: ${{ steps.release_version.outputs.version }}
  67. run: |
  68. if git ls-remote --exit-code --tags origin "v$RELEASE_VERSION" >/dev/null 2>&1; then
  69. echo "Tag v$RELEASE_VERSION already exists"
  70. echo "exists=true" >> "$GITHUB_OUTPUT"
  71. else
  72. echo "exists=false" >> "$GITHUB_OUTPUT"
  73. fi
  74. - name: Create and push tag
  75. if: steps.release_tag.outputs.exists != 'true'
  76. env:
  77. RELEASE_VERSION: ${{ steps.release_version.outputs.version }}
  78. run: |
  79. echo "Releasing commit $(git rev-parse HEAD) as v$RELEASE_VERSION"
  80. git tag "v$RELEASE_VERSION"
  81. git push origin "v$RELEASE_VERSION"
  82. - name: Check GitHub Release
  83. id: github_release
  84. env:
  85. RELEASE_VERSION: ${{ steps.release_version.outputs.version }}
  86. GH_TOKEN: ${{ github.token }}
  87. run: |
  88. if gh release view "v$RELEASE_VERSION" >/dev/null 2>&1; then
  89. echo "Release v$RELEASE_VERSION already exists"
  90. echo "exists=true" >> "$GITHUB_OUTPUT"
  91. else
  92. echo "exists=false" >> "$GITHUB_OUTPUT"
  93. fi
  94. - name: Create GitHub Release
  95. if: steps.github_release.outputs.exists != 'true'
  96. uses: softprops/action-gh-release@v2
  97. with:
  98. tag_name: v${{ steps.release_version.outputs.version }}
  99. name: v${{ steps.release_version.outputs.version }}
  100. body_path: releases/v${{ steps.release_version.outputs.version }}.md