Skip to content

Create Release PR

Create Release PR #14

name: Create Release PR
# Note: The "Use workflow from" dropdown selects which version of THIS workflow to run.
# Always select "main" unless you're testing workflow changes from another branch.
# The "base_branch" input below determines where the release PR will be targeted.
on:
workflow_dispatch:
inputs:
version:
description: 'New SDK version (e.g. 5.1.38 or 5.2.0-beta1)'
type: string
required: true
base_branch:
description: 'Target branch for the PR (e.g. main for regular releases, 5.4-main for 5.4.x releases)'
type: string
required: false
default: 'main'
permissions:
contents: write
pull-requests: write
jobs:
bump-version:
runs-on: ubuntu-latest
env:
VERSION: ${{ github.event.inputs.version }}
BASE_BRANCH: ${{ github.event.inputs.base_branch || 'main' }}
BRANCH: rel/${{ github.event.inputs.version }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: 📋 Display Configuration
run: |
echo "============================================"
echo "📦 Release Version: $VERSION"
echo "🎯 Base Branch (PR Target): $BASE_BRANCH"
echo "🌿 Release Branch (to create): $BRANCH"
echo "============================================"
- name: ✅ Validate Base Branch
run: |
if [[ "$BASE_BRANCH" == "main" ]]; then
echo "✅ Valid base branch: main"
elif [[ "$BASE_BRANCH" =~ ^[0-9]+\.[0-9]+-main$ ]]; then
echo "✅ Valid base branch: $BASE_BRANCH"
else
echo "❌ ERROR: Invalid base branch '$BASE_BRANCH'"
echo ""
echo "Base branch must be either:"
echo " - 'main' (for regular releases)"
echo " - 'X.Y-main' (for version-specific releases, e.g., 5.4-main, 5.5-main)"
echo ""
echo "Examples:"
echo " ✅ main"
echo " ✅ 5.4-main"
echo " ✅ 5.10-main"
echo " ❌ master"
echo " ❌ 5.4"
echo " ❌ 5.4-develop"
exit 1
fi
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Ensure full history for git log
fetch-tags: true
- name: Create release branch from base
run: |
if git ls-remote --exit-code --heads origin "$BRANCH"; then
echo "Deleting remote branch $BRANCH"
git push origin --delete "$BRANCH"
fi
echo "Creating release branch $BRANCH from $BASE_BRANCH"
git checkout -b "$BRANCH" origin/$BASE_BRANCH
- name: Update SDK_VERSION in gradle.properties
run: |
sed -i "s/^SDK_VERSION=.*/SDK_VERSION=$VERSION/" OneSignalSDK/gradle.properties
sed -i "s/^SDK_VERSION=.*/SDK_VERSION=$VERSION/" Examples/OneSignalDemo/gradle.properties
- name: Commit and Push changes
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git commit -am "chore: bump SDK_VERSION to $VERSION"
git push origin "$BRANCH"
- name: Fetch Last GitHub Release Tag
id: fetch_last_release
run: |
echo "Fetching latest GitHub release tag..."
LAST_TAG=$(gh release list --limit 1 --json tagName --jq '.[0].tagName')
if [[ -z "$LAST_TAG" ]]; then
echo "❌ No previous release tag found. Cannot generate release notes."
exit 0
fi
echo "✅ Found last release tag: $LAST_TAG"
echo "range=$LAST_TAG..HEAD" >> $GITHUB_OUTPUT
- name: Generate Release Notes from PR Titles
id: generate_notes
run: |
echo "## 🔖 Auto-Generated Release Notes" > pr_body.md
echo "" >> pr_body.md
if [[ "$VERSION" == *"alpha"* ]]; then
CHANNEL="alpha"
elif [[ "$VERSION" == *"beta"* ]]; then
CHANNEL="beta"
else
CHANNEL="current"
fi
echo "**Channels:** $CHANNEL" >> pr_body.md
echo "" >> pr_body.md
RANGE="${{ steps.fetch_last_release.outputs.range }}"
echo "📦 Commit range: $RANGE"
COMMITS=$(git log "$RANGE" --pretty=format:"%H" | sort -u)
if [[ -z "$COMMITS" ]]; then
echo "❌ No commits found. Exiting."
exit 0
fi
> raw_titles.txt
for SHA in $COMMITS; do
PR_INFO=$(gh api "repos/${{ github.repository }}/commits/$SHA/pulls" \
-H "Accept: application/vnd.github.groot-preview+json" 2>/dev/null)
TITLE=$(echo "$PR_INFO" | jq -r '.[0].title // empty')
NUMBER=$(echo "$PR_INFO" | jq -r '.[0].number // empty')
if [[ -n "$TITLE" && -n "$NUMBER" ]]; then
echo "$TITLE ([#$NUMBER](https://github.com/${{ github.repository }}/pull/$NUMBER))" >> raw_titles.txt
echo "✅ $SHA → $TITLE (#$NUMBER)"
else
echo "⚠️ $SHA → No PR found"
fi
done
sort -fu raw_titles.txt > pr_titles.txt
if [[ ! -s pr_titles.txt ]]; then
echo "❌ No PR titles found from commits. Exiting."
exit 0
fi
echo "" >> pr_body.md
echo "### 🚀 New Features" >> pr_body.md
grep -i '^feat' pr_titles.txt | sed 's/^/- /' >> pr_body.md || echo "- _None_" >> pr_body.md
echo "" >> pr_body.md
echo "### 🐛 Bug Fixes" >> pr_body.md
grep -i '^bug' pr_titles.txt | sed 's/^/- /' >> pr_body.md || echo "- _None_" >> pr_body.md
echo "" >> pr_body.md
echo "### 🔧 Improvements" >> pr_body.md
grep -i -E '^(perf|refactor)' pr_titles.txt | sed 's/^/- /' >> pr_body.md || echo "- _None_" >> pr_body.md
echo "" >> pr_body.md
echo "### 📝 Uncategorized PRs" >> pr_body.md
grep -v -i -E '^(feat|bug|perf|refactor)' pr_titles.txt | sed 's/^/- /' >> pr_body.md || echo "- _None_" >> pr_body.md
echo "" >> pr_body.md
echo "### 📦 Version" >> pr_body.md
echo "$VERSION" >> pr_body.md
- name: Create Pull Request
run: |
gh pr create \
--title "Release SDK v$VERSION" \
--body-file pr_body.md \
--head "$BRANCH" \
--base "$BASE_BRANCH"