Skip to content

Commit f85927a

Browse files
authored
Fallback profiles fix: add support for UITest targets (#280)
* codesign.Manager.PrepareCodesigning retruns the prepared codesigning assets * Fallback profiles: sdd support for ui test targets
1 parent bd31090 commit f85927a

File tree

1 file changed

+50
-19
lines changed

1 file changed

+50
-19
lines changed

codesign/codesign.go

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ type AssetWriter interface {
145145

146146
// PrepareCodesigning selects a suitable code signing strategy based on the step and project configuration,
147147
// then downloads code signing assets (profiles, certificates) and registers test devices if needed
148-
func (m *Manager) PrepareCodesigning() (*devportalservice.APIKeyConnection, error) {
148+
func (m *Manager) PrepareCodesigning() (*devportalservice.APIKeyConnection, map[autocodesign.DistributionType]autocodesign.AppCodesignAssets, error) {
149149
strategy, reason, err := m.selectCodeSigningStrategy(m.appleAuthCredentials)
150150
if err != nil {
151151
m.logger.Warnf("%s", err)
@@ -161,41 +161,42 @@ func (m *Manager) PrepareCodesigning() (*devportalservice.APIKeyConnection, erro
161161
m.logger.TInfof("Downloading certificates...")
162162
certificates, err := m.downloadCertificates()
163163
if err != nil {
164-
return nil, err
164+
return nil, nil, err
165165
}
166166

167167
if err := m.validateCertificatesForXcodeManagedSigning(certificates); err != nil {
168-
return nil, err
168+
return nil, nil, err
169169
}
170170

171171
m.logger.Println()
172172
m.logger.TInfof("Installing certificates...")
173173
if err := m.installCertificates(certificates); err != nil {
174-
return nil, err
174+
return nil, nil, err
175175
}
176176

177177
needsTestDevices := autocodesign.DistributionTypeRequiresDeviceList([]autocodesign.DistributionType{m.opts.ExportMethod})
178178
if needsTestDevices && m.opts.RegisterTestDevices && len(m.bitriseTestDevices) != 0 {
179179
if err := m.registerTestDevices(m.appleAuthCredentials, m.bitriseTestDevices); err != nil {
180-
return nil, err
180+
return nil, nil, err
181181
}
182182
}
183183

184-
return m.appleAuthCredentials.APIKey, nil
184+
return m.appleAuthCredentials.APIKey, nil, nil
185185
}
186186
case codeSigningBitriseAPIKey, codeSigningBitriseAppleID:
187187
{
188188
m.logger.Println()
189189
m.logger.Infof("Code signing asset management by Bitrise")
190190
m.logger.Printf("Reason: %s", reason)
191-
if err := m.prepareCodeSigningWithBitrise(m.appleAuthCredentials, m.bitriseTestDevices); err != nil {
192-
return nil, err
191+
codesigningAssets, err := m.prepareCodeSigningWithBitrise(m.appleAuthCredentials, m.bitriseTestDevices)
192+
if err != nil {
193+
return nil, nil, err
193194
}
194195

195-
return nil, nil
196+
return nil, codesigningAssets, nil
196197
}
197198
default:
198-
return nil, fmt.Errorf("unknown code sign strategy")
199+
return nil, nil, fmt.Errorf("unknown code sign strategy")
199200
}
200201
}
201202

@@ -375,24 +376,24 @@ func (m *Manager) registerTestDevices(credentials devportalservice.Credentials,
375376
return nil
376377
}
377378

378-
func (m *Manager) prepareCodeSigningWithBitrise(credentials devportalservice.Credentials, testDevices []devportalservice.TestDevice) error {
379+
func (m *Manager) prepareCodeSigningWithBitrise(credentials devportalservice.Credentials, testDevices []devportalservice.TestDevice) (map[autocodesign.DistributionType]autocodesign.AppCodesignAssets, error) {
379380
fmt.Println()
380381
m.logger.TDebugf("Analyzing project")
381382
appLayout, err := m.detailsProvider.GetAppLayout(m.opts.SignUITests)
382383
if err != nil {
383-
return err
384+
return nil, err
384385
}
385386

386387
fmt.Println()
387388
m.logger.TDebugf("Downloading certificates")
388389
certs, err := m.downloadCertificates()
389390
if err != nil {
390-
return err
391+
return nil, err
391392
}
392393

393394
typeToLocalCerts, err := autocodesign.GetValidLocalCertificates(certs)
394395
if err != nil {
395-
return err
396+
return nil, err
396397
}
397398

398399
var testDevicesToRegister []devportalservice.TestDevice
@@ -403,7 +404,7 @@ func (m *Manager) prepareCodeSigningWithBitrise(credentials devportalservice.Cre
403404
codesignAssetsByDistributionType, autoCodesignErr := m.prepareAutomaticAssets(credentials, appLayout, typeToLocalCerts, testDevicesToRegister)
404405
if autoCodesignErr != nil {
405406
if !m.fallbackProfileDownloader.IsAvailable() {
406-
return autoCodesignErr
407+
return nil, autoCodesignErr
407408
}
408409

409410
m.logger.Println()
@@ -415,17 +416,17 @@ func (m *Manager) prepareCodeSigningWithBitrise(credentials devportalservice.Cre
415416
if err != nil {
416417
m.logger.Println()
417418
m.logger.Warnf("Manual code signing failed: %s", err)
418-
return autoCodesignErr
419+
return nil, autoCodesignErr
419420
}
420421
}
421422

422423
if m.assetWriter != nil {
423424
if err := m.assetWriter.ForceCodesignAssets(m.opts.ExportMethod, codesignAssetsByDistributionType); err != nil {
424-
return fmt.Errorf("failed to force codesign settings: %s", err)
425+
return nil, fmt.Errorf("failed to force codesign settings: %s", err)
425426
}
426427
}
427428

428-
return nil
429+
return codesignAssetsByDistributionType, nil
429430
}
430431

431432
func (m *Manager) prepareAutomaticAssets(credentials devportalservice.Credentials, appLayout autocodesign.AppLayout, typeToLocalCerts autocodesign.LocalCertificates, testDevicesToRegister []devportalservice.TestDevice) (map[autocodesign.DistributionType]autocodesign.AppCodesignAssets, error) {
@@ -517,7 +518,37 @@ func (m *Manager) createCodeSignAssetMap(appLayout autocodesign.AppLayout, certi
517518
}
518519
}
519520

520-
// TODO: UI test targets are not supported yet
521+
if len(appLayout.UITestTargetBundleIDs) > 0 && m.opts.ExportMethod == autocodesign.Development {
522+
// Capabilities are not supported for UITest targets.
523+
// Xcode managed signing uses Wildcard Provisioning Profiles for UITest target signing.
524+
525+
uiTestTargetBundleIDEntitlementsMap := map[string]plistutil.PlistData{}
526+
for _, bundleID := range appLayout.UITestTargetBundleIDs {
527+
// UITest targets do not have entitlements, so we use an empty plist.
528+
uiTestTargetBundleIDEntitlementsMap[bundleID] = plistutil.PlistData{}
529+
}
530+
531+
uiTestSigningAssets, err := provider.DetermineCodesignGroup(certificates, profiles, nil, uiTestTargetBundleIDEntitlementsMap, exportoptions.Method(autocodesign.Development), m.opts.TeamID, true)
532+
if err != nil || uiTestSigningAssets == nil {
533+
if err == nil {
534+
err = errors.New("no signing assets found for UITest targets")
535+
}
536+
return nil, fmt.Errorf("failed to determine codesign group for UITest targets: %w", err)
537+
}
538+
539+
bundleIDProfileInfoMap := uiTestSigningAssets.BundleIDProfileMap()
540+
bundleIDProfileMap := map[string]autocodesign.Profile{}
541+
for bundleID, profileInfo := range bundleIDProfileInfoMap {
542+
signingProfile, err := m.profileConverter.ProfileInfoToProfile(profileInfo)
543+
if err != nil {
544+
return nil, fmt.Errorf("failed to convert profile info: %w", err)
545+
}
546+
bundleIDProfileMap[bundleID] = signingProfile
547+
}
548+
549+
developmentAssets := assetsByDistributionType[autocodesign.Development]
550+
developmentAssets.UITestTargetProfilesByBundleID = bundleIDProfileMap
551+
}
521552

522553
return assetsByDistributionType, nil
523554

0 commit comments

Comments
 (0)