From 3181042ff6837805083ca3db4cf201b6d4432ac1 Mon Sep 17 00:00:00 2001 From: Adam Szeremeta Date: Wed, 30 Apr 2025 15:08:29 +0200 Subject: [PATCH 1/5] Initial setup --- .../workflows/ringpublishingtracking_ci.yml | 63 +++++++++++++++++++ .gitignore | 2 - .../project.pbxproj | 8 --- fastlane/.env.alpha | 5 ++ fastlane/Fastfile | 1 + 5 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/ringpublishingtracking_ci.yml create mode 100644 fastlane/.env.alpha create mode 100644 fastlane/Fastfile diff --git a/.github/workflows/ringpublishingtracking_ci.yml b/.github/workflows/ringpublishingtracking_ci.yml new file mode 100644 index 0000000..dd5a3f3 --- /dev/null +++ b/.github/workflows/ringpublishingtracking_ci.yml @@ -0,0 +1,63 @@ +# The name of the workflow +name: RingPublishingTracking - Continous Integration + +# When workflow should start +on: + workflow_dispatch: + branches: + - master + push: + branches: + - master + - 'feature/**' + - 'bugfix/**' + +# If workflow is already running - cancel it +concurrency: + cancel-in-progress: true + group: RingPublishingTracking-CI-${{ github.ref }} + +# Jobs to run +jobs: + + # Normal build with everything + sdk: + name: 'RingPublishingTracking' + uses: ringier-axel-springer-pl/native-mobile-workflow/.github/workflows/ci-ios-sdk.yml@main + with: + sdk-name: 'RingPublishingTracking' + fastlane-sdk-env-name: 'alpha' + secrets: inherit + + # Summary job + sdk_summary: + name: RingPublishingTracking build summary + runs-on: ["self-hosted", "macOS", "Xcode-16"] + needs: + - sdk + if: always() + steps: + - name: Set exit code based on job statuses + run: | + # When none of the needed jobs fail or are cancelled (skipped or successful jobs are ok) + if ${{ !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }} ; then + echo "RingPublishingTracking - build successful" + exit 0 + else + echo "RingPublishingTracking - build failed" + exit 1 + fi + + # Deployment + sdk_deployment: + name: 'RingPublishingTracking' + uses: ringier-axel-springer-pl/native-mobile-workflow/.github/workflows/deployment-ios-sdk.yml@main + needs: + - sdk_summary + if: github.ref_name == 'master' + with: + sdk-name: 'RingPublishingTracking' + fastlane-sdk-env-name: 'alpha' + deploy-environment: 'production' + secrets: + create_github_token_private_key: ${{ secrets.NATIVE_MOBILE_FASTLANE_GH_APP_CERTIFICATE }} diff --git a/.gitignore b/.gitignore index 2ecdcbf..e8a10d0 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,5 @@ Example/Pods ## SPM .swiftpm -fastlane/* -!fastlane/.env tests-build/* test-reports/* diff --git a/Example/RingPublishingTracking.xcodeproj/project.pbxproj b/Example/RingPublishingTracking.xcodeproj/project.pbxproj index 5c6fb42..f34cb7d 100644 --- a/Example/RingPublishingTracking.xcodeproj/project.pbxproj +++ b/Example/RingPublishingTracking.xcodeproj/project.pbxproj @@ -1423,9 +1423,6 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 97W46277W4; INFOPLIST_FILE = RingPublishingTracking/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1434,7 +1431,6 @@ MARKETING_VERSION = 1.8.4; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RingPublishingTracking-Example.RingPublishingTracking"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1447,9 +1443,6 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 97W46277W4; INFOPLIST_FILE = RingPublishingTracking/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1458,7 +1451,6 @@ MARKETING_VERSION = 1.8.4; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RingPublishingTracking-Example.RingPublishingTracking"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/fastlane/.env.alpha b/fastlane/.env.alpha new file mode 100644 index 0000000..69db416 --- /dev/null +++ b/fastlane/.env.alpha @@ -0,0 +1,5 @@ +DL_BUILD_CONFIGURATION="Release" +DL_BUILD_EXPORT_METHOD="development" + +DL_SKIP_CODESIGNING=true +DL_SKIP_ARCHIVE=true diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000..de4700f --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1 @@ +import_from_git(url: 'git@github.com:Ringier-Axel-Springer-PL/native-mobile-fastlane.git') \ No newline at end of file From d464549954ba59da42d95e3c5bec463dc3a6f092 Mon Sep 17 00:00:00 2001 From: Adam Szeremeta Date: Mon, 5 May 2025 09:00:17 +0200 Subject: [PATCH 2/5] lint + env --- .../Decorator/Generic/StructureInfoDecorator.swift | 9 ++++++--- .../Public/RingPublishingTracking+CurrentState.swift | 2 +- Tests/RingPublishingTrackingTests/EndpointTests.swift | 8 -------- fastlane/.env | 3 ++- fastlane/.env.alpha | 2 ++ 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Sources/RingPublishingTracking/Private/Decorator/Generic/StructureInfoDecorator.swift b/Sources/RingPublishingTracking/Private/Decorator/Generic/StructureInfoDecorator.swift index 4db3186..71adaf9 100644 --- a/Sources/RingPublishingTracking/Private/Decorator/Generic/StructureInfoDecorator.swift +++ b/Sources/RingPublishingTracking/Private/Decorator/Generic/StructureInfoDecorator.swift @@ -50,7 +50,8 @@ final class StructureInfoDecorator: Decorator { return [:] } - let resolved = structureType.parametersResolved(applicationRootPath: applicationRootPath, applicationAdvertisementSite: applicationAdvertisementSite) + let resolved = structureType.parametersResolved(applicationRootPath: applicationRootPath, + applicationAdvertisementSite: applicationAdvertisementSite) var params = [ "DV": resolved.dv, "DU": resolved.du + contentPageViewSource.utmMedium @@ -58,7 +59,9 @@ final class StructureInfoDecorator: Decorator { if let previousStructureType = previousInfo.structureType { let source = previousInfo.contentPageViewSource - params["DR"] = previousStructureType.parametersResolved(applicationRootPath: applicationRootPath, applicationAdvertisementSite: applicationAdvertisementSite).du + source.utmMedium + let resolvedDU = previousStructureType.parametersResolved(applicationRootPath: applicationRootPath, + applicationAdvertisementSite: applicationAdvertisementSite).du + params["DR"] = resolvedDU + source.utmMedium } return params @@ -76,7 +79,7 @@ extension StructureInfoDecorator { func updateApplicationRootPath(applicationRootPath: String) { self.applicationRootPath = applicationRootPath } - + func updateApplicationAdvertisementSite(applicationAdvertisementSite: String?) { self.applicationAdvertisementSite = applicationAdvertisementSite } diff --git a/Sources/RingPublishingTracking/Public/RingPublishingTracking+CurrentState.swift b/Sources/RingPublishingTracking/Public/RingPublishingTracking+CurrentState.swift index 5ebc728..0b4a045 100644 --- a/Sources/RingPublishingTracking/Public/RingPublishingTracking+CurrentState.swift +++ b/Sources/RingPublishingTracking/Public/RingPublishingTracking+CurrentState.swift @@ -47,7 +47,7 @@ public extension RingPublishingTracking { /// /// - Parameter currentAdvertisementArea: String func updateApplicationAdvertisementArea(currentAdvertisementArea: String?) { - Logger.log("Updating application advertisement area to: '\(currentAdvertisementArea)'") + Logger.log("Updating application advertisement area to: '\(String(describing: currentAdvertisementArea))'") eventsService?.updateApplicationAdvertisementArea(currentAdvertisementArea) } diff --git a/Tests/RingPublishingTrackingTests/EndpointTests.swift b/Tests/RingPublishingTrackingTests/EndpointTests.swift index b02987f..0511ff4 100644 --- a/Tests/RingPublishingTrackingTests/EndpointTests.swift +++ b/Tests/RingPublishingTrackingTests/EndpointTests.swift @@ -30,8 +30,6 @@ class EndpointTests: XCTestCase { XCTAssertNotNil(encoded) } - // swiftlint:disable non_optional_string_data_conversion - func testIdentifyRequestDecoding_sampleIdentifyResponseDataCreated_decodedResponseIsReturned() { // Given let data = """ @@ -62,8 +60,6 @@ class EndpointTests: XCTestCase { XCTAssertEqual(decoded?.postInterval, 30000, "postInterval of decoded response should match") } - // swiftlint:enable non_optional_string_data_conversion - func testEventRequestEncoding_sampleSendEventEnpointCreated_encodedBodyIsReturned() { // Given let eventRequest = EventRequest(ids: [ @@ -80,8 +76,6 @@ class EndpointTests: XCTestCase { XCTAssertNotNil(encoded) } - // swiftlint:disable non_optional_string_data_conversion - func testEventRequestDecoding_sampleSendEventResponseDataCreated_decodedResponseIsReturned() { // Given let data = """ @@ -97,6 +91,4 @@ class EndpointTests: XCTestCase { // Then XCTAssertEqual(decoded?.postInterval, 30000, "postInterval of decoded response should match") } - - // swiftlint:enable non_optional_string_data_conversion } diff --git a/fastlane/.env b/fastlane/.env index 9da43ee..f1eae33 100644 --- a/fastlane/.env +++ b/fastlane/.env @@ -10,4 +10,5 @@ DL_UNIT_TESTS_SCHEME = "RingPublishingTracking-Example" DL_PODSPEC_FILENAME = "RingPublishingTracking.podspec" -DL_GITHUB_REPO_NAME = "ringpublishing/RingPublishingTracking-iOS" \ No newline at end of file +DL_GITHUB_REPO_NAME = "ringpublishing/RingPublishingTracking-iOS" +DL_OUTPUT_SPEC_REPOSITORY="private" \ No newline at end of file diff --git a/fastlane/.env.alpha b/fastlane/.env.alpha index 69db416..a63b206 100644 --- a/fastlane/.env.alpha +++ b/fastlane/.env.alpha @@ -3,3 +3,5 @@ DL_BUILD_EXPORT_METHOD="development" DL_SKIP_CODESIGNING=true DL_SKIP_ARCHIVE=true +DL_DISABLE_AUTOMATIC_SIGNING_MANAGEMENT=true +DL_INSTALL_CERTIFICATES_AUTOMATICALLY=false From 190febca0d1edb9ba46326f48ed23b177008e1c1 Mon Sep 17 00:00:00 2001 From: Adam Szeremeta Date: Mon, 5 May 2025 09:19:56 +0200 Subject: [PATCH 3/5] Added workflow --- .../workflows/ringpublishingtracking_ci.yml | 62 ++++++++++++++----- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ringpublishingtracking_ci.yml b/.github/workflows/ringpublishingtracking_ci.yml index dd5a3f3..65401b2 100644 --- a/.github/workflows/ringpublishingtracking_ci.yml +++ b/.github/workflows/ringpublishingtracking_ci.yml @@ -17,24 +17,51 @@ concurrency: cancel-in-progress: true group: RingPublishingTracking-CI-${{ github.ref }} +# Global environment variables +env: + is_ci: true + ci_planRepository_branch: ${{ github.ref_name }} + CI_MATCH_KEYCHAIN_PASSWORD: ${{ secrets.NATIVE_MOBILE_CI_MATCH_KEYCHAIN_PASSWORD }} + CI_MATCH_KEYCHAIN_NAME: ${{ secrets.NATIVE_MOBILE_CI_MATCH_KEYCHAIN_NAME }} + # Jobs to run jobs: - # Normal build with everything - sdk: - name: 'RingPublishingTracking' - uses: ringier-axel-springer-pl/native-mobile-workflow/.github/workflows/ci-ios-sdk.yml@main - with: - sdk-name: 'RingPublishingTracking' - fastlane-sdk-env-name: 'alpha' - secrets: inherit + # Swiftlint job + swiftlint: + name: Swift Lint + runs-on: ["self-hosted", "macOS", "Xcode-16"] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run Swiftlint + run: | + fastlane init_env + fastlane strict_lint --env alpha + + # Build demo app + build_app: + name: Build iOS app + runs-on: ["self-hosted", "macOS", "Xcode-16"] + needs: + - swiftlint + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build iOS app + run: | + fastlane init_env + fastlane build_ipa skip_cocoapods:false build_number:${{ github.run_number }} --env alpha # Summary job sdk_summary: name: RingPublishingTracking build summary runs-on: ["self-hosted", "macOS", "Xcode-16"] needs: - - sdk + - swiftlint + - build_app if: always() steps: - name: Set exit code based on job statuses @@ -51,13 +78,16 @@ jobs: # Deployment sdk_deployment: name: 'RingPublishingTracking' - uses: ringier-axel-springer-pl/native-mobile-workflow/.github/workflows/deployment-ios-sdk.yml@main + runs-on: ["self-hosted", "macOS", "Xcode-16"] needs: - sdk_summary if: github.ref_name == 'master' - with: - sdk-name: 'RingPublishingTracking' - fastlane-sdk-env-name: 'alpha' - deploy-environment: 'production' - secrets: - create_github_token_private_key: ${{ secrets.NATIVE_MOBILE_FASTLANE_GH_APP_CERTIFICATE }} + environment: production + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Deploy .podspec to repository + run: | + fastlane init_env + fastlane publish_open_source_sdk --env alpha From 3c606e07d5880360832c8b5a396923d9ac831c65 Mon Sep 17 00:00:00 2001 From: Adam Szeremeta Date: Mon, 5 May 2025 09:25:29 +0200 Subject: [PATCH 4/5] Token in env --- .github/workflows/ringpublishingtracking_ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ringpublishingtracking_ci.yml b/.github/workflows/ringpublishingtracking_ci.yml index 65401b2..71bba4f 100644 --- a/.github/workflows/ringpublishingtracking_ci.yml +++ b/.github/workflows/ringpublishingtracking_ci.yml @@ -23,6 +23,7 @@ env: ci_planRepository_branch: ${{ github.ref_name }} CI_MATCH_KEYCHAIN_PASSWORD: ${{ secrets.NATIVE_MOBILE_CI_MATCH_KEYCHAIN_PASSWORD }} CI_MATCH_KEYCHAIN_NAME: ${{ secrets.NATIVE_MOBILE_CI_MATCH_KEYCHAIN_NAME }} + DL_GITHUB_PERSONAL_TOKEN: ${{ secrets.DL_GITHUB_PERSONAL_TOKEN }} # Jobs to run jobs: @@ -77,7 +78,7 @@ jobs: # Deployment sdk_deployment: - name: 'RingPublishingTracking' + name: 'RingPublishingTracking deployment' runs-on: ["self-hosted", "macOS", "Xcode-16"] needs: - sdk_summary From a3455ac3311fabbe02d7e7ba2695b11fa191da3e Mon Sep 17 00:00:00 2001 From: Adam Szeremeta Date: Mon, 5 May 2025 09:39:46 +0200 Subject: [PATCH 5/5] Version bump + changelog --- Changelogs/1.8.5 | 6 ++++++ Example/RingPublishingTracking.xcodeproj/project.pbxproj | 4 ++-- Example/RingPublishingTracking/Info.plist | 2 +- RingPublishingTracking.podspec | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 Changelogs/1.8.5 diff --git a/Changelogs/1.8.5 b/Changelogs/1.8.5 new file mode 100644 index 0000000..07854bf --- /dev/null +++ b/Changelogs/1.8.5 @@ -0,0 +1,6 @@ +1.8.5 Release notes (2025-05-05) +================================ + +### Changes + +* Added support for CI/CD on GitHub platform diff --git a/Example/RingPublishingTracking.xcodeproj/project.pbxproj b/Example/RingPublishingTracking.xcodeproj/project.pbxproj index f34cb7d..3b4c816 100644 --- a/Example/RingPublishingTracking.xcodeproj/project.pbxproj +++ b/Example/RingPublishingTracking.xcodeproj/project.pbxproj @@ -1428,7 +1428,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.8.4; + MARKETING_VERSION = 1.8.5; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RingPublishingTracking-Example.RingPublishingTracking"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -1448,7 +1448,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.8.4; + MARKETING_VERSION = 1.8.5; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RingPublishingTracking-Example.RingPublishingTracking"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/Example/RingPublishingTracking/Info.plist b/Example/RingPublishingTracking/Info.plist index 4e77d99..df3a944 100644 --- a/Example/RingPublishingTracking/Info.plist +++ b/Example/RingPublishingTracking/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.8.4 + 1.8.5 CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/RingPublishingTracking.podspec b/RingPublishingTracking.podspec index feefdfa..72bc13d 100644 --- a/RingPublishingTracking.podspec +++ b/RingPublishingTracking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RingPublishingTracking" - s.version = "1.8.4" + s.version = "1.8.5" s.summary = "SDK used to report events from mobile application" s.license = { :type => 'Copyright. Ringier Axel Springer Polska', :file => 'LICENSE' }