Create Release PRs #88
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" |