From 8a4ae81122ed456ef513270cca3758e8071f4fb7 Mon Sep 17 00:00:00 2001
From: Cam Saul <github@camsaul.com>
Date: Wed, 5 Feb 2020 12:18:54 -0800
Subject: [PATCH] Mac app build script improvements [ci skip]

---
 bin/osx-release | 62 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 50 insertions(+), 12 deletions(-)

diff --git a/bin/osx-release b/bin/osx-release
index eac9c57b94a..3660b92c989 100755
--- a/bin/osx-release
+++ b/bin/osx-release
@@ -93,36 +93,68 @@ sub build {
     remove_tree($xcarchive);
 }
 
-# Codesign Metabase.app
-sub codesign {
+sub codesign_file {
+    my ($filename) = @_;
+
     Readonly my $codesigning_cert_name => config_or_die('codesigningIdentity');
+    Readonly my $entitlements_file => get_file_or_die('OSX/Metabase/Metabase.entitlements');
 
-    announce "Codesigning $app...";
+    announce "Codesigning $filename...";
 
     system('codesign', '--force', '--verify',
            '--sign', $codesigning_cert_name,
            '-r=designated => anchor trusted',
            '--timestamp',
            '--options', 'runtime',
-           '--deep', get_file_or_die($app)) == 0 or die "Code signing failed: $!\n";
+           '--entitlements', $entitlements_file,
+           '--deep', get_file_or_die($filename)) == 0 or die "Code signing failed: $!\n";
 }
 
-# Verify that Metabase.app was signed correctly
-sub verify_codesign {
+# Codesign Metabase.app
+sub codesign {
+    codesign_file($app) or die $1;
+}
+
+sub verify_file_codesign {
+    my ($filename) = @_;
+    get_file_or_die($filename);
+
     config_or_die('codesigningIdentity');
 
-    announce "Verifying codesigning for $app...";
+    announce "Verifying codesigning for $filename...";
+
+    system('codesign', '--verify', '--deep',
+           '--display',
+           '--strict',
+           '--verbose=4',
+           get_file_or_die($filename)) == 0 or die "Code signing verification failed: $!\n";
 
-    system('codesign', '--verify', '--deep', '--display',
-           '--verbose=4', get_file_or_die($app)) == 0 or die "Code signing verification failed: $!\n";
+    announce "codesign --verify $filename successful";
 
     # Double-check with System Policy Security tool
-    system('spctl', '--assess', '--verbose=4', get_file_or_die($app)) == 0
+    system('spctl', '--assess', '--verbose=4', get_file_or_die($filename)) == 0 or die "Codesigning verification (spctl) failed: $!\n";
+
+    announce "spctl --assess $filename successful";
+
+}
+
+# Verify that Metabase.app was signed correctly
+sub verify_codesign {
+    verify_file_codesign($app) or die $!;
 }
 
 
 # ------------------------------------------------------------ PACKAGING FOR SPARKLE ------------------------------------------------------------
 
+sub verify_zip_codesign {
+    remove_tree('/tmp/Metabase.zip');
+
+    system('unzip', get_file_or_die($zipfile),
+           '-d', '/tmp/Metabase.zip');
+
+    verify_file_codesign('/tmp/Metabase.zip/Metabase.app') or die $!;
+}
+
 # Create ZIP containing Metabase.app
 sub archive {
     announce "Creating $zipfile...";
@@ -131,8 +163,11 @@ sub archive {
 
     get_file_or_die($app);
 
-    system('cd ' . OSX_ARTIFACTS_DIR . ' && zip -r Metabase.zip Metabase.app') == 0 or die $!;
+    # Use ditto instead of zip to preserve the codesigning -- see https://forums.developer.apple.com/thread/116831
+    system('cd ' . OSX_ARTIFACTS_DIR . ' && ditto -c -k --sequesterRsrc --keepParent Metabase.app Metabase.zip') == 0 or die $!;
     get_file_or_die($zipfile);
+
+    verify_zip_codesign;
 }
 
 sub generate_signature {
@@ -323,6 +358,9 @@ sub notarize_file {
            '--asc-provider', $ascProvider,
            '--file', $filename
           ) == 0 or die $!;
+
+    print 'You can keep an eye on the notarization status (and get the LogFileURL) with the command:' . "\n\n";
+    print '    xcrun altool --notarization-info <RequestUUID> -u "$METABASE_MAC_APP_BUILD_APPLE_ID" -p "@keychain:METABASE_MAC_APP_BUILD_PASSWORD"' . "\n\n";
 }
 
 sub wait_for_notarization {
@@ -351,7 +389,7 @@ sub staple_notorization {
     announce "Stapling notarization to $filename...";
 
     system('xcrun', 'stapler', 'staple',
-           '-v', $filename) == 0 or die $1;
+           '-v', $filename) == 0 or die $!;
 
     announce "Notarization stapled successfully.";
 }
-- 
GitLab