diff --git a/.github/actions/setup-environment/action.yml b/.github/actions/setup-environment/action.yml new file mode 100644 index 000000000..a664f256c --- /dev/null +++ b/.github/actions/setup-environment/action.yml @@ -0,0 +1,26 @@ +name: 'Setup Environment' +description: 'Common setup steps for Unity release workflows (Git config and environment prep)' + +inputs: + gh_token: + description: 'GitHub token for gh CLI authentication' + required: true + +runs: + using: 'composite' + steps: + - name: Configure Git + shell: bash + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + + - name: Prepare Environment + env: + GH_TOKEN: ${{ inputs.gh_token }} + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y gh jq || true + gh auth status || gh auth login --with-token <<< "$GH_TOKEN" + diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml new file mode 100644 index 000000000..65f020c11 --- /dev/null +++ b/.github/workflows/create-release-pr.yml @@ -0,0 +1,283 @@ +name: Create Unity Release PR + +on: + # For making a release pr from android / ios sdk actions + workflow_call: + inputs: + unity_version: + description: 'New Unity Version (e.g., 5.2.15 or 5.2.15-beta.1)' + required: true + type: string + android_version: + description: 'New Android SDK Version (e.g., 2.3.0). Leave blank to skip.' + required: false + type: string + ios_version: + description: 'New iOS SDK Version (e.g., 1.5.0). Leave blank to skip.' + required: false + type: string + + # For making a release pr from github actions + workflow_dispatch: + inputs: + unity_version: + description: 'New Unity Version (e.g., 5.2.15 or 5.2.15-beta.1)' + required: true + type: string + android_version: + description: 'New Android SDK Version (e.g., 2.3.0). Leave blank to skip.' + required: false + type: string + ios_version: + description: 'New iOS SDK Version (e.g., 1.5.0). Leave blank to skip.' + required: false + type: string + +permissions: + contents: write + pull-requests: write + +jobs: + prep: + uses: OneSignal/sdk-actions/.github/workflows/prep-release.yml@main + with: + version: ${{ inputs.unity_version }} + + # Unity specific steps + update-version: + needs: prep + runs-on: ubuntu-latest + outputs: + unity_from: ${{ steps.current_versions.outputs.unity_from }} + ios_from: ${{ steps.current_versions.outputs.ios_from }} + android_from: ${{ steps.current_versions.outputs.android_from }} + + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + ref: ${{ needs.prep.outputs.release_branch }} + + - name: Setup Environment + uses: ./.github/actions/setup-environment + with: + gh_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Get current native SDK versions + id: current_versions + run: | + # Current Unity version + CURRENT_VERSION=$(cat OneSignalExample/Assets/OneSignal/VERSION | tr -d '\n\r' | xargs) + + # Extract current Android SDK version + ANDROID_VERSION=$(grep -oE 'spec="com.onesignal:OneSignal:[0-9]+\.[0-9]+\.[0-9]+"' com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml | sed -E 's/.*OneSignal:([0-9]+\.[0-9]+\.[0-9]+)".*/\1/' | head -1) + + # Extract current iOS SDK version + IOS_VERSION=$(grep -oE 'version="[0-9.]+"' com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml | grep -oE '[0-9.]+' | head -1) + + echo "unity_from=${CURRENT_VERSION}" >> $GITHUB_OUTPUT + echo "android_from=${ANDROID_VERSION}" >> $GITHUB_OUTPUT + echo "ios_from=${IOS_VERSION}" >> $GITHUB_OUTPUT + + echo " unity_from: ${CURRENT_VERSION}" + echo " android_from: ${ANDROID_VERSION}" + echo " ios_from: ${IOS_VERSION}" + + - name: Update Android SDK version + if: inputs.android_version != '' + run: | + VERSION="${{ inputs.android_version }}" + + # Validate version exists on GitHub + RELEASE=$(curl -s -H "Authorization: token ${{ github.token }}" \ + "https://api.github.com/repos/OneSignal/OneSignal-Android-SDK/releases/tags/${VERSION}") + + if [ -z "$RELEASE" ]; then + echo "✗ Android SDK version ${VERSION} not found" + exit 1 + fi + + sed -i -E "s/spec=\"com\.onesignal:OneSignal:[0-9][0-9.]*\"/spec=\"com.onesignal:OneSignal:$VERSION\"/" com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml + sed -i -E "s/'com\.onesignal:OneSignal:[0-9][0-9.]*'/'com.onesignal:OneSignal:$VERSION'/" OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle + sed -i -E "s/com\.onesignal:OneSignal:[0-9][0-9.]*<\/package>/com.onesignal:OneSignal:$VERSION<\/package>/" OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml + + echo "✓ Updated Android SDK to ${VERSION}" + git add . + git commit -m "Bump Android SDK $VERSION" + git push + + - name: Update iOS SDK version + if: inputs.ios_version != '' + run: | + VERSION="${{ inputs.ios_version }}" + + # Validate version exists on GitHub + RELEASE=$(curl -s -H "Authorization: token ${{ github.token }}" \ + "https://api.github.com/repos/OneSignal/OneSignal-iOS-SDK/releases/tags/${VERSION}") + + if [ -z "$RELEASE" ]; then + echo "✗ iOS SDK version ${VERSION} not found" + exit 1 + fi + + sed -i -E "s/version=\"[0-9][0-9.]*\"/version=\"$VERSION\"/" com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml + + echo "✓ Updated iOS SDK to ${VERSION}" + git add . + git commit -m "Bump iOS SDK $VERSION" + git push + + create-pr: + needs: [prep, update-version] + uses: OneSignal/sdk-actions/.github/workflows/create-release.yml@main + with: + release_branch: ${{ needs.prep.outputs.release_branch }} + version_from: ${{ needs.update-version.outputs.unity_from }} + version_to: ${{ inputs.unity_version }} + android_from: ${{ needs.update-version.outputs.android_from }} + android_to: ${{ inputs.android_version }} + ios_from: ${{ needs.update-version.outputs.ios_from }} + ios_to: ${{ inputs.ios_version }} + + draft-release: + needs: [prep, update-version] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + ref: ${{ needs.prep.outputs.release_branch }} + + - name: Setup Environment + uses: ./.github/actions/setup-environment + with: + gh_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Update Unity SDK version + run: | + echo "Updating Unity SDK version to ${{ inputs.unity_version }}" + + # Version string formats + PADDED_VERSION=$(printf "%06d" $(echo "${{ inputs.unity_version }}" | sed 's/[^0-9]//g')) + + # VERSION file + printf "%s" "${{ inputs.unity_version }}" > OneSignalExample/Assets/OneSignal/VERSION + + # package.json files + for file in com.onesignal.unity.core/package.json com.onesignal.unity.android/package.json com.onesignal.unity.ios/package.json; do + sed -i "s/\"version\": \".*\"/\"version\": \"${{ inputs.unity_version }}\"/" "$file" + sed -i "s/\"com.onesignal.unity.core\": \".*\"/\"com.onesignal.unity.core\": \"${{ inputs.unity_version }}\"/" "$file" + done + + sed -i "s/public const string Version = \".*\"/public const string Version = \"${{ inputs.unity_version }}\"/" \ + com.onesignal.unity.core/Runtime/OneSignal.cs + sed -i "s/public const string VersionHeader = \".*\"/public const string VersionHeader = \"${PADDED_VERSION}\"/" \ + com.onesignal.unity.core/Runtime/OneSignalPlatform.cs + + # asmdef files + for asm in \ + OneSignalExample/Assets/OneSignal/Example/OneSignal.UnityPackage.Example.asmdef \ + OneSignalExample/Assets/OneSignal/Editor/OneSignal.UnityPackage.Editor.asmdef \ + OneSignalExample/Assets/OneSignal/Attribution/OneSignal.UnityPackage.Attribution.asmdef; do + sed -i "s/\"expression\": \".*\"/\"expression\": \"${{ inputs.unity_version }}\"/" "$asm" + done + + # packages-lock.json + sed -i "s/\"com.onesignal.unity.core\": \"[0-9.]\+\"/\"com.onesignal.unity.core\": \"${{ inputs.unity_version }}\"/g" \ + OneSignalExample/Packages/packages-lock.json + + # ProjectSettings.asset + sed -i "s/bundleVersion: .*/bundleVersion: ${{ inputs.unity_version }}/" \ + OneSignalExample/ProjectSettings/ProjectSettings.asset + + # iOS plugin version (UIApplication+OneSignalUnity.mm) + sed -i "s/setSdkVersion:@\"[0-9]*\"/setSdkVersion:@\"${PADDED_VERSION}\"/" \ + com.onesignal.unity.ios/Runtime/Plugins/iOS/UIApplication+OneSignalUnity.mm + + # to save time, use cached Unity installation if available + - name: Cache Unity + uses: actions/cache@v4 + with: + path: /home/runner/Unity/Hub + key: UnityEditor-${{ runner.os }} + restore-keys: | + UnityEditor-${{ runner.os }} + + # setup Unity using the version file + - name: Setup Unity + uses: buildalon/unity-setup@v2.1.1 + with: + version-file: 'OneSignalExample/ProjectSettings/ProjectVersion.txt' + + # need to activate the Unity license to run Unity in batchmode; required for exportPackage + - uses: buildalon/activate-unity-license@v2 + with: + license: 'Personal' + username: '${{ secrets.UNITY_USERNAME }}' + password: '${{ secrets.UNITY_PASSWORD }}' + + - name: Cleaning up Unity locks + run: | + pkill -f Unity || true + rm -f OneSignalExample/Temp/UnityLockfile + rm -rf OneSignalExample/Library OneSignalExample/Temp OneSignalExample/obj OneSignalExample/UserSettings || true + + - name: Run UpdateProjectVersion + uses: buildalon/unity-action@v3 + with: + project-path: OneSignalExample + args: -quit -batchmode -nographics -buildTarget Android -executeMethod OneSignalSDK.OneSignalPackagePublisher.UpdateProjectVersion + + - name: Run ExportUnityPackage + uses: buildalon/unity-action@v3 + with: + project-path: OneSignalExample + args: -quit -batchmode -nographics -buildTarget Android -executeMethod OneSignalSDK.OneSignalPackagePublisher.ExportUnityPackage + + # get the release notes from the PR generated by the shared action + - name: Get PR release notes + id: notes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + release_notes=$(gh pr view "${{ github.event.pull_request.number }}" --json body -q '.body') + + cleaned_notes=$(echo "$release_notes" \ + | awk '/^Update/{found=1} found' \ + | sed '/^- - -$/d' \ + | sed '/^[[:space:]]*$/d') + + echo "RELEASE_NOTES<> $GITHUB_ENV + echo "$cleaned_notes" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Update CHANGELOG.md + run: | + echo "Inserting release notes for ${{ inputs.unity_version }}..." + awk -v ver="${{ inputs.unity_version }}" \ + -v notes="$RELEASE_NOTES" \ + 'BEGIN { printed=0 } + /^## \[Unreleased\]/ { + print $0; + print "## [" ver "]\n### Changed"; + print notes "\n"; + printed=1; + next + } + { print $0 }' CHANGELOG.md > CHANGELOG.tmp && mv CHANGELOG.tmp CHANGELOG.md + + - name: Commit Release + run: | + git add . + git commit -m "Release ${{ inputs.unity_version }}" + git push + + - name: Draft Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + package_path="OneSignalExample/OneSignal-v${{ inputs.unity_version }}.unitypackage" + gh release create "${{ inputs.unity_version }}" "${package_path}"\ + --draft\ + --title "${{ inputs.unity_version }} Release"\ + --notes "TODO" \ No newline at end of file diff --git a/OneSignalExample/Assets/OneSignalPackager/Editor/OneSignalPackagePublisher.cs b/OneSignalExample/Assets/OneSignalPackager/Editor/OneSignalPackagePublisher.cs index 6c9a8d768..b6630d245 100644 --- a/OneSignalExample/Assets/OneSignalPackager/Editor/OneSignalPackagePublisher.cs +++ b/OneSignalExample/Assets/OneSignalPackager/Editor/OneSignalPackagePublisher.cs @@ -45,12 +45,24 @@ public static void UpdateProjectVersion() [MenuItem("OneSignal/ExportUnityPackage")] public static void ExportUnityPackage() { + UnityEngine.Debug.Log($"[OneSignalPackagePublisher] start exporting package"); AssetDatabase.Refresh(); var packageVersion = File.ReadAllText(VersionFilePath); var packageName = $"OneSignal-v{packageVersion}.unitypackage"; + UnityEngine.Debug.Log($"[OneSignalPackagePublisher] package name: {packageName}"); + + string[] filePaths = _filePaths(); + UnityEngine.Debug.Log( + $"[OneSignalPackagePublisher] Found {filePaths.Length} files/directories to include:" + ); + foreach (var path in filePaths) + { + UnityEngine.Debug.Log($"[OneSignalPackagePublisher] - {path}"); + } + AssetDatabase.ExportPackage( - _filePaths(), + filePaths, packageName, ExportPackageOptions.Recurse | ExportPackageOptions.IncludeDependencies ); @@ -68,6 +80,9 @@ public static void ExportUnityPackage() private static string[] _filePaths() { var files = Directory.GetFileSystemEntries(PackagePath); + UnityEngine.Debug.Log( + $"[OneSignalPackagePublisher] Getting file paths from: {PackagePath}" + ); var pathsToInclude = files.Where(file => { if (file.EndsWith(".meta")) diff --git a/OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle b/OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle index 8367ed164..9059180e0 100644 --- a/OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle +++ b/OneSignalExample/Assets/Plugins/Android/mainTemplate.gradle @@ -6,7 +6,7 @@ apply plugin: 'com.android.library' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // Android Resolver Dependencies Start - implementation 'com.onesignal:OneSignal:5.1.37' // Packages/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml:6 + implementation 'com.onesignal:OneSignal:5.1.38' // Packages/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml:6 // Android Resolver Dependencies End **DEPS**} diff --git a/OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml b/OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml index a8f902665..8d6a24f89 100644 --- a/OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml +++ b/OneSignalExample/ProjectSettings/AndroidResolverDependencies.xml @@ -1,6 +1,6 @@ - com.onesignal:OneSignal:5.1.37 + com.onesignal:OneSignal:5.1.38 diff --git a/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml b/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml index ef098636b..06a843794 100644 --- a/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml +++ b/com.onesignal.unity.android/Editor/OneSignalAndroidDependencies.xml @@ -3,6 +3,6 @@ https://repo.maven.apache.org/maven2 - + diff --git a/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml b/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml index ba5b6bff1..922ae934e 100644 --- a/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml +++ b/com.onesignal.unity.ios/Editor/OneSignaliOSDependencies.xml @@ -1,5 +1,5 @@  - +