44 workflow_dispatch :
55 inputs :
66 android_version :
7- description : " Target OneSignal-Android-SDK version (e.g., 5.1.31 )"
7+ description : " Target OneSignal-Android-SDK version (e.g., 5.1.38 )"
88 required : true
99 type : string
1010 ios_version :
11- description : " Target OneSignal-iOS-SDK version (e.g., 5.2.10 )"
11+ description : " Target OneSignal-iOS-SDK version (e.g., 5.2.15 )"
1212 required : true
1313 type : string
1414
@@ -20,172 +20,143 @@ jobs:
2020 bump-native-sdks :
2121 runs-on : ubuntu-latest
2222 env :
23- GH_TOKEN : ${{ secrets.ONESIGNAL_PAT }}
23+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
2424
2525 steps :
2626 - name : Checkout repository
2727 uses : actions/checkout@v4
2828 with :
2929 fetch-depth : 0
3030
31- - name : Install gh CLI
32- run : |
33- sudo apt-get update -y
34- sudo apt-get install -y gh jq
35-
36- - name : Configure GitHub CLI
37- run : gh auth status || gh auth login --with-token <<< "${GH_TOKEN}"
38-
39- - name : Debug GH CLI access
40- run : |
41- echo "🔍 Checking authentication"
42- gh auth status
43- echo "🔍 Listing releases from Android SDK repo"
44- gh release list --repo OneSignal/OneSignal-Android-SDK --limit 5
45- echo "🔍 Listing releases from iOS SDK repo"
46- gh release list --repo OneSignal/OneSignal-iOS-SDK --limit 5
47-
4831 - name : Get current native SDK versions
4932 id : current
5033 run : |
51- set -e
52- cd "${GITHUB_WORKSPACE}" || exit 1
53-
5434 ANDROID_FILE="com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml"
5535 IOS_FILE="com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml"
5636
57- if [[ ! -f "$ANDROID_FILE" ]]; then
58- echo "❌ Android dependency file not found!"
59- find . -name "OneSignalAndroidDependencies.xml"
60- exit 1
61- fi
62-
63- if [[ ! -f "$IOS_FILE" ]]; then
64- echo "❌ iOS dependency file not found!"
65- find . -name "OneSignaliOSDependencies.xml"
37+ echo "✅ Checking dependency files..."
38+ if [[ ! -f "$ANDROID_FILE" || ! -f "$IOS_FILE" ]]; then
39+ echo "❌ Missing dependency file(s)"
6640 exit 1
6741 fi
6842
69- echo "✅ Found both dependency files."
70- echo "→ Android: $ANDROID_FILE"
71- echo "→ iOS: $IOS_FILE"
72-
7343 ANDROID_CURRENT=$(grep -oE 'com\.onesignal:OneSignal:[0-9]+\.[0-9]+\.[0-9]+' "$ANDROID_FILE" | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
7444 IOS_CURRENT=$(grep -oE 'OneSignalXCFramework\" version=\"[0-9]+\.[0-9]+\.[0-9]+' "$IOS_FILE" | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
7545
76- echo "Detected current Android SDK : ${ANDROID_CURRENT:-<none> }"
77- echo "Detected current iOS SDK : ${IOS_CURRENT:-<none> }"
46+ echo "📦 Android current : ${ANDROID_CURRENT:-unknown }"
47+ echo "📦 iOS current : ${IOS_CURRENT:-unknown }"
7848
7949 echo "android_current=${ANDROID_CURRENT}" >> $GITHUB_OUTPUT
8050 echo "ios_current=${IOS_CURRENT}" >> $GITHUB_OUTPUT
8151
82- - name : Gather all release notes between versions
52+ - name : Gather native release notes
8353 id : notes
84- shell : bash {0}
85- run : |
86- ANDROID_OLD=${{ steps.current.outputs.android_current }}
87- ANDROID_NEW=${{ inputs.android_version }}
88- IOS_OLD=${{ steps.current.outputs.ios_current }}
89- IOS_NEW=${{ inputs.ios_version }}
90-
91- echo "ANDROID_OLD=${ANDROID_OLD}, ANDROID_NEW=${ANDROID_NEW}"
92- echo "IOS_OLD=${IOS_OLD}, IOS_NEW=${IOS_NEW}"
93-
94- get_notes_between() {
95- local repo=$1
96- local from=$2
97- local to=$3
98-
99- echo "🔎 Gathering release notes for $repo from $from → $to"
100- RELEASES=$(gh release list --repo "$repo" --limit 200 --json tagName --jq '.[] | .tagName' | sed 's/^Release //g' | sort -V)
101- START=0
102- NOTES=""
103- FOUND=0
104-
105- for TAG in $RELEASES; do
106- echo "Checking tag: $TAG"
107- if [[ "$TAG" == "$from" ]]; then
108- START=1
109- continue
110- fi
111- if [[ "$START" -eq 1 ]]; then
112- BODY=$(gh release view "$TAG" --repo "$repo" --json body,tagName --jq '". - ### " + .tagName + "\n" + (.body // "")' 2>/dev/null || true)
113- if [[ -n "$BODY" ]]; then
114- NOTES+="$BODY\n\n"
115- FOUND=1
116- fi
117- fi
118- if [[ "$TAG" == "$to" ]]; then
119- break
120- fi
121- done
122-
123- if [[ "$FOUND" -eq 0 ]]; then
124- echo "⚠️ No notes found between $from → $to (possibly mismatched tags)"
125- fi
126-
127- echo -e "$NOTES"
128- }
129-
130- ANDROID_NOTES=$(get_notes_between "OneSignal/OneSignal-Android-SDK" "$ANDROID_OLD" "$ANDROID_NEW")
131- IOS_NOTES=$(get_notes_between "OneSignal/OneSignal-iOS-SDK" "$IOS_OLD" "$IOS_NEW")
132-
133- echo "android_notes<<EOF" >> $GITHUB_OUTPUT
134- echo "$ANDROID_NOTES" >> $GITHUB_OUTPUT
135- echo "EOF" >> $GITHUB_OUTPUT
136- echo "ios_notes<<EOF" >> $GITHUB_OUTPUT
137- echo "$IOS_NOTES" >> $GITHUB_OUTPUT
138- echo "EOF" >> $GITHUB_OUTPUT
139-
140-
141-
54+ uses : actions/github-script@v8
55+ env :
56+ ANDROID_OLD : ${{ steps.current.outputs.android_current }}
57+ ANDROID_NEW : ${{ inputs.android_version }}
58+ IOS_OLD : ${{ steps.current.outputs.ios_current }}
59+ IOS_NEW : ${{ inputs.ios_version }}
60+ with :
61+ script : |
62+ const androidRepo = 'OneSignal/OneSignal-Android-SDK';
63+ const iosRepo = 'OneSignal/OneSignal-iOS-SDK';
64+
65+ async function getReleaseNotesBetween(repo, fromTag, toTag) {
66+ const [owner, repoName] = repo.split('/');
67+ const releases = await github.paginate(github.rest.repos.listReleases, {
68+ owner,
69+ repo: repoName,
70+ per_page: 100
71+ });
72+
73+ const tags = releases.map(r => r.tag_name.replace(/^Release\s+/, ''));
74+ const fromIndex = tags.indexOf(fromTag);
75+ const toIndex = tags.indexOf(toTag);
76+
77+ if (fromIndex === -1 || toIndex === -1) {
78+ core.warning(`⚠️ Could not find ${fromTag} or ${toTag} in ${repo}`);
79+ return '';
80+ }
81+
82+ const slice = releases.slice(Math.min(fromIndex, toIndex), Math.max(fromIndex, toIndex) + 1);
83+ let notes = '';
84+ for (const rel of slice.reverse()) {
85+ if (!rel || /alpha|beta|rc/i.test(rel.tag_name)) continue; // skip prerelease
86+ const body = (rel.body || '').split('<!--')[0].trim();
87+ notes += `\n- ### ${rel.tag_name}\n${body}\n`;
88+ }
89+
90+ return notes.trim();
91+ }
92+
93+ const androidNotes = await getReleaseNotesBetween(androidRepo, process.env.ANDROID_OLD, process.env.ANDROID_NEW);
94+ const iosNotes = await getReleaseNotesBetween(iosRepo, process.env.IOS_OLD, process.env.IOS_NEW);
95+
96+ core.setOutput('android_notes', androidNotes);
97+ core.setOutput('ios_notes', iosNotes);
98+
99+ # --- update xml and gradle references ---
142100 - name : Update native SDK versions in Unity dependencies
143101 run : |
144102 ANDROID_NEW=${{ inputs.android_version }}
145103 IOS_NEW=${{ inputs.ios_version }}
146104
147- echo "🔧 Updating Android SDK to $ANDROID_NEW in XML and Gradle..."
148- for FILE in \
149- com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml \
150- com.onesignal.unity.android/Editor/mainTemplate.gradle \
151- com.onesignal.unity.android/Editor/AndroidResolverDependencies.xml
152- do
153- if [[ -f "$FILE" ]]; then
154- sed -i "s#com\.onesignal:OneSignal:[0-9.]\+#com.onesignal:OneSignal:${ANDROID_NEW}#g" "$FILE"
155- echo "✅ Updated $FILE"
156- else
157- echo "⚠️ Skipping missing file: $FILE"
158- fi
159- done
160-
161- echo "🔧 Updating iOS SDK to $IOS_NEW..."
162- IOS_FILE="com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml"
163- if [[ -f "$IOS_FILE" ]]; then
164- sed -i "s/OneSignalXCFramework\" version=\"[0-9.]\+/OneSignalXCFramework\" version=\"${IOS_NEW}/g" "$IOS_FILE"
165- echo "✅ Updated $IOS_FILE"
166- else
167- echo "⚠️ Skipping missing file: $IOS_FILE"
168- fi
105+ echo "🔧 Updating Android SDK → $ANDROID_NEW"
106+ sed -i "s/com\.onesignal:OneSignal:[0-9.]\+/com.onesignal:OneSignal:${ANDROID_NEW}/g" \
107+ com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml || true
108+ sed -i "s/com\.onesignal:OneSignal:[0-9.]\+/com.onesignal:OneSignal:${ANDROID_NEW}/g" \
109+ OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle || true
110+ sed -i "s/com\.onesignal:OneSignal:[0-9.]\+/com.onesignal:OneSignal:${ANDROID_NEW}/g" \
111+ OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml || true
112+
113+ echo "🔧 Updating iOS SDK → $IOS_NEW"
114+ sed -i "s/OneSignalXCFramework\" version=\"[0-9.]\+/OneSignalXCFramework\" version=\"${IOS_NEW}/g" \
115+ com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml || true
169116
170117 - name : Insert formatted Android/iOS release notes under '## [Unreleased]'
118+ shell : bash
171119 run : |
120+ set -e
172121 ANDROID_OLD=${{ steps.current.outputs.android_current }}
173122 IOS_OLD=${{ steps.current.outputs.ios_current }}
174123 ANDROID_NEW=${{ inputs.android_version }}
175124 IOS_NEW=${{ inputs.ios_version }}
176- ANDROID_NOTES="${{ steps.notes.outputs.android_notes }}"
177- IOS_NOTES="${{ steps.notes.outputs.ios_notes }}"
125+
126+ # Normalize line endings
127+ git config core.autocrlf false
128+ find . -type f -name "*.md" -exec sed -i 's/\r$//' {} \;
129+
178130 CHANGELOG="OneSignalExample/Assets/OneSignal/CHANGELOG.md"
179131 TMPFILE=$(mktemp)
180132
181- INSERTION="\
182- - Updated included Android SDK from ${ANDROID_OLD} to [${ANDROID_NEW}](https://github.com/OneSignal/OneSignal-Android-SDK/releases/tag/${ANDROID_NEW})\n${ANDROID_NOTES}\n\
183- - Updated included iOS SDK from ${IOS_OLD} to [${IOS_NEW}](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/${IOS_NEW})\n${IOS_NOTES}\n\
184- \nFor full changes, see the [native release notes](https://github.com/OneSignal/OneSignal-Android-SDK/releases) and [iOS native release notes](https://github.com/OneSignal/OneSignal-iOS-SDK/releases)\n"
133+ echo "🪄 Updating changelog: $CHANGELOG"
134+
135+ # Build markdown safely — literal heredoc (no expansion or parsing)
136+ cat <<'EOF_INSERT' > insert.md
137+ - Updated included Android SDK from {{ANDROID_OLD}} to [{{ANDROID_NEW}}](https://github.com/OneSignal/OneSignal-Android-SDK/releases/tag/{{ANDROID_NEW}})
138+ {{ANDROID_NOTES}}
139+ - Updated included iOS SDK from {{IOS_OLD}} to [{{IOS_NEW}}](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/{{IOS_NEW}})
140+ {{IOS_NOTES}}
141+
142+ For full changes, see the [Android release notes](https://github.com/OneSignal/OneSignal-Android-SDK/releases) and [iOS release notes](https://github.com/OneSignal/OneSignal-iOS-SDK/releases)
143+ EOF_INSERT
144+
145+ # Replace placeholders using envsubst-style sed
146+ sed -i "s|{{ANDROID_OLD}}|${ANDROID_OLD}|g" insert.md
147+ sed -i "s|{{ANDROID_NEW}}|${ANDROID_NEW}|g" insert.md
148+ sed -i "s|{{IOS_OLD}}|${IOS_OLD}|g" insert.md
149+ sed -i "s|{{IOS_NEW}}|${IOS_NEW}|g" insert.md
150+
151+ # Append the actual release notes text
152+ echo "${{ steps.notes.outputs.android_notes }}" | sed 's/\r$//' >> insert.md
153+ echo "${{ steps.notes.outputs.ios_notes }}" | sed 's/\r$//' >> insert.md
154+
155+ # Inject under ## [Unreleased]
156+ awk -v insert="$(cat insert.md)" '/## \[Unreleased\]/ && !done {print; print insert; done=1; next}1' "$CHANGELOG" > "$TMPFILE" && mv "$TMPFILE" "$CHANGELOG"
185157
186- awk -v insert="$INSERTION" '/## \[Unreleased\]/ && !done {print; print insert; done=1; next}1' "$ CHANGELOG" > "$TMPFILE" && mv "$TMPFILE" "$CHANGELOG "
158+ echo "✅ CHANGELOG updated successfully. "
187159
188- echo "✅ Added detailed changelog under ## [Unreleased]"
189160
190161 - name : Commit and create PR
191162 run : |
@@ -201,9 +172,9 @@ jobs:
201172 gh pr create \
202173 --title "Bump native OneSignal SDKs; OneSignal-Android-SDK ${{ inputs.android_version }}, OneSignal-iOS-SDK ${{ inputs.ios_version }}" \
203174 --body "### 🧩 Native SDK Updates
204- - Android: ${{ inputs.android_version }}
205- - iOS: ${{ inputs.ios_version }}
175+ - ** Android:** ${{ inputs.android_version }}
176+ - ** iOS:** ${{ inputs.ios_version }}
206177
207- This PR updates Unity dependency files and inserts a detailed changelog entry under **[Unreleased]** in the Unity SDK changelog ." \
178+ This PR updates Unity dependency files and adds detailed native SDK changelogs under **[Unreleased]** in the Unity CHANGELOG ." \
208179 --base main \
209180 --label "native-sdk-bump"
0 commit comments