Skip to content

Create Release PRs

Create Release PRs #88

Workflow file for this run

name: Create Release PRs
# 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.
# This workflow bumps version and creates PRs in the iOS-SDK and XCFramework SDK.
on:
workflow_dispatch:
inputs:
version:
description: "The version number of the release (e.g., 5.2.15 or 5.2.3-beta-01)"
type: string
required: true
base_branch:
description: 'Target branch for the PR (e.g. main for regular releases, 5.3-main for 5.3.x releases)'
type: string
required: false
default: 'main'
permissions: write-all
jobs:
bump-version:
runs-on: macos-13
env:
VERSION: ${{ github.event.inputs.version }}
BASE_BRANCH: ${{ github.event.inputs.base_branch }}
RELEASE_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): $RELEASE_BRANCH"
echo "============================================"
- name: Checkout OneSignal-iOS-SDK
uses: actions/checkout@v4
with:
ref: ${{ env.BASE_BRANCH }}
fetch-depth: 0
- name: Create Release Branch
run: |
# Delete remote branch if it exists
git push origin --delete $RELEASE_BRANCH || true
# Create and checkout new release branch
git checkout -b $RELEASE_BRANCH
echo "Created release branch: $RELEASE_BRANCH"
# Configure git user (only needed once per repo)
git config --local user.email "[email protected]"
git config --local user.name "github-actions[bot]"
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '15.2'
- name: Install the Apple distribution certificate and provisioning profile (OneSignal)
uses: apple-actions/import-codesign-certs@v2
with:
keychain-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Install the Apple distribution certificate and provisioning profile (Lilomi)
uses: apple-actions/import-codesign-certs@v2
with:
create-keychain: false # do not create a new keychain for this value
keychain-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
p12-file-base64: ${{ secrets.DEV_CERTIFICATES_P12 }}
p12-password: ${{ secrets.DEV_CERTIFICATES_P12_PASSWORD }}
- name: Update Version in SDK and Podspec Files
run: |
cd iOS_SDK/OneSignalSDK
chmod +x ./update_version.sh
./update_version.sh $VERSION
shell: bash
- name: Commit Version Bump and Push Changes
run: |
git commit -am "chore: bump version to $VERSION"
git push origin $RELEASE_BRANCH
- name: Build Binaries
run: |
cd iOS_SDK/OneSignalSDK
chmod +x ./build_all_frameworks.sh
./build_all_frameworks.sh
shell: bash
# TODO: Commented out for testing only! Add back!
# - name: Code Sign
# run: |
# cd iOS_SDK/OneSignalSDK
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_Core/OneSignalCore.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_Extension/OneSignalExtension.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_InAppMessages/OneSignalInAppMessages.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_Location/OneSignalLocation.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_Notifications/OneSignalNotifications.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_OSCore/OneSignalOSCore.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_Outcomes/OneSignalOutcomes.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_User/OneSignalUser.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_XCFramework/OneSignalFramework.xcframework
# codesign --timestamp -v --sign "Apple Distribution: OneSignal, Inc. (J3J28YJX9L)" OneSignal_LiveActivities/OneSignalLiveActivities.xcframework
# shell: bash
# - name: Commit Build and Push Changes
# run: |
# git commit -am "chore: build binaries"
# git push origin $RELEASE_BRANCH
- name: Update Swift Package
run: |
cd iOS_SDK/OneSignalSDK
chmod +x ./update_swift_package.sh
./update_swift_package.sh $VERSION
shell: bash
- name: Commit Swift Package and Push Changes
run: |
git commit -am "chore: update Swift package"
git push origin $RELEASE_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
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 for iOS SDK
run: |
gh pr create \
--title "Release $VERSION" \
--body-file pr_body.md \
--head "$RELEASE_BRANCH" \
--base "$BASE_BRANCH"
- name: Checkout OneSignal-XCFramework
uses: actions/checkout@v4
with:
repository: OneSignal/OneSignal-XCFramework
ref: ${{ env.BASE_BRANCH }}
path: xcframework-repo
token: ${{ secrets.PAT_TOKEN_ONESIGNAL_XCFRAMEWORK }}
- name: Update Package.swift in XCFramework Repository
run: |
# Copy Package.swift from iOS SDK to XCFramework repo
cp Package.swift xcframework-repo/Package.swift
# Navigate to XCFramework repo
cd xcframework-repo
# Delete remote branch if it exists
git push origin --delete $RELEASE_BRANCH || true
# Create release branch
git checkout -b $RELEASE_BRANCH
# Configure git
git config --local user.email "[email protected]"
git config --local user.name "github-actions[bot]"
# Commit changes
git commit -am "Release $VERSION"
# Push to remote
git push origin $RELEASE_BRANCH
- name: Create Pull Request for XCFramework Repository
env:
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN_ONESIGNAL_XCFRAMEWORK }}
run: |
cd xcframework-repo
gh pr create \
--title "Release $VERSION" \
--body-file ../pr_body.md \
--head "$RELEASE_BRANCH" \
--base "$BASE_BRANCH"