diff --git a/.github/scripts/get_notes.py b/.github/scripts/get_notes.py new file mode 100644 index 0000000..6e71ecc --- /dev/null +++ b/.github/scripts/get_notes.py @@ -0,0 +1,10 @@ +import os, re +from pathlib import Path + +version = os.environ["VERSION"] +text = Path("CHANGELOG.md").read_text(encoding="utf-8") +pattern = rf"(?ms)^##\s+FocusGram\s+{re.escape(version)}\s*$.*?(?=^##\s+|\Z)" +m = re.search(pattern, text) +if not m: + raise SystemExit(f"Could not find changelog section for version {version}") +Path("release_notes.md").write_text(m.group(0).strip() + "\n", encoding="utf-8") \ No newline at end of file diff --git a/.github/scripts/get_version.py b/.github/scripts/get_version.py new file mode 100644 index 0000000..09f9cfb --- /dev/null +++ b/.github/scripts/get_version.py @@ -0,0 +1,8 @@ +from pathlib import Path +import re + +text = Path("CHANGELOG.md").read_text(encoding="utf-8") +m = re.search(r"^##\s+FocusGram\s+([0-9]+\.[0-9]+\.[0-9]+)\s*$", text, re.M) +if not m: + raise SystemExit("Could not find a top changelog heading like: ## FocusGram 2.0.0") +print(m.group(1)) \ No newline at end of file diff --git a/.github/workflows/release-apk.yml b/.github/workflows/release-apk.yml index bb8c055..32426d9 100644 --- a/.github/workflows/release-apk.yml +++ b/.github/workflows/release-apk.yml @@ -1,5 +1,4 @@ name: Build APK and Create GitHub Release - on: workflow_dispatch: inputs: @@ -7,35 +6,28 @@ on: description: "Release version without leading v. Example: 1.0.0. Leave empty to read the top CHANGELOG heading." required: false type: string - permissions: contents: write - jobs: release: runs-on: ubuntu-latest - steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up Java 17 uses: actions/setup-java@v5 with: distribution: temurin java-version: "17" - - name: Set up Android SDK uses: android-actions/setup-android@v4 - - name: Set up Flutter uses: subosito/flutter-action@v2 with: channel: stable cache: true - - name: Install required Android SDK packages shell: bash run: | @@ -46,98 +38,59 @@ jobs: "build-tools;34.0.0" \ "build-tools;35.0.0" \ "ndk;28.2.12676356" - - name: Get dependencies run: flutter pub get - - name: Resolve version and tag id: meta shell: bash run: | set -euo pipefail - INPUT_VERSION="${{ github.event.inputs.version }}" - if [[ -n "${INPUT_VERSION}" ]]; then VERSION="${INPUT_VERSION#v}" else - VERSION="$(python3 - <<'PY' -from pathlib import Path -import re - -text = Path("CHANGELOG.md").read_text(encoding="utf-8") -m = re.search(r'^##\s+FocusGram\s+([0-9]+\.[0-9]+\.[0-9]+)\s*$', text, re.M) -if not m: - raise SystemExit("Could not find a top changelog heading like: ## FocusGram 2.0.0") -print(m.group(1)) -PY -)" + VERSION="$(python3 .github/scripts/get_version.py)" fi - TAG="v${VERSION}" - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" echo "tag=${TAG}" >> "$GITHUB_OUTPUT" - - name: Extract release notes from CHANGELOG.md shell: bash env: VERSION: ${{ steps.meta.outputs.version }} - run: | - set -euo pipefail - - python3 - <<'PY' -from pathlib import Path -import os -import re - -version = os.environ["VERSION"] -text = Path("CHANGELOG.md").read_text(encoding="utf-8") - -pattern = rf'(?ms)^##\s+FocusGram\s+{re.escape(version)}\s*$.*?(?=^##\s+|\Z)' -m = re.search(pattern, text) -if not m: - raise SystemExit(f"Could not find changelog section for version {version}") - -Path("release_notes.md").write_text(m.group(0).strip() + "\n", encoding="utf-8") -PY - + run: python3 .github/scripts/get_notes.py - name: Build release APK run: flutter build apk --release - + - name: Rename APK + run: mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/focusgram-release.apk - name: Upload APK artifact uses: actions/upload-artifact@v4 with: name: focusgram-apk-${{ steps.meta.outputs.tag }} - path: build/app/outputs/flutter-apk/app-release.apk + path: build/app/outputs/flutter-apk/focusgram-release.apk if-no-files-found: error - - name: Create Git tag shell: bash env: TAG: ${{ steps.meta.outputs.tag }} run: | set -euo pipefail - git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - if git ls-remote --exit-code --tags origin "refs/tags/${TAG}" >/dev/null 2>&1; then echo "Tag already exists on remote: ${TAG}" exit 1 fi - git tag -a "${TAG}" -m "Release ${TAG}" git push origin "${TAG}" - - name: Create GitHub Release uses: softprops/action-gh-release@v3 with: tag_name: ${{ steps.meta.outputs.tag }} name: FocusGram ${{ steps.meta.outputs.tag }} body_path: release_notes.md - files: build/app/outputs/flutter-apk/app-release.apk + files: build/app/outputs/flutter-apk/focusgram-release.apk draft: false prerelease: false env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file