From 477e6d05f9804e9e3c8b32c19f4c0708cc2a1576 Mon Sep 17 00:00:00 2001 From: Manfred Endres <2523575+Larusso@users.noreply.github.com> Date: Thu, 13 Aug 2020 17:12:46 +0200 Subject: [PATCH] Add pods and workspace support (#63) Description =========== This patch adds a new task `podInstall` to the plugin which is a dependend task for `xcodeArchive`. It only executes when a `Podfile` is in the project directory. The `xcodeArchive` task has a new workspace property which is set by default to the workspace generated by podInstall. The workspace has a higher precedance than the project. If the workspace does not exist the task falls back to the project. The issue is the very nature how cocoapods handles workspaces. You can configure pods to use a preexisting workspace or it generates a new workspace based on the project it finds in the same directory. The current patch only tries to solve a current workflow issue and needs changes and tests! Changes ======= * ![ADD] `pods` and `workspace` support --- .../build/unity/ios/IOSBuildPlugin.groovy | 8 ++- .../unity/ios/tasks/PodInstallTask.groovy | 53 +++++++++++++++++++ .../unity/ios/tasks/XCodeArchiveTask.groovy | 25 ++++++++- .../internal/AWSSecretsManagerResolver.groovy | 4 ++ .../AWSSecretsManagerResolverSpec.groovy | 2 +- 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/main/groovy/wooga/gradle/build/unity/ios/tasks/PodInstallTask.groovy diff --git a/src/main/groovy/wooga/gradle/build/unity/ios/IOSBuildPlugin.groovy b/src/main/groovy/wooga/gradle/build/unity/ios/IOSBuildPlugin.groovy index 41a6e6d2..20907a94 100644 --- a/src/main/groovy/wooga/gradle/build/unity/ios/IOSBuildPlugin.groovy +++ b/src/main/groovy/wooga/gradle/build/unity/ios/IOSBuildPlugin.groovy @@ -33,6 +33,7 @@ import wooga.gradle.build.unity.ios.tasks.ImportProvisioningProfile import wooga.gradle.build.unity.ios.tasks.KeychainTask import wooga.gradle.build.unity.ios.tasks.ListKeychainTask import wooga.gradle.build.unity.ios.tasks.LockKeychainTask +import wooga.gradle.build.unity.ios.tasks.PodInstallTask import wooga.gradle.build.unity.ios.tasks.PublishTestFlight import wooga.gradle.build.unity.ios.tasks.XCodeArchiveTask import wooga.gradle.build.unity.ios.tasks.XCodeExportTask @@ -198,11 +199,16 @@ class IOSBuildPlugin implements Plugin { it.profileName = "${maybeBaseName(baseName, 'signing')}.mobileprovision" } + PodInstallTask podInstall = tasks.create(maybeBaseName(baseName, "podInstall"), PodInstallTask) { + it.projectPath = xcodeProject + } + def xcodeArchive = tasks.create(maybeBaseName(baseName, "xcodeArchive"), XCodeArchiveTask) { - it.dependsOn addKeychain, unlockKeychain + it.dependsOn addKeychain, unlockKeychain, podInstall it.provisioningProfile = importProvisioningProfiles it.projectPath = xcodeProject + it.workspacePath = podInstall.workspace it.buildKeychain = buildKeychain it.destinationDir = project.file("${project.buildDir}/archives") } diff --git a/src/main/groovy/wooga/gradle/build/unity/ios/tasks/PodInstallTask.groovy b/src/main/groovy/wooga/gradle/build/unity/ios/tasks/PodInstallTask.groovy new file mode 100644 index 00000000..2d848688 --- /dev/null +++ b/src/main/groovy/wooga/gradle/build/unity/ios/tasks/PodInstallTask.groovy @@ -0,0 +1,53 @@ +package wooga.gradle.build.unity.ios.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.* + +class PodInstallTask extends DefaultTask { + private Object projectPath + + @Internal + File getProjectPath() { + project.files(projectPath).getSingleFile() + } + + void setProjectPath(Object path) { + projectPath = path + } + + XCodeArchiveTask projectPath(Object path) { + setProjectPath(path) + } + + @InputFiles + @SkipWhenEmpty + protected FileCollection getInputFiles() { + def podFile = project.file("Podfile") + def inputFiles = [podFile] + + if(podFile.exists()) { + inputFiles << project.file( "Podfile.lock") + } + + project.files(inputFiles.findAll { it.exists() }.toArray()) + } + + @OutputDirectory + protected getPodsDir() { + project.file("Pods") + } + + @OutputDirectory + File getWorkspace() { + project.file(getProjectPath().path.replaceAll('xcodeproj', 'xcworkspace')) + } + + @TaskAction + protected void install() { + project.exec { + executable 'pod' + args 'install' + } + } +} diff --git a/src/main/groovy/wooga/gradle/build/unity/ios/tasks/XCodeArchiveTask.groovy b/src/main/groovy/wooga/gradle/build/unity/ios/tasks/XCodeArchiveTask.groovy index db0e6378..73bc275c 100644 --- a/src/main/groovy/wooga/gradle/build/unity/ios/tasks/XCodeArchiveTask.groovy +++ b/src/main/groovy/wooga/gradle/build/unity/ios/tasks/XCodeArchiveTask.groovy @@ -28,6 +28,7 @@ import java.util.concurrent.Callable class XCodeArchiveTask extends ConventionTask { private Object projectPath + private Object workspacePath private Object buildKeychain private Object provisioningProfile @@ -80,7 +81,25 @@ class XCodeArchiveTask extends ConventionTask { } XCodeArchiveTask projectPath(Object path) { - setExportOptionsPlist(path) + setProjectPath(path) + } + + @Optional + @InputDirectory + File getWorkspacePath() { + def workspace = project.file(workspacePath) + if(!workspace.exists()) { + return null + } + workspace + } + + void setWorkspacePath(Object path) { + workspacePath = path + } + + XCodeArchiveTask projectWorkspacePath(Object path) { + setWorkspacePath(path) } @Optional @@ -302,7 +321,9 @@ class XCodeArchiveTask extends ConventionTask { arguments << it.toString() } - if (getProjectPath()) { + if(getWorkspacePath()) { + arguments << "-workspace" << getWorkspacePath().getPath() + } else if (getProjectPath()) { arguments << "-project" << getProjectPath().getPath() } diff --git a/src/main/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolver.groovy b/src/main/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolver.groovy index fdbe4794..b873eb39 100644 --- a/src/main/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolver.groovy +++ b/src/main/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolver.groovy @@ -26,6 +26,10 @@ class AWSSecretsManagerResolver implements SecretResolver { this(SecretsManagerClient.builder().region(region).build()) } + AWSSecretsManagerResolver() { + this(SecretsManagerClient.builder().build()) + } + @Override Secret resolve(String secretId) { GetSecretValueRequest request = GetSecretValueRequest.builder().secretId(secretId).build() as GetSecretValueRequest diff --git a/src/test/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolverSpec.groovy b/src/test/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolverSpec.groovy index a9c86609..3a094781 100644 --- a/src/test/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolverSpec.groovy +++ b/src/test/groovy/wooga/gradle/build/unity/secrets/internal/AWSSecretsManagerResolverSpec.groovy @@ -16,7 +16,7 @@ class AWSSecretsManagerResolverSpec extends SecretsResolverSpec