Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: ios test artifacts cleanup #1345 #1350

Merged
merged 28 commits into from Dec 1, 2020

Conversation

zuziakaxel
Copy link
Contributor

@zuziakaxel zuziakaxel commented Nov 25, 2020

#1345 - iOS Tests artifacts cleanup

Changes:

  • renamed some variables inside flankScripts/ios
  • added scripts for generating IPA file instead of .xctestrun for gameloop example
  • reorganised test artefacts (removed unused files, moved them to correct directories
  • renamed FlankMultiTestTargetsExample to FlankTestPlansExample // CC: @jan-gogo
  • changed all references to old test artefacts
  • rebuilded EarlGrey example with compatible Xcode version

Previously:
Screenshot 2020-11-25 at 13 36 07

Now:
Screenshot 2020-11-25 at 13 28 07

Test Plan

How do we know the code works?

  1. If you want to easily notice that artifact generation is working correctly you can clear your linked local test_artifacts directory.
  2. Run flankScripts shell ops ios, this command should generate all ios artifacts one by one, and copy each to local test_artifacts dir.
  3. Make sure the console log doesn't show any error.
  4. Make sure the test_artifacts directory is containing the following directories: [ EarlGreyExample, FlankExample, FlankGameLoopExample, FlankTestPlansExample ]
  5. Run tests manually on each ios project and make sure the results are the same as expected (This step should be widely detailed and updated!!!).

Checklist

  • Documented
  • Unit tested

@mergify
Copy link

mergify bot commented Nov 25, 2020

Title does not follow the guidelines of Conventional Commits.
Please adjust title before merge and use one of following prefix:

  • build - Changes that affect the build system or external dependencies (dependencies update)
  • ci - Changes to our CI configuration files and scripts (basically directory .github/workflows)
  • docs - Documentation only changes
  • feat - A new feature
  • fix - A bug fix
  • chore - Changes which does not touch the code (ex. manual update of release notes). It will not generate release notes changes
  • refactor - A code change that contains refactor
  • style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • test - Adding missing tests or correcting existing tests and also changes for our test app
  • perf - A code change that improves performance (I do not think we will use it)

@mergify
Copy link

mergify bot commented Nov 25, 2020

Title does not follow the guidelines of Conventional Commits.
Please adjust title before merge and use one of following prefix:

  • build - Changes that affect the build system or external dependencies (dependencies update)
  • ci - Changes to our CI configuration files and scripts (basically directory .github/workflows)
  • docs - Documentation only changes
  • feat - A new feature
  • fix - A bug fix
  • chore - Changes which does not touch the code (ex. manual update of release notes). It will not generate release notes changes
  • refactor - A code change that contains refactor
  • style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • test - Adding missing tests or correcting existing tests and also changes for our test app
  • perf - A code change that improves performance (I do not think we will use it)

@@ -0,0 +1,3 @@
gcloud alpha firebase test ios run \
--type game-loop --app build/ipa/FlankGameLoopExample.ipa --scenario-numbers 1 \
--device model=iphone11,version=13.6
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
--device model=iphone11,version=13.6
--device model=iphone11,version=13.6

@mergify
Copy link

mergify bot commented Nov 25, 2020

Title does not follow the guidelines of Conventional Commits.
Please adjust title before merge and use one of following prefix:

  • build - Changes that affect the build system or external dependencies (dependencies update)
  • ci - Changes to our CI configuration files and scripts (basically directory .github/workflows)
  • docs - Documentation only changes
  • feat - A new feature
  • fix - A bug fix
  • chore - Changes which does not touch the code (ex. manual update of release notes). It will not generate release notes changes
  • refactor - A code change that contains refactor
  • style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • test - Adding missing tests or correcting existing tests and also changes for our test app
  • perf - A code change that improves performance (I do not think we will use it)

@zuziakaxel zuziakaxel changed the title 1345 ios test artifacts cleanup refactor: ios test artifacts cleanup 1345 Nov 25, 2020
@jan-goral jan-goral self-assigned this Nov 25, 2020
@zuziakaxel zuziakaxel changed the title refactor: ios test artifacts cleanup 1345 refactor: ios test artifacts cleanup #1345 Nov 25, 2020
@zuziakaxel zuziakaxel linked an issue Nov 25, 2020 that may be closed by this pull request
@github-actions
Copy link
Contributor

github-actions bot commented Nov 25, 2020

Timestamp: 2020-12-01 12:02:43
Buildscan url for ubuntu-workflow run 393605976
https://gradle.com/s/i4rgosz3joswq

@codecov-io
Copy link

codecov-io commented Nov 25, 2020

Codecov Report

Merging #1350 (b3f8d1c) into master (23b269b) will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff            @@
##             master    #1350   +/-   ##
=========================================
  Coverage     77.81%   77.81%           
  Complexity      705      705           
=========================================
  Files           244      244           
  Lines          4693     4693           
  Branches        901      901           
=========================================
  Hits           3652     3652           
  Misses          550      550           
  Partials        491      491           

@adamfilipow92
Copy link
Contributor

adamfilipow92 commented Nov 25, 2020

I try to run simple-ios-flank.yml with configured device


  device:
    - model: iphone11
      version: 13.6
      orientation: portrait
      locale: en_US

but all test crash with message

Crash: EarlGreyExampleSwift (315): Namespace SIGNAL, Code 0xa - <unknown>:0

on ip8 all test pass


object IosOpsCommand : CliktCommand(name = "ios", help = "Build ios test artifacts") {

private val generate: Boolean by option(help = "Make build").flag("-g", default = true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I cannot find any purpose for this option.

Suggested change
private val generate: Boolean by option(help = "Make build").flag("-g", default = true)

Comment on lines 11 to 23
override fun run() {
if (generate.not()) return
listOf(
BuildEarlGreyExampleCommand,
BuildGameLoopExampleCommand,
BuildTestPlansExample,
BuildFlankExampleCommand
).forEach {
it.run()
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
override fun run() {
if (generate.not()) return
listOf(
BuildEarlGreyExampleCommand,
BuildGameLoopExampleCommand,
BuildTestPlansExample,
BuildFlankExampleCommand
).forEach {
it.run()
}
}
override fun run() = listOf(
BuildEarlGreyExampleCommand,
BuildGameLoopExampleCommand,
BuildTestPlansExample,
BuildFlankExampleCommand
).forEach(CliktCommand::run)

Copy link
Contributor

@jan-goral jan-goral left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Build directory for ios test projects is not added to .gitignore

@jan-goral
Copy link
Contributor

MacBook-Pro-jan-gogo:flank-review jan-gogo$ flankScripts shell ops build_ios_gameloop_example
/Users/jan-gogo/.gem/bin/xcpretty
/Users/jan-gogo/.gem/bin/xcpretty
▸ Linking FlankGameLoopExample
▸ Copying /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/FlankGameLoopExample/flankgameloop/GameScene.sks
▸ Copying /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/FlankGameLoopExample/flankgameloop/Actions.sks
▸ Compiling Main.storyboard
▸ Processing Info.plist
▸ Generating 'FlankGameLoopExample.app.dSYM'
    A launch storyboard or xib must be provided unless the app requires full screen. (in target 'FlankGameLoopExample' from project 'FlankGameLoopExample')
▸ Touching FlankGameLoopExample.app (in target 'FlankGameLoopExample' from project 'FlankGameLoopExample')
▸ Archive Succeeded
2020-11-25 23:50:53.674 xcodebuild[53706:1670262] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/bt/fw79cb_x4632639rkqlwtl7r0000gn/T/FlankGameLoopExample_2020-11-25_23-50-53.673.xcdistributionlogs'.
error: exportArchive: Team "GogoApps Sp. z o.o." does not have permission to create "iOS Ad Hoc" provisioning profiles.

Error Domain=IDEProvisioningRepairStepErrorDomain Code=1 "Team "GogoApps Sp. z o.o." does not have permission to create "iOS Ad Hoc" provisioning profiles." UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription=Team "GogoApps Sp. z o.o." does not have permission to create "iOS Ad Hoc" provisioning profiles., NSLocalizedRecoverySuggestion=Select a different team and try again.}

error: exportArchive: No profiles for 'io.gogoapps.flankgameloop' were found

Error Domain=IDEProfileLocatorErrorDomain Code=1 "No profiles for 'io.gogoapps.flankgameloop' were found" UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription=No profiles for 'io.gogoapps.flankgameloop' were found, NSLocalizedRecoverySuggestion=Xcode couldn't find any iOS Ad Hoc provisioning profiles matching 'io.gogoapps.flankgameloop'.}


@jan-goral
Copy link
Contributor

MacBook-Pro-jan-gogo:flank-review jan-gogo$ flankScripts shell ops build_earl_grey_example
/Users/jan-gogo/.gem/bin/xcpretty
  Preparing

Analyzing dependencies

Inspecting targets to integrate
  Using `ARCHS` setting to build architectures of target `Pods-EarlGreyExampleTests`: (``)
  Using `ARCHS` setting to build architectures of target `Pods-EarlGreyExampleSwiftTests`: (``)

Finding Podfile changes
  - EarlGrey

Resolving dependencies of `Podfile`

Comparing resolved specification to the sandbox manifest
  - EarlGrey

Downloading dependencies

-> Using EarlGrey (1.16.0)
  - Running pre install hooks

Generating Pods project
  - Creating Pods project
  - Installing files into Pods project
    - Adding source files
    - Adding frameworks
    - Adding libraries
    - Adding resources
    - Linking headers
  - Installing Pod Targets
    - Installing target `EarlGrey` iOS 8.0
  - Installing Aggregate Targets
    - Installing target `Pods-EarlGreyExampleSwiftTests` iOS 8.0
      - Generating Info.plist file at `Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests-Info.plist`
      - Generating module map file at `Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests.modulemap`
      - Generating umbrella header at `Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests-umbrella.h`
      - Generating dummy source at `Pods/Target Support Files/Pods-EarlGreyExampleSwiftTests/Pods-EarlGreyExampleSwiftTests-dummy.m`
    - Installing target `Pods-EarlGreyExampleTests` iOS 8.0
      - Generating Info.plist file at `Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests-Info.plist`
      - Generating module map file at `Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests.modulemap`
      - Generating umbrella header at `Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests-umbrella.h`
      - Generating dummy source at `Pods/Target Support Files/Pods-EarlGreyExampleTests/Pods-EarlGreyExampleTests-dummy.m`
  - Generating deterministic UUIDs
  - Stabilizing target UUIDs
  - Running post install hooks
  - Writing Xcode project file to `Pods/Pods.xcodeproj`
  Cleaning up sandbox directory

Integrating client project

Integrating target `Pods-EarlGreyExampleSwiftTests` (`EarlGreyExample.xcodeproj` project)

Integrating target `Pods-EarlGreyExampleTests` (`EarlGreyExample.xcodeproj` project)
  - Writing Lockfile in `Podfile.lock`
  - Writing Manifest in `Pods/Manifest.lock`
  - Running post install hooks
    - cocoapods-stats from `/Users/jan-gogo/.gem/gems/cocoapods-stats-1.1.0/lib/cocoapods_plugin.rb`
      CDN: Repo trunk does not exist!

-> Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
/Users/jan-gogo/.gem/bin/xcpretty
    The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99. (in target 'Pods-EarlGreyExampleSwiftTests' from project 'Pods')
▸ Copying Pods-EarlGreyExampleSwiftTests-umbrella.h
▸ Processing Pods-EarlGreyExampleSwiftTests-Info.plist
▸ Compiling Pods-EarlGreyExampleSwiftTests-dummy.m
▸ Compiling Pods-EarlGreyExampleSwiftTests-dummy.m
▸ Compiling Pods_EarlGreyExampleSwiftTests_vers.c
▸ Compiling Pods_EarlGreyExampleSwiftTests_vers.c
▸ Compiling ViewController.swift
▸ Compiling AppDelegate.swift
▸ Compiling ViewController.swift
▸ Compiling AppDelegate.swift
▸ Touching Pods_EarlGreyExampleSwiftTests.framework (in target 'Pods-EarlGreyExampleSwiftTests' from project 'Pods')
▸ Linking EarlGreyExampleSwift
▸ Linking EarlGreyExampleSwift
▸ Compiling LaunchScreen.xib
▸ Compiling Main.storyboard
▸ Processing Info.plist
    'UILaunchImages' has been deprecated, use launch storyboards instead. (in target 'EarlGreyExampleSwift' from project 'EarlGreyExample')
▸ Generating 'EarlGreyExampleSwift.app.dSYM'
▸ Touching EarlGreyExampleSwift.app (in target 'EarlGreyExampleSwift' from project 'EarlGreyExample')
▸ Processing Info.plist
▸ Running script '[CP] Check Pods Manifest.lock'
▸ Compiling EarlGrey.swift
▸ Compiling EarlGreyExampleSwiftTests.swift

⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:255:15: parameters of 'handle(_:details:)' have different optionality than expected by protocol 'GREYFailureHandler'

  public func handle(_ exception: GREYFrameworkException!, details: String!) {
              ^                                         ~                 ~



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:31:14: result of call to 'selectElement(with:file:line:)' is unused

    EarlGrey.selectElement(with: grey_accessibilityID("ClickMe"))
         ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:157:53: using '!' here is deprecated and will be removed in a future release

        guard let window = elementAsView.window! as UIView! else {
             ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:180:49: using '!' here is deprecated and will be removed in a future release

        guard let view = element! as! UIView as UIView! else {
                                                    ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:180:35: treating a forced downcast to 'UIView' as optional will never produce 'nil'

        guard let view = element! as! UIView as UIView! else {
                                                ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:256:73: string interpolation produces a debug description for an optional value; did you mean to make this explicit?

    print("Test Failed With Reason : \(exception.reason!) and details \(details)")
                         ^


▸ Compiling EarlGrey.swift
▸ Compiling EarlGreyExampleSwiftTests.swift

⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:255:15: parameters of 'handle(_:details:)' have different optionality than expected by protocol 'GREYFailureHandler'

  public func handle(_ exception: GREYFrameworkException!, details: String!) {
                                                                        ^~~~~~~



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:31:14: result of call to 'selectElement(with:file:line:)' is unused

    EarlGrey.selectElement(with: grey_accessibilityID("ClickMe"))
         ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:157:53: using '!' here is deprecated and will be removed in a future release

        guard let window = elementAsView.window! as UIView! else {
             ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:180:49: using '!' here is deprecated and will be removed in a future release

        guard let view = element! as! UIView as UIView! else {
                                                    ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:180:35: treating a forced downcast to 'UIView' as optional will never produce 'nil'

        guard let view = element! as! UIView as UIView! else {
                                                ^



⚠️  /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGreyExampleSwiftTests.swift:256:73: string interpolation produces a debug description for an optional value; did you mean to make this explicit?

    print("Test Failed With Reason : \(exception.reason!) and details \(details)")
                         ^


▸ Linking EarlGreyExampleSwiftTests
▸ Linking EarlGreyExampleSwiftTests
▸ Generating 'EarlGreyExampleSwiftTests.xctest.dSYM'
▸ Copying /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/Pods/EarlGrey/EarlGrey/EarlGrey.framework

❌  error: Cycle inside EarlGreyExampleSwiftTests; building could produce unreliable results.


    The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99. (in target 'EarlGrey' from project 'Pods')
** TEST BUILD FAILED **

    The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99. (in target 'Pods-EarlGreyExampleTests' from project 'Pods')
▸ Copying Pods-EarlGreyExampleTests-umbrella.h
▸ Processing Pods-EarlGreyExampleTests-Info.plist
▸ Compiling Pods-EarlGreyExampleTests-dummy.m
▸ Compiling Pods-EarlGreyExampleTests-dummy.m
▸ Compiling Pods_EarlGreyExampleTests_vers.c
▸ Compiling Pods_EarlGreyExampleTests_vers.c
▸ Touching Pods_EarlGreyExampleTests.framework (in target 'Pods-EarlGreyExampleTests' from project 'Pods')
▸ Processing Info.plist
▸ Running script '[CP] Check Pods Manifest.lock'
▸ Compiling EarlGreyExampleTests.m
▸ Compiling EarlGreyExampleTests.m
▸ Linking EarlGreyExampleTests
▸ Linking EarlGreyExampleTests
▸ Copying /Users/jan-gogo/projects/flank-project/flank-review/test_projects/ios/EarlGreyExample/Pods/EarlGrey/EarlGrey/EarlGrey.framework
▸ Generating 'EarlGreyExampleTests.xctest.dSYM'

❌  error: Cycle inside EarlGreyExampleTests; building could produce unreliable results.


    The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99. (in target 'EarlGrey' from project 'Pods')
** TEST BUILD FAILED **

Packing...EarlGreyExample.zip

@bootstraponline bootstraponline force-pushed the 1345-ios-test-artifacts-cleanup branch 2 times, most recently from 08709f3 to be0dfe9 Compare November 26, 2020 14:31
docs/test_artifacts.md Show resolved Hide resolved
@bootstraponline bootstraponline force-pushed the 1345-ios-test-artifacts-cleanup branch 2 times, most recently from fe1d0a5 to 0f30ec4 Compare November 30, 2020 06:49
@adamfilipow92
Copy link
Contributor

Hey, when I try to run flankScripts shell ops build_all_ios flankScripts returns


 ./flankScripts shell ops build_all_ios
Usage: flankScripts shell ops [OPTIONS] COMMAND [ARGS]...

Error: no such subcommand: "build_all_ios". (Possible subcommands: build_ios_gameloop_example, build_ios_testplans_example, build_earl_grey_example, build_flank_example)

Is the description is up to date?

@adamfilipow92
Copy link
Contributor

I build artifacts, and I try to run simple-ios-flank.yml but I get an error


iOS 12.0 on iphone8 is not a supported
Supported version ids for 'iphone8': 11.2, 11.4, 12.4, 13.6

Process finished with exit code 18

@zuziakaxel
Copy link
Contributor Author

I build artifacts, and I try to run simple-ios-flank.yml but I get an error


iOS 12.0 on iphone8 is not a supported
Supported version ids for 'iphone8': 11.2, 11.4, 12.4, 13.6

Process finished with exit code 18

Looks like Flank's default device is iphone8 running iOS 12 which is no longer supported by FTL, updating...

@@ -27,7 +27,7 @@ shadowJar.apply {
}
}
// <breaking change>.<feature added>.<fix/minor change>
version = "1.0.0"
version = "1.1.0"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏

@@ -382,7 +382,7 @@ fun execAndGetStdout(vararg args: String): String {
}

val resolveArtifacts by tasks.registering {
dependsOn(":flank-scripts:download")
dependsOn(":flank-scripts:prepareJar")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙏

Copy link
Contributor

@adamfilipow92 adamfilipow92 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Build works
  • Default ios device updated
  • Tested simple-ios-flank.yml and works as expected
    Great work! 👍

@mergify mergify bot merged commit 3de1718 into master Dec 1, 2020
@mergify mergify bot deleted the 1345-ios-test-artifacts-cleanup branch December 1, 2020 13:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

iOS | flank-scripts for generating test artifacts
5 participants