From af2ec66e0c7912baad871aea34efcc493e02de27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Thu, 27 May 2021 09:53:40 +0200 Subject: [PATCH] ci: implement MacOS notarization using xcrun altool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This introduces an automated MacOS notarization process for Jenkins CI. The process involves: * Uploading the signed DMG file to the notary service * Checking periodically if the scanning process has completed * Stapling the successful scan ticket to the DMG file This is done by the `scripts/notarize-macos-pkg.sh` via the `make notarize-macos` target. The whole process is described in more details in `docs/macos_notarization.md`. Depends on: https://github.com/status-im/status-jenkins-lib/pull/27 Resolves: https://github.com/status-im/status-desktop/issues/2169 Signed-off-by: Jakub SokoĊ‚owski --- .gitignore | 1 + Makefile | 6 +++ ci/Jenkinsfile.macos | 36 +++++--------- docs/images/gatekeeper_warning.png | Bin 0 -> 69568 bytes docs/macos_notarization.md | 75 +++++++++++++++++++++++++++++ scripts/notarize-macos-pkg.sh | 70 +++++++++++++++++++++++++++ 6 files changed, 165 insertions(+), 23 deletions(-) create mode 100644 docs/images/gatekeeper_warning.png create mode 100644 docs/macos_notarization.md create mode 100755 scripts/notarize-macos-pkg.sh diff --git a/.gitignore b/.gitignore index a95e01289c..9a6daf0cef 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ resources.rcc resources.qrc status-react-translations/ /.update.timestamp +notarization.log diff --git a/Makefile b/Makefile index e7f3ac64a2..911c8c3113 100644 --- a/Makefile +++ b/Makefile @@ -340,6 +340,12 @@ ifdef MACOS_CODESIGN_IDENT scripts/sign-macos-pkg.sh $(STATUS_CLIENT_DMG) $(MACOS_CODESIGN_IDENT) endif +notarize-macos: export CHECK_INTERVAL_SEC ?= 30 +notarize-macos: export CHECK_RETRY_LIMIT ?= 20 +notarize-macos: export MACOS_BUNDLE_ID ?= im.status.ethereum.desktop +notarize-macos: + scripts/notarize-macos-pkg.sh $(STATUS_CLIENT_DMG) + NIM_WINDOWS_PREBUILT_DLLS ?= tmp/windows/tools/pcre.dll $(NIM_WINDOWS_PREBUILT_DLLS): diff --git a/ci/Jenkinsfile.macos b/ci/Jenkinsfile.macos index 7323511c9b..92cefd8379 100644 --- a/ci/Jenkinsfile.macos +++ b/ci/Jenkinsfile.macos @@ -1,4 +1,4 @@ -library 'status-jenkins-lib@v1.2.15' +library 'status-jenkins-lib@ci-macos-notarization' pipeline { agent { @@ -36,6 +36,8 @@ pipeline { PATH = "${env.QTDIR}/bin:${env.PATH}" /* Control output the filename */ STATUS_CLIENT_DMG = "pkg/${utils.pkgFilename('dmg')}" + /* Apple Team ID for Notarization */ + MACOS_NOTARIZE_TEAM_ID = "DTX7Z4U3YA" } stages { @@ -67,28 +69,16 @@ pipeline { } stage('Package') { - steps { - withCredentials([ - string( - credentialsId: 'macos-keychain-identity', - variable: 'MACOS_CODESIGN_IDENT' - ), - string( - credentialsId: 'macos-keychain-pass', - variable: 'MACOS_KEYCHAIN_PASS' - ), - file( - credentialsId: 'macos-keychain-file', - variable: 'MACOS_KEYCHAIN_FILE' - ), - string( - credentialsId: utils.getInfuraTokenCred(), - variable: 'INFURA_TOKEN' - ) - ]) { - sh 'make pkg-macos' - } - } + steps { script { + macos.bundle() + } } + } + + stage('Notarize') { + when { expression { utils.isReleaseBuild() } } + steps { script { + macos.notarize() + } } } stage('Parallel Upload') { diff --git a/docs/images/gatekeeper_warning.png b/docs/images/gatekeeper_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..22ea3db823eef395bbdeb11d17120ab394c5f2c2 GIT binary patch literal 69568 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 literal 0 HcmV?d00001 diff --git a/docs/macos_notarization.md b/docs/macos_notarization.md new file mode 100644 index 0000000000..d4cbd39f82 --- /dev/null +++ b/docs/macos_notarization.md @@ -0,0 +1,75 @@ +# Description + +This document describes the process of notarizing a MacOS application. + +# Notarization + +The process [Software Notarization](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution) is necessary to avoid [Gatekeeper](https://en.wikipedia.org/wiki/Gatekeeper_(macOS)) warnings which look like this: + +![Gatekeeper Warning](./images/gatekeeper_warning.png) + +According to Apple the Notarization process will: + +>Give users even more confidence in your software by submitting it to Apple to be notarized. The service automatically scans your Developer ID-signed software and performs security checks. When it's ready to export for distribution, a ticket is attached to your software to let Gatekeeper know it's been notarized. + +https://developer.apple.com/developer-id/ + +The process involves the following steps: + +>When you click Next, Xcode uploads your archive to the notary service. When the upload is complete, the notary service begins the scanning process, which usually takes less than an hour. (...) When the notarization process finishes, Xcode downloads the ticket and staples it to your archive. At that point, export your archive again to receive a distributable version of your software that includes the notary ticket. + +https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution + +# Tickets + +>Notarization produces a ticket that tells Gatekeeper that your app is notarized. After notarization completes successfully, the next time any user attempts to run your app on macOS 10.14 or later, Gatekeeper finds the ticket online. This includes users who downloaded your app before notarization. + +https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow + +# Authentication + +The notarization process requires authentication. + +>Add the `username` and `password` options to supply your App Store Connect credentials. Because App Store Connect now requires two-factor authentication (2FA) on all accounts, you must create an app-specific password for `altool`, as described in Using app-specific passwords. + +https://support.apple.com/en-us/HT204397 + +# Tools + +Notarization can be performed by Xcode, or using the command line `xcrun altool` utility: +```sh +% xcrun altool --notarize-app + --primary-bundle-id "com.example.ote.zip" + --username "AC_USERNAME" + --password "@keychain:AC_PASSWORD" + --asc-provider + --file OvernightTextEditor_11.6.8.zip +``` +The request is created which has a UUID assigned to it which can be used to check progress: +```sh +% xcrun altool --notarization-info 2EFE2717-52EF-43A5-96DC-0797E4CA1041 -u "AC_USERNAME" +``` +And once completed the ticket can be "stapled" to the bundle: +``` +% xcrun stapler staple "Overnight TextEditor.app" +``` +https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow + +# Script + +Our process is automated using the [`scripts/notarize-macos-pkg.sh`](../scripts/notarize-macos-pkg.sh) script, which performs all the necessary steps in CI: +``` +../scripts/notarize-macos-pkg.sh pkg/StatusIm-Desktop-v0.1.0-beta.9-39582e.dmg +``` +But it requires certain credentials to be provided: + +* `MACOS_NOTARIZE_TEAM_ID` - Apple Team ID +* `MACOS_NOTARIZE_USERNAME` - Apple Dev Portal Username +* `MACOS_NOTARIZE_PASSWORD` - Apple Dev Portal Password or Keystore with password + +# Links + +* https://scriptingosx.com/2019/09/notarize-a-command-line-tool/ +* https://stackoverflow.com/questions/56890749/macos-notarize-in-script +* https://github.com/rednoah/notarize-app +* https://support.apple.com/en-us/HT204397 diff --git a/scripts/notarize-macos-pkg.sh b/scripts/notarize-macos-pkg.sh new file mode 100755 index 0000000000..bd5bd07f05 --- /dev/null +++ b/scripts/notarize-macos-pkg.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +set -e + +[[ $(uname) != 'Darwin' ]] && { echo 'This only works on macOS.' >&2; exit 1; } +[[ $# -ne 1 ]] && { echo 'notarize-macos-pkg.sh ' >&2; exit 1; } + +# Credential necessary for the upload. +[[ -z "${MACOS_NOTARIZE_TEAM_ID}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_TEAM_ID" 1>&2; exit 1; } +[[ -z "${MACOS_NOTARIZE_USERNAME}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_USERNAME" 1>&2; exit 1; } +[[ -z "${MACOS_NOTARIZE_PASSWORD}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_PASSWORD" 1>&2; exit 1; } + +# Path to MacOS bundle created by XCode. +BUNDLE_PATH="${1}" +# Notarization request check intervals/retries. +CHECK_INTERVAL_SEC="${CHECK_INTERVAL_SEC:-30}" +CHECK_RETRY_LIMIT="${CHECK_RETRY_LIMIT:-20}" +# Unique ID of MacOS application. +MACOS_BUNDLE_ID="${MACOS_BUNDLE_ID:-im.status.ethereum.desktop}" +# Log file path +NOTARIZATION_LOG="${NOTARIZATION_LOG:-${PWD}/notarization.log}" + +function xcrun_altool() { + xcrun altool "${@}" \ + --team-id "${MACOS_NOTARIZE_TEAM_ID}" \ + --username "${MACOS_NOTARIZE_USERNAME}" \ + --password "${MACOS_NOTARIZE_PASSWORD}" \ + --output-format "json" \ + 2>&1 | tee -a "${NOTARIZATION_LOG}" +} + +# Submit app for notarization. Should take 5-10 minutes. +echo -e "\n### Creating Notarization Request..." +OUT=$(xcrun_altool --notarize-app -f "${BUNDLE_PATH}" --primary-bundle-id "${MACOS_BUNDLE_ID}") +# Necessary to track notarization request progress. +REQUEST_UUID=$(echo "${OUT}" | jq -r '."notarization-upload".RequestUUID') + +if [[ -z "${REQUEST_UUID}" ]]; then + echo "\n!!! FAILURE: No notarization request UUID found." >&1 + exit 1 +fi +echo -e "\n### Request ID: ${REQUEST_UUID}" + +# Check notarization ticket status periodically. +echo -e "\n### Checking Notarization Status..." +while sleep "${CHECK_INTERVAL_SEC}"; do + OUT=$(xcrun_altool --notarization-info "${REQUEST_UUID}") + + # Once notarization is complete, run stapler and exit. + if $(echo "${OUT}" | jq -er '."notarization-info".Status == "in progress"'); then + ((CHECK_RETRY_LIMIT-=1)) + if [[ "${CHECK_RETRY_LIMIT}" -eq 0 ]]; then + echo -e "\n!!! FAILURE: Notarization timed out." + exit 1 + fi + echo "In progress, sleeping ${CHECK_INTERVAL_SEC}s..." + elif $(echo "${OUT}" | jq -er '."notarization-info".Status == "success"'); then + echo -e "\n### Successful Notarization" + break + else + echo -e "\n!!! Notariztion Error" + echo "${OUT}" >&2 + exit 1 + fi +done + +# Optional but preferrable to attach the ticket to the bundle. +echo -e "\n### Stapling Notarization Ticket..." +xcrun stapler staple "${BUNDLE_PATH}" +exit $?