From 76d9713636c9eee09e6c38315e3c97cc212eab88 Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Thu, 6 Jun 2019 16:23:37 +0200 Subject: [PATCH 1/9] Move to function ExportCodesigningFiles export logic --- cmd/xamarin.go | 13 +++++++++---- cmd/xcode.go | 15 ++++++++++----- cmd/xcodeUITests.go | 11 ++++++++--- codesign/export.go | 39 +++++++++++++++++++++++++-------------- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/cmd/xamarin.go b/cmd/xamarin.go index 60d22cf0..237ae566 100644 --- a/cmd/xamarin.go +++ b/cmd/xamarin.go @@ -197,9 +197,14 @@ func scanXamarinProject(cmd *cobra.Command, args []string) error { if err != nil { return err } - exoprtResult, err := codesign.UploadAndWriteCodesignFiles(certificatesToExport, - profilesToExport, - isAskForPassword, + + certificates, profiles, err := codesign.ExportCodesigningFiles(certificatesToExport, profilesToExport, isAskForPassword) + if err != nil { + return err + } + + exportResult, err := codesign.UploadAndWriteCodesignFiles(certificates, + profiles, codesign.WriteFilesConfig{ WriteFiles: writeFiles, AbsOutputDirPath: absExportOutputDirPath, @@ -212,6 +217,6 @@ func scanXamarinProject(cmd *cobra.Command, args []string) error { return err } - printFinished(exoprtResult, absExportOutputDirPath) + printFinished(exportResult, absExportOutputDirPath) return nil } diff --git a/cmd/xcode.go b/cmd/xcode.go index 060a0a87..f06e7c96 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -54,7 +54,7 @@ func absOutputDir() (string, error) { return absExportOutputDirPath, nil } -func scanXcodeProject(cmd *cobra.Command, args []string) error { +func scanXcodeProject(_ *cobra.Command, _ []string) error { absExportOutputDirPath, err := absOutputDir() if err != nil { return err @@ -158,9 +158,14 @@ func scanXcodeProject(cmd *cobra.Command, args []string) error { if err != nil { return err } - exoprtResult, err := codesign.UploadAndWriteCodesignFiles(certificatesToExport, - profilesToExport, - isAskForPassword, + + certificates, profiles, err := codesign.ExportCodesigningFiles(certificatesToExport, profilesToExport, isAskForPassword) + if err != nil { + return err + } + + exportResult, err := codesign.UploadAndWriteCodesignFiles(certificates, + profiles, codesign.WriteFilesConfig{ WriteFiles: writeFiles, AbsOutputDirPath: absExportOutputDirPath, @@ -173,6 +178,6 @@ func scanXcodeProject(cmd *cobra.Command, args []string) error { return err } - printFinished(exoprtResult, absExportOutputDirPath) + printFinished(exportResult, absExportOutputDirPath) return nil } diff --git a/cmd/xcodeUITests.go b/cmd/xcodeUITests.go index 94150282..6cac02ef 100644 --- a/cmd/xcodeUITests.go +++ b/cmd/xcodeUITests.go @@ -151,9 +151,14 @@ func scanXcodeUITestsProject(cmd *cobra.Command, args []string) error { if err != nil { return err } - exportResult, err := codesign.UploadAndWriteCodesignFiles(certificatesToExport, - profilesToExport, - isAskForPassword, + + certificates, profiles, err := codesign.ExportCodesigningFiles(certificatesToExport, profilesToExport, isAskForPassword) + if err != nil { + return err + } + + exportResult, err := codesign.UploadAndWriteCodesignFiles(certificates, + profiles, codesign.WriteFilesConfig{ WriteFiles: writeFiles, AbsOutputDirPath: absExportOutputDirPath, diff --git a/codesign/export.go b/codesign/export.go index cf1b2f20..72eb1458 100644 --- a/codesign/export.go +++ b/codesign/export.go @@ -53,38 +53,49 @@ type ExportReport struct { CodesignFilesWritten bool } -// UploadAndWriteCodesignFiles exports then uploads codesign files to bitrise.io and saves them to output folder -func UploadAndWriteCodesignFiles(certificates []certificateutil.CertificateInfoModel, profiles []profileutil.ProvisioningProfileInfoModel, askForPassword bool, writeFilesConfig WriteFilesConfig, uploadConfig UploadConfig) (ExportReport, error) { - identities, err := collectAndExportIdentities(certificates, askForPassword) +// ExportCodesigningFiles exports certificates from the Keychain and provisoining profiles from their directory +func ExportCodesigningFiles(certificatesRequired []certificateutil.CertificateInfoModel, profilesRequired []profileutil.ProvisioningProfileInfoModel, askForPassword bool) (models.Certificates, []models.ProvisioningProfile, error) { + certificates, err := exportIdentities(certificatesRequired, askForPassword) if err != nil { - return ExportReport{}, err + return models.Certificates{}, nil, err } - provisioningProfiles, err := collectAndExportProvisioningProfiles(profiles) + + profiles, err := exportProvisioningProfiles(profilesRequired) if err != nil { - return ExportReport{}, err + return models.Certificates{}, nil, err } + return certificates, profiles, nil +} + +// UploadAndWriteCodesignFiles exports then uploads codesign files to bitrise.io and saves them to output folder +func UploadAndWriteCodesignFiles(certificates models.Certificates, provisioningProfiles []models.ProvisioningProfile, writeFilesConfig WriteFilesConfig, uploadConfig UploadConfig) (ExportReport, error) { var client *bitrise.Client // both or none CLI flags are required if uploadConfig.PersonalAccessToken != "" && uploadConfig.AppSlug != "" { // Upload automatically if token is provided as CLI paramter, do not export to filesystem // Used to upload artifacts as part of an other CLI tool + var err error client, err = bitrise.NewClient(uploadConfig.PersonalAccessToken) if err != nil { return ExportReport{}, err } + client.SetSelectedAppSlug(uploadConfig.AppSlug) } + if client == nil { uploadConfirmMsg := "Do you want to upload the provisioning profiles and certificates to Bitrise?" if len(provisioningProfiles) == 0 { uploadConfirmMsg = "Do you want to upload the certificates to Bitrise?" } fmt.Println() + shouldUpload, err := goinp.AskForBoolFromReader(uploadConfirmMsg, os.Stdin) if err != nil { return ExportReport{}, err } + if shouldUpload { if client, err = bitriseio.GetInteractiveConfigClient(); err != nil { return ExportReport{}, err @@ -95,7 +106,7 @@ func UploadAndWriteCodesignFiles(certificates []certificateutil.CertificateInfoM var filesWritten bool if writeFilesConfig.WriteFiles == WriteFilesAlways || writeFilesConfig.WriteFiles == WriteFilesFallback && client == nil { - if err := writeFiles(identities, provisioningProfiles, writeFilesConfig); err != nil { + if err := writeFiles(certificates, provisioningProfiles, writeFilesConfig); err != nil { return ExportReport{}, err } filesWritten = true @@ -103,13 +114,13 @@ func UploadAndWriteCodesignFiles(certificates []certificateutil.CertificateInfoM if client == nil { return ExportReport{ - CertificatesUploaded: len(certificates) == 0, - ProvisioningProfilesUploaded: len(profiles) == 0, + CertificatesUploaded: len(certificates.Info) == 0, + ProvisioningProfilesUploaded: len(provisioningProfiles) == 0, CodesignFilesWritten: filesWritten, }, nil } - certificatesUploaded, profilesUploaded, err := bitriseio.UploadCodesigningFiles(client, identities, provisioningProfiles) + certificatesUploaded, profilesUploaded, err := bitriseio.UploadCodesigningFiles(client, certificates, provisioningProfiles) return ExportReport{ CertificatesUploaded: certificatesUploaded, ProvisioningProfilesUploaded: profilesUploaded, @@ -147,8 +158,8 @@ func writeFiles(identities models.Certificates, provisioningProfiles []models.Pr return nil } -// collectAndExportIdentities exports the given certificates merged in a single .p12 file -func collectAndExportIdentities(certificates []certificateutil.CertificateInfoModel, isAskForPassword bool) (models.Certificates, error) { +// exportIdentities exports the given certificates merged in a single .p12 file +func exportIdentities(certificates []certificateutil.CertificateInfoModel, isAskForPassword bool) (models.Certificates, error) { if len(certificates) == 0 { return models.Certificates{}, nil } @@ -215,8 +226,8 @@ func writeIdentities(identites []byte, absExportOutputDirPath string) error { return ioutil.WriteFile(filepath.Join(absExportOutputDirPath, "Identities.p12"), identites, 0600) } -// collectAndExportProvisioningProfiles returns provisioning profies -func collectAndExportProvisioningProfiles(profiles []profileutil.ProvisioningProfileInfoModel) ([]models.ProvisioningProfile, error) { +// exportProvisioningProfiles returns provisioning profies +func exportProvisioningProfiles(profiles []profileutil.ProvisioningProfileInfoModel) ([]models.ProvisioningProfile, error) { if len(profiles) == 0 { return nil, nil } From 4833e50f7b94569ae2100c4951b0314b2e50846a Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Thu, 6 Jun 2019 18:48:49 +0200 Subject: [PATCH 2/9] Create exported functions to use codesigndoc from package --- cmd/xcode.go | 49 +++++++++++++++----------------------------- codesigndoc/xcode.go | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 codesigndoc/xcode.go diff --git a/cmd/xcode.go b/cmd/xcode.go index f06e7c96..8d7925a5 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -13,7 +13,6 @@ import ( "github.com/bitrise-io/go-utils/fileutil" "github.com/bitrise-io/go-utils/log" "github.com/bitrise-io/go-utils/pathutil" - "github.com/bitrise-io/go-utils/stringutil" "github.com/bitrise-io/go-xcode/utility" "github.com/bitrise-io/goinp/goinp" "github.com/spf13/cobra" @@ -120,46 +119,32 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { xcodeCmd.SDK = paramXcodebuildSDK } - fmt.Println() - log.Printf("🔦 Running an Xcode Archive, to get all the required code signing settings...") - var isLogFileWritten bool - xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") - archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() - - if writeFiles == codesign.WriteFilesAlways || - writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file - if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { - return fmt.Errorf("failed to create output directory, error: %s", err) - } - log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) - if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { - log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) - } else { - isLogFileWritten = true - } - } + archivePath, xcodebuildOutput, err := codesigndoc.GenerateXCodeArchive(xcodeCmd) if err != nil { - log.Warnf("Last lines of build log:") - fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) - fmt.Println() + var isLogFileWritten bool + xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") + + if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file + if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { + return fmt.Errorf("failed to create output directory, error: %s", err) + } + log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) + if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { + log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) + } else { + isLogFileWritten = true + } + } + if isLogFileWritten { log.Warnf("Please check the logfile (%s) to see what caused the error", xcodebuildOutputFilePath) log.Warnf("and make sure that you can Archive this project from Xcode!") fmt.Println() - log.Printf("Open the project: %s", xcodeCmd.ProjectFilePath) - log.Printf("and Archive, using the Scheme: %s", xcodeCmd.Scheme) - fmt.Println() } return ArchiveError{toolXcode, err.Error()} } - // If certificatesOnly is set, CollectCodesignFiles returns an empty slice for profiles - certificatesToExport, profilesToExport, err := codesigndoc.CollectCodesignFiles(archivePath, certificatesOnly) - if err != nil { - return err - } - - certificates, profiles, err := codesign.ExportCodesigningFiles(certificatesToExport, profilesToExport, isAskForPassword) + certificates, profiles, err := codesigndoc.CodesigningFilesForXCodeProject(archivePath, certificatesOnly, isAskForPassword) if err != nil { return err } diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go new file mode 100644 index 00000000..b581357a --- /dev/null +++ b/codesigndoc/xcode.go @@ -0,0 +1,42 @@ +package codesigndoc + +import ( + "fmt" + + "github.com/bitrise-io/codesigndoc/xcode" + + "github.com/bitrise-io/codesigndoc/codesign" + "github.com/bitrise-io/codesigndoc/models" + "github.com/bitrise-io/go-utils/log" + "github.com/bitrise-io/go-utils/stringutil" +) + +// GenerateXCodeArchive ... +func GenerateXCodeArchive(xcodeCmd xcode.CommandModel) (string, string, error) { + fmt.Println() + log.Printf("🔦 Running an Xcode Archive, to get all the required code signing settings...") + archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() + + if err != nil { + log.Warnf("Last lines of build log:") + fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) + fmt.Println() + log.Printf("Open the project: %s", xcodeCmd.ProjectFilePath) + log.Printf("and Archive, using the Scheme: %s", xcodeCmd.Scheme) + fmt.Println() + return "", "", err + } + + return archivePath, xcodebuildOutput, nil +} + +// CodesigningFilesForXCodeProject ... +func CodesigningFilesForXCodeProject(archivePath string, certificatesOnly bool, isAskForPassword bool) (models.Certificates, []models.ProvisioningProfile, error) { + // If certificatesOnly is set, CollectCodesignFiles returns an empty slice for profiles + certificatesToExport, profilesToExport, err := CollectCodesignFiles(archivePath, certificatesOnly) + if err != nil { + return models.Certificates{}, nil, err + } + + return codesign.ExportCodesigningFiles(certificatesToExport, profilesToExport, isAskForPassword) +} From f7226223f1a318076058f7adabaaa52eec826c13 Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Thu, 6 Jun 2019 19:03:21 +0200 Subject: [PATCH 3/9] Improve logging --- cmd/xcode.go | 13 +++---------- codesigndoc/xcode.go | 8 +++++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/cmd/xcode.go b/cmd/xcode.go index 8d7925a5..a86bdbe2 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -121,26 +121,19 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { archivePath, xcodebuildOutput, err := codesigndoc.GenerateXCodeArchive(xcodeCmd) if err != nil { - var isLogFileWritten bool - xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") - if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file + xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { return fmt.Errorf("failed to create output directory, error: %s", err) } log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) - } else { - isLogFileWritten = true } - } - - if isLogFileWritten { - log.Warnf("Please check the logfile (%s) to see what caused the error", xcodebuildOutputFilePath) - log.Warnf("and make sure that you can Archive this project from Xcode!") + log.Warnf("Please check the logfile to see what caused the error and make sure that you can Archive this project from Xcode!") fmt.Println() } + return ArchiveError{toolXcode, err.Error()} } diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go index b581357a..5e4bd7df 100644 --- a/codesigndoc/xcode.go +++ b/codesigndoc/xcode.go @@ -18,12 +18,14 @@ func GenerateXCodeArchive(xcodeCmd xcode.CommandModel) (string, string, error) { archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() if err != nil { + log.Errorf("Xcode Archive failed.") + log.Errorf("Open the project: %s", xcodeCmd.ProjectFilePath) + log.Errorf("and run the Archive command, after selecting the scheme: %s", xcodeCmd.Scheme) + fmt.Println() + log.Warnf("Last lines of build log:") fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) fmt.Println() - log.Printf("Open the project: %s", xcodeCmd.ProjectFilePath) - log.Printf("and Archive, using the Scheme: %s", xcodeCmd.Scheme) - fmt.Println() return "", "", err } From 492baf1ed666c53354773d39913f88787c2288ad Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Thu, 6 Jun 2019 20:35:17 +0200 Subject: [PATCH 4/9] Xcodebuild log handle even if there is no error --- cmd/xcode.go | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/cmd/xcode.go b/cmd/xcode.go index a86bdbe2..057dcf87 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -120,20 +120,19 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { } archivePath, xcodebuildOutput, err := codesigndoc.GenerateXCodeArchive(xcodeCmd) - if err != nil { - if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file - xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") - if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { - return fmt.Errorf("failed to create output directory, error: %s", err) - } - log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) - if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { - log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) - } - log.Warnf("Please check the logfile to see what caused the error and make sure that you can Archive this project from Xcode!") - fmt.Println() + if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file + xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") + if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { + return fmt.Errorf("failed to create output directory, error: %s", err) } - + log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) + if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { + log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) + } + log.Warnf("Please check the logfile to see what caused the error and make sure that you can Archive this project from Xcode!") + fmt.Println() + } + if err != nil { return ArchiveError{toolXcode, err.Error()} } From 1b7ddb10c0cbca3815beb70640e70e50e177d789 Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Fri, 7 Jun 2019 08:59:48 +0200 Subject: [PATCH 5/9] Revise logging: --- cmd/xamarin.go | 26 ++++++++++++-------------- cmd/xcode.go | 18 +++++------------- cmd/xcodeUITests.go | 27 ++++++++++++++------------- codesigndoc/xcode.go | 21 ++++++++++++++++----- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/cmd/xamarin.go b/cmd/xamarin.go index 237ae566..b982a74a 100644 --- a/cmd/xamarin.go +++ b/cmd/xamarin.go @@ -161,34 +161,32 @@ func scanXamarinProject(cmd *cobra.Command, args []string) error { fmt.Println() fmt.Println() log.Printf(`🔦 Running a Build, to get all the required code signing settings...`) - var isLogFileWritten bool logOutputFilePath := filepath.Join(absExportOutputDirPath, "xamarin-build-output.log") archivePath, logOutput, err := xamarinCmd.GenerateArchive() - if writeFiles == codesign.WriteFilesAlways || - writeFiles == codesign.WriteFilesFallback && err != nil { // save the xamarin output into a debug log file + if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xamarin output into a debug log file if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { return fmt.Errorf("failed to create output directory, error: %s", err) } log.Infof("💡 "+colorstring.Yellow("Saving xamarin output into file")+": %s", logOutputFilePath) if err := fileutil.WriteStringToFile(logOutputFilePath, logOutput); err != nil { log.Errorf("Failed to save xamarin build output into file (%s), error: %s", logOutputFilePath, err) - } else { - isLogFileWritten = true + } + + if err != nil { + log.Warnf("Please check the logfile to see what caused the error.") } } if err != nil { - log.Warnf("Last lines of build log:") + log.Warnf("Last lines of the build log:") fmt.Println(stringutil.LastNLines(logOutput, 15)) fmt.Println() - if isLogFileWritten { - log.Warnf("Please check the logfile (%s) to see what caused the error", logOutputFilePath) - log.Warnf(`and make sure that you can "Archive for Publishing" this project from Xamarin!`) - fmt.Println() - log.Infof("Open the project: %s", xamarinCmd.SolutionFilePath) - log.Infof(`And do "Archive for Publishing", after selecting the Configuration+Platform: %s|%s`, xamarinCmd.Configuration, xamarinCmd.Platform) - fmt.Println() - } + + log.Errorf("Build failed.") + log.Infof(colorstring.Yellow("Open the project: ")+"%s", xamarinCmd.SolutionFilePath) + log.Infof(colorstring.Yellow(`And do "Archive for Publishing", after selecting the Configuration+Platform: `)+"%s|%s", xamarinCmd.Configuration, xamarinCmd.Platform) + fmt.Println() + return ArchiveError{toolXamarin, "failed to run xamarin build command: " + err.Error()} } diff --git a/cmd/xcode.go b/cmd/xcode.go index 057dcf87..a9f75d7f 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -13,7 +13,6 @@ import ( "github.com/bitrise-io/go-utils/fileutil" "github.com/bitrise-io/go-utils/log" "github.com/bitrise-io/go-utils/pathutil" - "github.com/bitrise-io/go-xcode/utility" "github.com/bitrise-io/goinp/goinp" "github.com/spf13/cobra" ) @@ -59,15 +58,6 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { return err } - // Output tools versions - xcodebuildVersion, err := utility.GetXcodeVersion() - if err != nil { - return fmt.Errorf("failed to get Xcode (xcodebuild) version, error: %s", err) - } - fmt.Println() - log.Infof("%s: %s (%s)", colorstring.Green("Xcode (xcodebuild) version"), xcodebuildVersion.Version, xcodebuildVersion.BuildVersion) - fmt.Println() - xcodeCmd := xcode.CommandModel{} projectPath := paramXcodeProjectFilePath @@ -75,7 +65,6 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { log.Infof("Scan the directory for project files") log.Warnf("You can specify the Xcode project/workscape file to scan with the --file flag.") - // // Scan the directory for Xcode Project (.xcworkspace / .xcodeproject) file first // If can't find any, ask the user to drag-and-drop the file projpth, err := findXcodeProject() @@ -125,12 +114,15 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { return fmt.Errorf("failed to create output directory, error: %s", err) } + log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) } - log.Warnf("Please check the logfile to see what caused the error and make sure that you can Archive this project from Xcode!") - fmt.Println() + + if err != nil { + log.Warnf("Please check the logfile to see what caused the error.") + } } if err != nil { return ArchiveError{toolXcode, err.Error()} diff --git a/cmd/xcodeUITests.go b/cmd/xcodeUITests.go index 6cac02ef..1e004699 100644 --- a/cmd/xcodeUITests.go +++ b/cmd/xcodeUITests.go @@ -116,33 +116,34 @@ func scanXcodeUITestsProject(cmd *cobra.Command, args []string) error { fmt.Println() log.Printf("🔦 Running an Xcode build-for-testing, to get all the required code signing settings...") - var isLogFileWritten bool xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") buildForTestingPath, xcodebuildOutput, err := xcodeUITestsCmd.RunBuildForTesting() - if writeFiles == codesign.WriteFilesAlways || - writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file + if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { return fmt.Errorf("failed to create output directory, error: %s", err) } + log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) - } else { - isLogFileWritten = true + } + + if err != nil { + log.Warnf("Please check the logfile to see what caused the error.") } } + if err != nil { - log.Warnf("Last lines of build log:") + log.Warnf("Last lines of the build log:") fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) fmt.Println() - if isLogFileWritten { - log.Warnf("Please check the logfile (%s) to see what caused the error", xcodebuildOutputFilePath) - log.Warnf("and make sure that you can run Build for testing against the project from Xcode!") - fmt.Println() - log.Printf("Open the project: %s", xcodeUITestsCmd.ProjectFilePath) - fmt.Println() - } + + log.Errorf("Xcode Build For Testing failed.") + log.Infof(colorstring.Yellow("Open the project: ")+"%s", xcodeUITestsCmd.ProjectFilePath) + log.Infof(colorstring.Yellow("and make sure that you can run Build For Testing, with the scheme: ")+"%s", xcodeUITestsCmd.Scheme) + fmt.Println() + return BuildForTestingError{toolXcode, err.Error()} } diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go index 5e4bd7df..81f73f65 100644 --- a/codesigndoc/xcode.go +++ b/codesigndoc/xcode.go @@ -4,28 +4,39 @@ import ( "fmt" "github.com/bitrise-io/codesigndoc/xcode" + "github.com/bitrise-io/go-xcode/utility" "github.com/bitrise-io/codesigndoc/codesign" "github.com/bitrise-io/codesigndoc/models" + "github.com/bitrise-io/go-utils/colorstring" "github.com/bitrise-io/go-utils/log" "github.com/bitrise-io/go-utils/stringutil" ) // GenerateXCodeArchive ... func GenerateXCodeArchive(xcodeCmd xcode.CommandModel) (string, string, error) { + // Output tools versions + xcodebuildVersion, err := utility.GetXcodeVersion() + if err != nil { + return "", "", fmt.Errorf("failed to get Xcode (xcodebuild) version, error: %s", err) + } + fmt.Println() + log.Infof("%s: %s (%s)", colorstring.Green("Xcode (xcodebuild) version"), xcodebuildVersion.Version, xcodebuildVersion.BuildVersion) + fmt.Println() log.Printf("🔦 Running an Xcode Archive, to get all the required code signing settings...") archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() if err != nil { - log.Errorf("Xcode Archive failed.") - log.Errorf("Open the project: %s", xcodeCmd.ProjectFilePath) - log.Errorf("and run the Archive command, after selecting the scheme: %s", xcodeCmd.Scheme) + log.Warnf("Last lines of the build log:") + fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) fmt.Println() - log.Warnf("Last lines of build log:") - fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) + log.Errorf("Xcode Archive failed.") + log.Infof(colorstring.Yellow("Open the project: ")+"%s", xcodeCmd.ProjectFilePath) + log.Infof(colorstring.Yellow("and make sure that you can build an Archive, with the scheme: ")+"%s", xcodeCmd.Scheme) fmt.Println() + return "", "", err } From 07b347cd03e768987b94edb83024c43d7330b76f Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Fri, 7 Jun 2019 09:31:35 +0200 Subject: [PATCH 6/9] Move log file writeing to a closure --- cmd/xamarin.go | 7 +++---- cmd/xcode.go | 26 +++++++++++++------------- cmd/xcodeUITests.go | 8 +++----- codesigndoc/xcode.go | 20 ++++++++++++++++---- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/cmd/xamarin.go b/cmd/xamarin.go index b982a74a..667c215c 100644 --- a/cmd/xamarin.go +++ b/cmd/xamarin.go @@ -168,18 +168,17 @@ func scanXamarinProject(cmd *cobra.Command, args []string) error { if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { return fmt.Errorf("failed to create output directory, error: %s", err) } + log.Infof("💡 "+colorstring.Yellow("Saving xamarin output into file")+": %s", logOutputFilePath) if err := fileutil.WriteStringToFile(logOutputFilePath, logOutput); err != nil { log.Errorf("Failed to save xamarin build output into file (%s), error: %s", logOutputFilePath, err) } - - if err != nil { - log.Warnf("Please check the logfile to see what caused the error.") - } } if err != nil { log.Warnf("Last lines of the build log:") fmt.Println(stringutil.LastNLines(logOutput, 15)) + + log.Infof(colorstring.Yellow("Please check the build log to see what caused the error.")) fmt.Println() log.Errorf("Build failed.") diff --git a/cmd/xcode.go b/cmd/xcode.go index a9f75d7f..2ee198f2 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -108,22 +108,22 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { xcodeCmd.SDK = paramXcodebuildSDK } - archivePath, xcodebuildOutput, err := codesigndoc.GenerateXCodeArchive(xcodeCmd) - if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file - xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") - if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { - return fmt.Errorf("failed to create output directory, error: %s", err) - } + writeBuildLogs := func(xcodebuildOutput string) error { + if writeFiles == codesign.WriteFilesAlways || writeFiles == codesign.WriteFilesFallback && err != nil { // save the xcodebuild output into a debug log file + xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") + if err := os.MkdirAll(absExportOutputDirPath, 0700); err != nil { + return fmt.Errorf("failed to create output directory, error: %s", err) + } - log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) - if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { - log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) - } - - if err != nil { - log.Warnf("Please check the logfile to see what caused the error.") + log.Infof("💡 "+colorstring.Yellow("Saving xcodebuild output into file")+": %s", xcodebuildOutputFilePath) + if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { + return fmt.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) + } } + return nil } + + archivePath, err := codesigndoc.GenerateXCodeArchive(xcodeCmd, writeBuildLogs) if err != nil { return ArchiveError{toolXcode, err.Error()} } diff --git a/cmd/xcodeUITests.go b/cmd/xcodeUITests.go index 1e004699..5576b28b 100644 --- a/cmd/xcodeUITests.go +++ b/cmd/xcodeUITests.go @@ -114,6 +114,7 @@ func scanXcodeUITestsProject(cmd *cobra.Command, args []string) error { xcodeUITestsCmd.SDK = paramXcodebuildSDK } + fmt.Println() fmt.Println() log.Printf("🔦 Running an Xcode build-for-testing, to get all the required code signing settings...") xcodebuildOutputFilePath := filepath.Join(absExportOutputDirPath, "xcodebuild-output.log") @@ -128,15 +129,12 @@ func scanXcodeUITestsProject(cmd *cobra.Command, args []string) error { if err := fileutil.WriteStringToFile(xcodebuildOutputFilePath, xcodebuildOutput); err != nil { log.Errorf("Failed to save xcodebuild output into file (%s), error: %s", xcodebuildOutputFilePath, err) } - - if err != nil { - log.Warnf("Please check the logfile to see what caused the error.") - } } - if err != nil { log.Warnf("Last lines of the build log:") fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) + + log.Infof(colorstring.Yellow("Please check the build log to see what caused the error.")) fmt.Println() log.Errorf("Xcode Build For Testing failed.") diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go index 81f73f65..bbfe8461 100644 --- a/codesigndoc/xcode.go +++ b/codesigndoc/xcode.go @@ -14,22 +14,34 @@ import ( ) // GenerateXCodeArchive ... -func GenerateXCodeArchive(xcodeCmd xcode.CommandModel) (string, string, error) { +func GenerateXCodeArchive(xcodeCmd xcode.CommandModel, handleBuildLog func(string) error) (archivePath string, err error) { // Output tools versions xcodebuildVersion, err := utility.GetXcodeVersion() if err != nil { - return "", "", fmt.Errorf("failed to get Xcode (xcodebuild) version, error: %s", err) + return "", fmt.Errorf("failed to get Xcode (xcodebuild) version, error: %s", err) } fmt.Println() log.Infof("%s: %s (%s)", colorstring.Green("Xcode (xcodebuild) version"), xcodebuildVersion.Version, xcodebuildVersion.BuildVersion) + fmt.Println() fmt.Println() log.Printf("🔦 Running an Xcode Archive, to get all the required code signing settings...") + archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() + defer func() { + if derr := handleBuildLog(xcodebuildOutput); derr != nil { + if err != nil { + err = derr + } + } + }() + if err != nil { log.Warnf("Last lines of the build log:") fmt.Println(stringutil.LastNLines(xcodebuildOutput, 15)) + + log.Infof(colorstring.Yellow("Please check the build log to see what caused the error.")) fmt.Println() log.Errorf("Xcode Archive failed.") @@ -37,10 +49,10 @@ func GenerateXCodeArchive(xcodeCmd xcode.CommandModel) (string, string, error) { log.Infof(colorstring.Yellow("and make sure that you can build an Archive, with the scheme: ")+"%s", xcodeCmd.Scheme) fmt.Println() - return "", "", err + return "", err } - return archivePath, xcodebuildOutput, nil + return archivePath, nil } // CodesigningFilesForXCodeProject ... From ca4cbf944051094726da5911bcdaa92886055b75 Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Fri, 7 Jun 2019 09:34:23 +0200 Subject: [PATCH 7/9] Rename GenerateXcodeArchive to BuildXcodeArchive --- cmd/xcode.go | 2 +- codesigndoc/xcode.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/xcode.go b/cmd/xcode.go index 2ee198f2..ee7ed686 100644 --- a/cmd/xcode.go +++ b/cmd/xcode.go @@ -123,7 +123,7 @@ func scanXcodeProject(_ *cobra.Command, _ []string) error { return nil } - archivePath, err := codesigndoc.GenerateXCodeArchive(xcodeCmd, writeBuildLogs) + archivePath, err := codesigndoc.BuildXcodeArchive(xcodeCmd, writeBuildLogs) if err != nil { return ArchiveError{toolXcode, err.Error()} } diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go index bbfe8461..38b92f9f 100644 --- a/codesigndoc/xcode.go +++ b/codesigndoc/xcode.go @@ -13,8 +13,8 @@ import ( "github.com/bitrise-io/go-utils/stringutil" ) -// GenerateXCodeArchive ... -func GenerateXCodeArchive(xcodeCmd xcode.CommandModel, handleBuildLog func(string) error) (archivePath string, err error) { +// BuildXcodeArchive builds an Xcode archive +func BuildXcodeArchive(xcodeCmd xcode.CommandModel, handleBuildLog func(string) error) (archivePath string, err error) { // Output tools versions xcodebuildVersion, err := utility.GetXcodeVersion() if err != nil { From d5d3c8ff0e5b0c2224b0f8aa703625bd43e2cf6f Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Fri, 7 Jun 2019 09:39:40 +0200 Subject: [PATCH 8/9] Adding nil check for closure --- codesigndoc/xcode.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/codesigndoc/xcode.go b/codesigndoc/xcode.go index 38b92f9f..70710f33 100644 --- a/codesigndoc/xcode.go +++ b/codesigndoc/xcode.go @@ -30,9 +30,11 @@ func BuildXcodeArchive(xcodeCmd xcode.CommandModel, handleBuildLog func(string) archivePath, xcodebuildOutput, err := xcodeCmd.GenerateArchive() defer func() { - if derr := handleBuildLog(xcodebuildOutput); derr != nil { - if err != nil { - err = derr + if handleBuildLog != nil { + if derr := handleBuildLog(xcodebuildOutput); derr != nil { + if err != nil { + err = derr + } } } }() From 3ff36f59ea120205171f4f9a45412abe577671ab Mon Sep 17 00:00:00 2001 From: Laszlo Pusok Date: Fri, 7 Jun 2019 10:58:46 +0200 Subject: [PATCH 9/9] Removing check using removed field --- codesign/export.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/codesign/export.go b/codesign/export.go index 72eb1458..6efd1835 100644 --- a/codesign/export.go +++ b/codesign/export.go @@ -1,7 +1,6 @@ package codesign import ( - "bytes" "errors" "fmt" "io/ioutil" @@ -253,9 +252,6 @@ func exportProvisioningProfiles(profiles []profileutil.ProvisioningProfileInfoMo if err != nil { return nil, fmt.Errorf("failed to parse exported profile, error: %s", err) } - if bytes.Compare(profile.Content(), exportedProfile.Content()) != 0 { - return nil, fmt.Errorf("Profile found in the archive does not match found profile") - } contents, err := ioutil.ReadFile(pth) if err != nil {