name: Create Release on Merge on: push: branches: - master workflow_dispatch: jobs: release: runs-on: ubuntu-latest permissions: contents: write pull-requests: read steps: - name: Checkout repo branch uses: actions/checkout@v4 with: ref: repo fetch-depth: 0 # Get the merged PR info - name: Get PR information id: pr_info run: | # Fetch and checkout master to analyze history git fetch origin master git checkout -B master origin/master # Initialize variables FOUND_PR=false # Get the last 10 merge commits MERGE_COMMITS=$(git log --merges --format='%H' -n 10) for COMMIT in $MERGE_COMMITS; do # Extract PR number PR_NUMBER=$(git show --format=%B -s $COMMIT | grep -oP 'Merge pull request #\K\d+') if [ -z "$PR_NUMBER" ]; then PR_NUMBER=$(git show --format=%B -s $COMMIT | grep -oP '\(#\K\d+(?=\))') fi if [ -n "$PR_NUMBER" ]; then echo "Checking PR #$PR_NUMBER..." PR_JSON=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER) PR_TITLE=$(echo "$PR_JSON" | jq -r .title) # Check if title matches version pattern if [[ "$PR_TITLE" == *"1.4."* ]]; then echo "✅ Found Release PR: #$PR_NUMBER - $PR_TITLE" echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT echo "pr_title=$PR_TITLE" >> $GITHUB_OUTPUT PR_AUTHOR=$(echo "$PR_JSON" | jq -r .user.login) echo "pr_author=$PR_AUTHOR" >> $GITHUB_OUTPUT # Check first-time contributor CONTRIBUTOR_JSON=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/contributors/$PR_AUTHOR) CONTRIBUTIONS=$(echo "$CONTRIBUTOR_JSON" | jq -r .contributions) if [ "$CONTRIBUTIONS" = "1" ]; then echo "is_first_contributor=true" >> $GITHUB_OUTPUT fi # Get PR body safely PR_BODY=$(echo "$PR_JSON" | jq -r .body) { echo "pr_body<> $GITHUB_OUTPUT FOUND_PR=true break fi fi done if [ "$FOUND_PR" = "false" ]; then echo "⚠️ No recent PR found matching '1.4.*'." fi # \Switch back to the 'repo' branch where APKs are stored - name: Switch back to repo branch run: | echo "Switching git context back to 'repo' branch..." git checkout repo - name: Find APK and extract version id: apk_info run: | # Find the Kavita APK APK_PATH=$(find ./apk -name "tachiyomi-all.kavita-*.apk" -type f | head -n 1) if [ -z "$APK_PATH" ]; then echo "❌ No Kavita APK found in ./apk folder!" echo "Current directory contents:" ls -R exit 1 fi APK_FILENAME=$(basename "$APK_PATH") # Extract version (e.g., v1.4.22) VERSION=$(echo "$APK_FILENAME" | grep -oP 'v\d+\.\d+\.\d+') if [ -z "$VERSION" ]; then echo "❌ Could not determine version from filename: $APK_FILENAME" exit 1 fi echo "Found APK: $APK_PATH" echo "Detected Version: $VERSION" echo "apk_path=$APK_PATH" >> $GITHUB_OUTPUT echo "version=$VERSION" >> $GITHUB_OUTPUT # Check if release already exists to prevent duplicates - name: Check if release exists id: check_release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION="${{ steps.apk_info.outputs.version }}" echo "Checking if release $VERSION already exists..." if gh release view "$VERSION" > /dev/null 2>&1; then echo "⚠️ Release $VERSION already exists! Skipping creation." echo "exists=true" >> $GITHUB_OUTPUT else echo "✅ Release $VERSION does not exist. Proceeding." echo "exists=false" >> $GITHUB_OUTPUT fi - name: Get changelog if: steps.check_release.outputs.exists == 'false' id: changelog run: | # We need master history again for the changelog git checkout master LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [ -n "$LAST_TAG" ]; then COMMITS=$(git log $LAST_TAG..HEAD --pretty=format:"- %s (%h)") else COMMITS=$(git log --pretty=format:"- %s (%h)" -n 20) fi { echo "changelog<> $GITHUB_OUTPUT - name: Create Release if: steps.check_release.outputs.exists == 'false' uses: softprops/action-gh-release@v2 with: name: Release ${{ steps.apk_info.outputs.version }} tag_name: ${{ steps.apk_info.outputs.version }} target_commitish: repo body: | ## 🚀 Release ${{ steps.apk_info.outputs.version }} ### 📝 Pull Request ${{ steps.pr_info.outputs.pr_number && format('- Pull Request #%s by @%s', steps.pr_info.outputs.pr_number, steps.pr_info.outputs.pr_author) || 'Manual release' }} ${{ steps.pr_info.outputs.pr_title && format('- Title: %s', steps.pr_info.outputs.pr_title) || '' }} ${{ steps.pr_info.outputs.is_first_contributor == 'true' && format('### 🎉 Welcome @%s on their first contribution!', steps.pr_info.outputs.pr_author) || '' }} ${{ steps.pr_info.outputs.pr_body && format('### 📋 Description:\n%s', steps.pr_info.outputs.pr_body) || '' }} ### 📦 Changes since last release: ${{ steps.changelog.outputs.changelog }} --- 🤖 *This release was automatically created* files: ${{ steps.apk_info.outputs.apk_path }} draft: false prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}