From d81aedc50535fba4fc68fed325071e84ed5ed005 Mon Sep 17 00:00:00 2001 From: Koen Van Looveren Date: Mon, 11 Dec 2023 18:14:18 +0100 Subject: [PATCH] feat: better testflight config --- CHANGELOG.md | 5 +++ .../ci_cd/plugin/ci_cd_plugin.dart | 29 +++++++--------- .../plugin/one_password_plugin.dart | 33 ++++++++++++------- .../model/testflight_credentials.dart | 16 +++++++++ .../model/testflight_upload_config.dart | 18 ++++------ 5 files changed, 59 insertions(+), 42 deletions(-) create mode 100644 lib/src/integrations/testflight/model/testflight_credentials.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 69de7e2..7e2efb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 0.6.0 + +# Feat: +- Better config for testflight upload + # 0.5.1 - 0.5.3 # Fix: diff --git a/lib/src/integrations/ci_cd/plugin/ci_cd_plugin.dart b/lib/src/integrations/ci_cd/plugin/ci_cd_plugin.dart index 07ca517..59240f0 100644 --- a/lib/src/integrations/ci_cd/plugin/ci_cd_plugin.dart +++ b/lib/src/integrations/ci_cd/plugin/ci_cd_plugin.dart @@ -86,8 +86,7 @@ class CiCdPlugin extends ImpaktfullPlugin { if (playStoreUploadConfig != null) { await playStorePlugin.uploadToPlayStore( file: file, - serviceAccountCredentialsFile: - playStoreUploadConfig.serviceAccountCredentialsFile, + serviceAccountCredentialsFile: playStoreUploadConfig.serviceAccountCredentialsFile, ); } } @@ -100,7 +99,7 @@ class CiCdPlugin extends ImpaktfullPlugin { String? splitDebugInfoPaths = 'lib/main_', int? buildNr, AppCenterUploadConfig? appCenterUploadConfig, - TestflightUploadConfig? testflightUploadConfig, + TestFlightUploadConfig? testflightUploadConfig, }) async => buildIos( flavor: flavor, @@ -120,7 +119,7 @@ class CiCdPlugin extends ImpaktfullPlugin { String? splitDebugInfoPath = '.build/debug-info', int? buildNr, AppCenterUploadConfig? appCenterUploadConfig, - TestflightUploadConfig? testflightUploadConfig, + TestFlightUploadConfig? testflightUploadConfig, }) async { ImpaktfullCliEnvironment.requiresInstalledTools([ CliTool.flutter, @@ -148,8 +147,8 @@ class CiCdPlugin extends ImpaktfullPlugin { if (testflightUploadConfig != null) { await testflightPlugin.uploadToTestflightWithEmailPassword( file: file, - email: testflightUploadConfig.userName, - appSpecificPassword: testflightUploadConfig.appSpecificPassword, + email: testflightUploadConfig.credentials?.userName, + appSpecificPassword: testflightUploadConfig.credentials?.appSpecificPassword, type: testflightUploadConfig.type, ); } @@ -164,10 +163,8 @@ class CiCdPlugin extends ImpaktfullPlugin { ImpaktfullCliEnvironment.requiresMacOs(reason: 'Building iOS/macOS apps'); ImpaktfullCliEnvironment.requiresInstalledTools([CliTool.onePasswordCli]); - final certFile = - await onePasswordPlugin.downloadDistributionCertificate(opUuid: opUuid); - final certPassword = - await onePasswordPlugin.getCertificatePassword(opUuid: opUuid); + final certFile = await onePasswordPlugin.downloadDistributionCertificate(opUuid: opUuid); + final certPassword = await onePasswordPlugin.getCertificatePassword(opUuid: opUuid); await startBuildWithCertificateAndPassword( keyChainName: keyChainName, @@ -186,15 +183,11 @@ class CiCdPlugin extends ImpaktfullPlugin { Secret? globalKeyChainPassword, }) async { ImpaktfullCliEnvironment.requiresMacOs(reason: 'Building iOS/macOS apps'); - final globalKeyChainPasswordSecret = globalKeyChainPassword ?? - ImpaktfullCliEnvironmentVariables.getUnlockKeyChainPassword(); + final globalKeyChainPasswordSecret = globalKeyChainPassword ?? ImpaktfullCliEnvironmentVariables.getUnlockKeyChainPassword(); - await macOsKeyChainPlugin.createKeyChain( - keyChainName, globalKeyChainPasswordSecret); - await macOsKeyChainPlugin.unlockKeyChain( - keyChainName, globalKeyChainPasswordSecret); - await macOsKeyChainPlugin.addCertificateToKeyChain( - keyChainName, certFile, certPassword); + await macOsKeyChainPlugin.createKeyChain(keyChainName, globalKeyChainPasswordSecret); + await macOsKeyChainPlugin.unlockKeyChain(keyChainName, globalKeyChainPasswordSecret); + await macOsKeyChainPlugin.addCertificateToKeyChain(keyChainName, certFile, certPassword); await onStartBuild(); await macOsKeyChainPlugin.removeKeyChain(keyChainName); } diff --git a/lib/src/integrations/one_password/plugin/one_password_plugin.dart b/lib/src/integrations/one_password/plugin/one_password_plugin.dart index c82a012..6e7b82c 100644 --- a/lib/src/integrations/one_password/plugin/one_password_plugin.dart +++ b/lib/src/integrations/one_password/plugin/one_password_plugin.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:impaktfull_cli/src/core/model/data/secret.dart'; import 'package:impaktfull_cli/src/core/plugin/impaktfull_cli_plugin.dart'; +import 'package:impaktfull_cli/src/integrations/testflight/model/testflight_credentials.dart'; class OnePasswordPlugin extends ImpaktfullCliPlugin { const OnePasswordPlugin({ @@ -13,14 +14,7 @@ class OnePasswordPlugin extends ImpaktfullCliPlugin { String outputPath = 'certificates/apple_distribution.p12', }) async { final exportFile = File(outputPath); - await processRunner.runProcess([ - 'op', - 'document', - 'get', - '"$opUuid"', - '--out-file', - '"${exportFile.path}"' - ]); + await processRunner.runProcess(['op', 'document', 'get', '"$opUuid"', '--out-file', '"${exportFile.path}"']); return exportFile; } @@ -36,8 +30,7 @@ class OnePasswordPlugin extends ImpaktfullCliPlugin { required String vaultName, required String fieldName, }) async { - final result = await getOnePasswordField( - vaultName: vaultName, opUuid: opUuid, fieldName: fieldName); + final result = await getOnePasswordField(vaultName: vaultName, opUuid: opUuid, fieldName: fieldName); return Secret(result); } @@ -46,6 +39,22 @@ class OnePasswordPlugin extends ImpaktfullCliPlugin { required String opUuid, required String fieldName, }) => - processRunner - .runProcess(['op', 'read', 'op://$vaultName/$opUuid/$fieldName']); + processRunner.runProcess(['op', 'read', 'op://$vaultName/$opUuid/$fieldName']); + + Future getTestflightCredentials({ + required String vaultName, + required String opUuid, + }) async => + TestFlightCredentials( + userName: await getOnePasswordField( + vaultName: vaultName, + opUuid: opUuid, + fieldName: 'username', + ), + appSpecificPassword: await getPassword( + vaultName: vaultName, + opUuid: opUuid, + fieldName: 'password', + ), + ); } diff --git a/lib/src/integrations/testflight/model/testflight_credentials.dart b/lib/src/integrations/testflight/model/testflight_credentials.dart new file mode 100644 index 0000000..2b116e2 --- /dev/null +++ b/lib/src/integrations/testflight/model/testflight_credentials.dart @@ -0,0 +1,16 @@ +import 'package:impaktfull_cli/src/core/model/data/secret.dart'; + +class TestFlightCredentials { + /// username/email to login to appstoreconnect + /// defaults to env variable value of `APPLE_EMAIL` + final String? userName; + + /// appSpecificPassword to login to appstoreconnect + /// defaults to env variable value of `APPLE_APP_SPECIFIC_PASSWORD` + final Secret? appSpecificPassword; + + const TestFlightCredentials({ + this.userName, + this.appSpecificPassword, + }); +} diff --git a/lib/src/integrations/testflight/model/testflight_upload_config.dart b/lib/src/integrations/testflight/model/testflight_upload_config.dart index 933e469..f3cb657 100644 --- a/lib/src/integrations/testflight/model/testflight_upload_config.dart +++ b/lib/src/integrations/testflight/model/testflight_upload_config.dart @@ -1,21 +1,15 @@ -import 'package:impaktfull_cli/src/core/model/data/secret.dart'; +import 'package:impaktfull_cli/src/integrations/testflight/model/testflight_credentials.dart'; -class TestflightUploadConfig { - /// username/email to login to appstoreconnect - /// defaults to env variable value of `APPLE_EMAIL` - final String? userName; - - /// appSpecificPassword to login to appstoreconnect - /// defaults to env variable value of `APPLE_APP_SPECIFIC_PASSWORD` - final Secret? appSpecificPassword; +class TestFlightUploadConfig { + /// credentials to login to appstoreconnect + final TestFlightCredentials? credentials; /// type of the app to upload /// default: `ios` final String type; - const TestflightUploadConfig({ - this.userName, - this.appSpecificPassword, + const TestFlightUploadConfig({ + this.credentials, this.type = 'ios', }); }