plugin-release.yml 3.6 KB

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