Архивировано: я, к сожалению, больше не использую этот проект и не поддерживал его с начала 2022 года. Я приветствую кого -нибудь, чтобы развеваться и взять на себя этот проект.
Гон-это простой инструмент без излишеств для подписания и нотариально нотариально нотариально нотариально нотариально нотариально нотариально нотариально для MacOS. GON доступен в виде CLI, который можно запускать вручную или в автоматических трубопроводах. Он также доступен в качестве библиотеки GO для внедрения в проекты, написанные в Go. Гон может подписать и нотаризовать двоичные файлы, написанные на любом языке.
Начиная с MacOS Catalina (10.15), Apple требует, чтобы все программное обеспечение, распространяемое за пределами App Store Mac, подписано и нотариально нотариоризовывало. Программное обеспечение, которое не подписано или нотаризировано, будет показано сообщение об ошибке с единственной действенной опцией, чтобы «перейти к бин». Программное обеспечение не может быть запущено даже из командной линии. Обходные пути болезненны для пользователей. GON помогает вам автоматизировать процесс нотаризации.
Посмотрите на дорожную карту для функций, которые мы хотим поддержать, но еще нет.
Пример ниже работает gon против себя, чтобы генерировать ZIP и DMG.

Самый простой способ установить gon - это Homebrew:
$ brew install mitchellh/gon/gon
Вы также можете загрузить соответствующий релиз для вашей платформы со страницы релизов. Все они подписаны и нотариальны, чтобы выбежать из коробки на MacOS 10.15+.
Вы также можете скомпилировать источник, используя GO 1.13 или более позднее, используя стандартную go build . Пожалуйста, убедитесь, что модули GO включены.
gon требует файла конфигурации, который может быть указан в виде пути файла или пройти через STDIN. Конфигурация указывает все настройки, которые gon будет использовать для подписи и упаковки ваших файлов.
GON должен работать на машине MacOS с XCODE 11.0 или более поздней версии. Подписание кода, нотаризация и упаковка требуют инструментов, доступных только на машинах MacOS.
$ gon [flags] [CONFIG]
При выполнении gon будет подписывать, пакет и нотаризацию настроенных файлов в запрошенные форматы. gon выйдет с кодом выхода 0 об успехе и любом другом значении об отказе.
Перед использованием gon вы должны приобрести сертификат идентификатора разработчика. Для этого вы можете сделать это либо через Интернет, либо через Xcode локально на Mac. Использование Xcode проще, если он уже установил.
Через Интернет:
Войдите в Developer.apple.com с действительными учетными данными Apple ID. Возможно, вам придется подписаться на учетную запись Apple Developer.
Перейдите на страницу сертификатов.
Нажмите значок «+», выберите «Приложение идентификатор разработчика» и выполните шаги.
После загрузки сертификата дважды щелкните его, чтобы импортировать его в свой брелок. Если вы строите на машине CI, на каждом компьютере CI должен быть этот сертификат в своей ключей.
Через xcode:
Откройте Xcode и перейдите к xcode => preferences => accounts
Нажмите «+» в левом нижнем углу и добавьте свой идентификатор Apple, если вы еще этого не сделали.
Выберите свою учетную запись Apple и нажмите «Управление сертификатами» в правом нижнем углу.
Нажмите «+» в левом нижнем углу и нажмите «Приложение идентификатора разработчика».
Щелкните правой кнопкой мыши недавно созданный сертификат в списке, нажмите «Экспорт» и экспортируйте файл в качестве сертификата в формате P12. Сохраните это где -нибудь . Вы никогда не сможете скачать его снова.
Чтобы убедиться, что вы сделали это правильно, вы можете осмотреть свой брелок:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundВы должны увидеть один или несколько сертификатов, и, по крайней мере, один должен быть сертификатом вашего идентификатора разработчика. Предварительный префикс шестнадцатеричной строки - это значение, которое вы можете использовать в своем файле конфигурации для указания идентификации.
Файл конфигурации может указать списки разрешения/запрет лицензий для отчетов, переопределения лицензий для конкретных зависимостей и многого другого. Формат файла конфигурации - HCL или JSON.
Пример:
source = [ " ./terraform " ]
bundle_id = " com.mitchellh.example.terraform "
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
provider = " UL304B4VGY "
}
sign {
application_identity = " Developer ID Application: Mitchell Hashimoto "
}
dmg {
output_path = " terraform.dmg "
volume_name = " Terraform "
}
zip {
output_path = " terraform.zip "
}{
"source" : [ " ./terraform " ],
"bundle_id" : " com.mitchellh.example.terraform " ,
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD " ,
"provider" : " UL304B4VGY "
},
"sign" :{
"application_identity" : " Developer ID Application: Mitchell Hashimoto "
},
"dmg" :{
"output_path" : " terraform.dmg " ,
"volume_name" : " Terraform "
},
"zip" :{
"output_path" : " terraform.zip "
}
}Поддерживаемые конфигурации:
source ( array<string> ) - список файлов для подписи, пакета и нотаризации. Если вы хотите подписать несколько файлов с разными идентификаторами или в разные пакеты, вам следует вызвать gon с отдельными конфигурациями. Это необязательно, если вы используете режим только для нотаризации с блоком notarize .
bundle_id ( string ) - идентификатор пакета для вашего приложения. Вы должны выбрать что -то уникальное для вашего приложения. Вы также можете зарегистрировать их в Apple. Это необязательно, если вы используете режим только для нотаризации с блоком notarize .
apple_id - Настройки, связанные с идентификатором Apple для использования для нотаризации.
username ( string ) - имя пользователя Apple ID, обычно адрес электронной почты. Это будет по умолчанию с переменной среды AC_USERNAME , если не установлено.
password ( string ) - пароль для связанного идентификатора Apple. Это может быть указано напрямую или с использованием @keychain:<name> или @env:<name> чтобы не помещать пароль с открытым текстом непосредственно в файл конфигурации. @keychain:<name> Syntax загрузит пароль из MacOS для ключей с данным именем. @env:<name> Синтаксис загрузит пароль с именованной переменной среды. Если это значение не установлено, мы попытаемся использовать переменную среды AC_PASSWORD в качестве по умолчанию.
Примечание . Если у вас есть 2FA, пароль должен быть паролем приложения, а не обычным паролем Apple ID. Смотрите устранение неполадок для деталей.
provider ( string ) - App Store Connect Provider при использовании нескольких команд в App Store Connect. Если это не установлено, мы попытаемся прочитать переменную среды AC_PROVIDER в качестве дефолта.
sign - Настройки, связанные с подписью файлов.
application_identity ( string ) - Имя или идентификатор сертификата «Приложение идентификатора разработчика» для использования для подписи приложений. Это принимает любое достоверное значение для флага -s для бинарного codesign на macOS. См. man codesign для подробной документации по принятым значениям.
entitlements_file codesign string необязательно ) -Полный путь к формату PLIST --entitlements
dmg ( необязательно ) - Настройки, связанные с созданием дискового изображения (DMG) в качестве вывода. Это будет создано только в том случае, если это будет указано. У DMG также будет сшита билета нотаризации, чтобы его можно было проверить в автономном режиме и не потребовать использования Интернета.
output_path ( string ) - путь к созданию архива Zip. Если этот путь уже существует, он будет перезаписан. Все файлы в source будут скопированы в корень архива Zip.
volume_name ( string ) - Имя монтированного DMG, которое отображается в Finder, проходе монтированного файла и т. Д.
zip ( необязательно ) - Настройки, связанные с созданием архива ZIP в качестве вывода. Архив ZIP будет создан только в том случае, если это будет указано. Обратите внимание, что ZIP -архивы не поддерживают сшивание, а это означает, что файлы в архиве Zip NotaRized потребуют подключения к Интернету для проверки при первом использовании.
output_path ( string ) - путь к созданию архива Zip. Если этот путь уже существует, он будет перезаписан. Все файлы в source будут скопированы в корень архива Zip.Режим только для нотаризации:
notarize ( необязательно ) - Настройки нотариального нотаризации уже встроенных файлов. Это альтернатива использованию опции source . Эта опция можно повторить, чтобы нотаризовать несколько файлов.
path ( string ) - Путь к файлу к нотаризации. Это должен быть один из поддерживаемых файлов Apple для нотаризации: DMG, PKG, APP или ZIP.
bundle_id ( string ) - идентификатор пакета для использования для этого нотаризации. Это используется вместо верхнего уровня bundle_id (который управляет значением для прогонов на основе исходных источников).
staple ( bool kpecatal ) - Управление, если stapler staple должен работать, если нотаризация будет успешной. Это должно быть установлено только для филетипов, которые поддерживают его (DMG, PKG или приложение).
Вы можете настроить gon для нотаризации уже подписанных файлов. Это полезно, если вы интегрируете gon в существующий конвейер сборки, который уже может поддержать создание файлов PKG, приложения и т. Д.
Поскольку нотаризация требует, чтобы полезная нагрузка пакетов также была подписана, в этом режиме предполагается, что вы кодировали как полезную нагрузку, а также сам пакет. gon не будет подписывать вашу посылку в notarize блоках. Пожалуйста, не путайте это с тем, когда source устанавливается, и сам gon создает ваши пакеты, и в этом случае он также подпишет их.
Вы также можете использовать это в дополнение к указанию source . В этом случае мы будем кодировать и упаковать файлы, указанные в source , а затем нотариально нотариально нотариально эти результаты, а также в блоках notarize .
Пример в HCL, а затем идентичная конфигурация в JSON:
notarize {
path = " /path/to/terraform.pkg "
bundle_id = " com.mitchellh.example.terraform "
staple = true
}
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
}{
"notarize" : [{
"path" : " /path/to/terraform.pkg " ,
"bundle_id" : " com.mitchellh.example.terraform " ,
"staple" : true
}],
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD "
}
} ПРИМЕЧАНИЕ, вы можете указать несколько блоков notarize , чтобы одновременно нотаризовать мультипликационные файлы.
Процесс нотаризации требует отправки вашего пакета в Apple и ожидания, пока они их сканируют. Насколько я могу судить Apple, не предоставляет общественного SLA.
При разработке gon и работе с процессом нотаризации я обнаружил, что процесс в среднем является быстрым (<10 минут), но в некоторых случаях запросы на нотаризацию были в очереди в течение часа или более.
gon будет выводить обновления статуса по мере его поступления, и будет ждать на неопределенный срок, чтобы завершить нотаризацию. Если gon прерывается, вы можете проверить статус запроса самостоятельно, используя uuID запроса, который выходит gon после подачи.
gon построен для поддержки работы в автоматических средах, таких как CI Tipvelines. В этой среде вы должны использовать файлы конфигурации JSON с gon и флагом -log-json чтобы получить структурированный выход для ведения журнала.
gon всегда выводит, читаемый на человеке, на STDOUT (включая ошибки) и все выводы журнала на STDERR. Указав -log-json записи журнала будут структурированы с JSON. Вы можете обработать поток JSON, используя инструмент, такой как jq или любой язык сценариев, для извлечения критической информации, такой как uuID, статус и многое другое.
Когда gon работает в среде без TTY, человеческий выход не будет окрашен. Это делает его дружелюбным для выходных журналов.
Пример:
$ gon -log-level=info -log-json ./config.hcl
...
Обратите внимание, что вы должны указать как -log-level , так и -log-json . Флаг -log-level позволяет регистрировать в целом. info уровень достаточно в средах автоматизации, чтобы получить всю информацию, которую вам нужна.
На первом заезде можно было предложено несколько раз для паролей. Если вы нажмете «Всегда разрешать», то вам больше не будет предложено. Эти подсказки происходят из Apple Software, которое gon является субпроцессованием, а не от самого gon .
В настоящее время я не знаю, как скрепить разрешения, поэтому рекомендация по строительству состоит в том, чтобы запустить gon вручную один раз. Если кто -то найдет способ автоматизировать это, пожалуйста, откройте проблему, дайте мне знать, и я обновлю этот Readme.
GoreLeaser-популярный инструмент автоматизации выпуска с полным избранным для проектов на основе GO. GON можно использовать с GoreAser, чтобы увеличить этап подписания, чтобы нотариально нотарировать ваши двоичные файлы в рамках трубопровода горерезера.
Вот пример конфигурации Goreleaser для подписи ваших двоичных файлов:
builds :
- binary : foo
id : foo
goos :
- linux
- windows
goarch :
- amd64
# notice that we need a separated build for the macos binary only:
- binary : foo
id : foo-macos
goos :
- darwin
goarch :
- amd64
signs :
- signature : " ${artifact}.dmg "
ids :
- foo-macos # here we filter the macos only build id
# you'll need to have gon on PATH
cmd : gon
# you can follow the gon docs to properly create the gon.hcl config file:
# https://github.com/mitchellh/gon
args :
- gon.hcl
artifacts : allЧтобы узнать больше, посмотрите документацию по гореразера.
Мы также выставляем поддерживаемый API для подписания, упаковки и нотариальных файлов с использованием языка программирования GO. Пожалуйста, смотрите документацию Linked Go для получения более подробной информации.
Раскрытые библиотеки предназначены для более низкого уровня и разделяют шаги знака, упаковки, нотаризации и сшивания. Это позволяет интегрировать эту функциональность в любой инструмент, легко по сравнению с имением самоуверенного опыта gon -CLI.
У вас, вероятно, Apple 2FA включена. Вам нужно будет генерировать пароль приложения и использовать его вместо пароля Apple ID.
Это некоторые вещи, которые я хотел бы видеть, но в настоящее время не реализованы.