أرشفة: للأسف لم أعد أستفيد من هذا المشروع ولم أحتفظ به بشكل صحيح منذ أوائل عام 2022. أرحب بأي شخص في شوكة وتولي هذا المشروع.
GON هي أداة بسيطة بدون زواج لتوقيع وتوثيق ثنائيات CLI الخاصة بك ل MACOS. يتوفر GON باعتباره CLI يمكن تشغيله يدويًا أو في خطوط أنابيب الأتمتة. وهي متوفرة أيضًا كمكتبة GO للتضمين في المشاريع المكتوبة في GO. يمكن لـ GON التوقيع على الثنائيات المكتوبة في أي لغة.
بدءًا من MacOS Catalina (10.15) ، تتطلب Apple توقيع جميع البرامج الموزعة خارج متجر تطبيقات Mac وتوثيقها. سيتم عرض البرنامج الذي لم يتم توقيعه بشكل صحيح أو توثيق رسالة خطأ مع الخيار الوحيد القابل للتنفيذ هو "الانتقال إلى bin". لا يمكن تشغيل البرنامج حتى من سطر الأوامر. الحلول مؤلمة للمستخدمين. يساعدك GON على أتمتة عملية التوثيق.
شاهد خريطة الطريق للحصول على الميزات التي نريد دعمها ولكن لا ننشئها بعد.
يدير المثال أدناه gon ضد نفسه لإنشاء ZIP و DMG.

أسهل طريقة لتثبيت gon هي عبر homebrew:
$ brew install mitchellh/gon/gon
يمكنك أيضًا تنزيل الإصدار المناسب لمنصتك من صفحة الإصدارات. هذه جميعها موقعة وتوثيق النفاد من الصندوق على MacOS 10.15+.
يمكنك أيضًا التجميع من المصدر باستخدام GO 1.13 أو لاحقًا باستخدام Standard 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 صالحة. قد تحتاج إلى الاشتراك في حساب مطور Apple.
انتقل إلى صفحة الشهادات.
انقر فوق أيقونة "+" ، حدد "تطبيق معرف المطور" واتبع الخطوات.
بعد تنزيل الشهادة ، انقر نقرًا مزدوجًا لاستيرادها إلى سلسلة المفاتيح الخاصة بك. إذا كنت تبني على جهاز CI ، فيجب أن يكون لدى كل جهاز CI هذه الشهادة في سلسلة المفاتيح الخاصة بهم.
عبر Xcode:
افتح Xcode وانتقل إلى Xcode => تفضيلات => حسابات
انقر فوق "+" في أسفل اليسار وأضف معرف 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 ، وعادة ما يكون عنوان بريد إلكتروني. سيؤدي ذلك إلى افتراضي لمتغير بيئة AC_USERNAME إذا لم يتم تعيينه.
password ( string ) - كلمة المرور لمعرف Apple المرتبط. يمكن تحديد ذلك مباشرة أو باستخدام @keychain:<name> أو @env:<name> لتجنب وضع كلمة مرور النص العادي مباشرة في ملف التكوين. سيقوم Syntax بتحميل كلمة المرور من @keychain:<name> syntax من سلسلة مفاتيح MacOS مع الاسم المحدد. @env:<name> Syntax سيقوم بتحميل كلمة المرور من المتغير البيئي المسماة. إذا لم يتم تعيين هذه القيمة ، فسوف نحاول استخدام متغير بيئة AC_PASSWORD باعتباره افتراضيًا.
ملاحظة : إذا تم تمكين 2FA ، فيجب أن تكون كلمة المرور كلمة مرور للتطبيق ، وليس كلمة مرور معرف Apple العادية. انظر استكشاف الأخطاء وإصلاحها للحصول على التفاصيل.
provider ( string ) - مزود توصيل متجر التطبيقات عند استخدام فرق متعددة داخل App Store Connect. إذا لم يتم تعيين هذا ، فسوف نحاول قراءة متغير بيئة AC_PROVIDER باعتباره افتراضيًا.
sign - الإعدادات المتعلقة بتوقيع الملفات.
application_identity ( string ) - اسم أو معرّف شهادة "تطبيق معرف المطور" لاستخدامه في توقيع التطبيقات. هذا يقبل أي قيمة صالحة لعلم -s لـ codesign Binary على MacOS. انظر man codesign للحصول على وثائق مفصلة حول القيم المقبولة.
entitlements_file ( string اختيارية ) --entitlements الكامل لتنسيق plist codesign
dmg ( اختياري ) - الإعدادات المتعلقة بإنشاء صورة قرص (DMG) كإخراج. سيتم إنشاء هذا فقط إذا تم تحديد ذلك. ستحصل DMG أيضًا على تذكرة التوثيق تدبيس بحيث يمكن التحقق منها في وضع عدم الاتصال بالإنترنت ولا تتطلب استخدام الإنترنت.
output_path ( string ) - المسار لإنشاء أرشيف zip. إذا كان هذا المسار موجودًا بالفعل ، فسيتم الكتابة فوقه. سيتم نسخ جميع الملفات الموجودة في source في جذر أرشيف الرمز البريدي.
volume_name ( string ) - اسم DMG المثبتة الذي يظهر في Finder ، ومسار الملف المثبت ، إلخ.
zip ( اختياري ) - الإعدادات المتعلقة بإنشاء أرشيف مضغوط كإخراج. سيتم إنشاء أرشيف الرمز البريدي فقط إذا تم تحديد ذلك. لاحظ أن محفوظات الرمز البريدي لا تدعم تدبيس ، مما يعني أن الملفات الموجودة في أرشيف الرمز البريدي المقدم ستتطلب اتصالًا بالإنترنت للتحقق من الاستخدام الأول.
output_path ( string ) - المسار لإنشاء أرشيف zip. إذا كان هذا المسار موجودًا بالفعل ، فسيتم الكتابة فوقه. سيتم نسخ جميع الملفات الموجودة في source في جذر أرشيف الرمز البريدي.وضع التوثيق فقط:
notarize ( اختياري ) - الإعدادات لتوثيق الملفات التي تم إنشاؤها بالفعل. هذا بديل لاستخدام خيار source . يمكن تكرار هذا الخيار لتوثيق الملفات المتعددة.
path ( string ) - المسار إلى الملف إلى توثيق. يجب أن يكون هذا أحد أنواع الملفات المدعومة من Apple من أجل التوثيق: DMG أو PKG أو APP أو ZIP.
bundle_id ( string ) - معرف الحزمة لاستخدامه لهذا التوثيق. يتم استخدام هذا بدلاً من bundle_id من المستوى الأعلى (والذي يتحكم في قيمة عمليات التشغيل المستندة إلى المصدر).
staple ( bool اختياري ) - عناصر التحكم إذا كان stapler staple قيد التشغيل إذا نجحت Notarization. يجب تعيين هذا فقط لنوع filetypes التي تدعمها (DMG ، PKG ، أو APP).
يمكنك تكوين gon لتثبيط الملفات الموقعة بالفعل. يعد هذا مفيدًا إذا كنت تدمج gon في خط أنابيب بناء موجود قد يدعم بالفعل إنشاء ملفات PKG والتطبيق وما إلى ذلك.
نظرًا لأن التوقيت يتطلب توقيع حمولة الحزم أيضًا ، يفترض هذا الوضع أنك قمت بتصميم الحمولة الحمولة وكذلك الحزمة نفسها. لن يوقع gon على الحزمة الخاصة بك في الكتل notarize . من فضلك لا تخلط بين هذا عندما يتم تعيين source وإنشاء gon نفسه بإنشاء الحزم الخاصة بك ، وفي هذه الحالة سيوقعها أيضًا.
يمكنك استخدام هذا بالإضافة إلى تحديد source أيضًا. في هذه الحالة ، سنقوم بتوحيد وتجميع الملفات المحددة في source ثم نلقي هذه النتائج وكذلك تلك الموجودة في كتل notarize .
مثال في حمض الهيدروكلوريك ثم التكوين المتطابق في 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 ، فيمكنك التحقق من حالة الطلب بنفسك باستخدام الطلب الذي يخرجه gon بعد التقديم.
تم تصميم gon لدعم التشغيل داخل البيئات الآلية مثل خطوط أنابيب CI. في هذه البيئة ، يجب عليك استخدام ملفات تكوين 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 أن gon هو المعالجة الفرعية ، وليس من gon نفسها.
لا أعرف حاليًا كيفية السيع في الموافقات ، وبالتالي فإن التوصية المتعلقة بآلات البناء هي تشغيل gon يدويًا مرة واحدة. إذا وجد أي شخص طريقة لأتمتة هذا ، فيرجى فتح مشكلة ، فأخبرني ، وسأقوم بتحديث هذه القراءة.
GoreleAser هي أداة أتمتة الإصدار الكاملة الشهيرة للمشاريع المستندة إلى GO. يمكن استخدام GON مع GoreleAser لزيادة خطوة التوقيع لتوضيح ثنائياتك كجزء من خط أنابيب GoreleAser.
فيما يلي مثال على تكوين 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لمعرفة المزيد ، راجع وثائق GoreleAser.
نحن أيضًا نفرض واجهة برمجة تطبيقات مدعومة للتوقيع والتعبئة والتغليف وتوثيق الملفات باستخدام لغة برمجة GO. يرجى الاطلاع على وثائق GO المرتبطة لمزيد من التفاصيل.
المكتبات المكشوفة هي مستوى أقل عمداً وتفصل الخطوات والطاقة والتوثيق والتدشير. يتيح لك ذلك دمج هذه الوظيفة في أي أدوات بسهولة مقابل تجربة gon -CLI.
من المحتمل أن تكون قد تم تمكين Apple 2FA. ستحتاج إلى إنشاء كلمة مرور التطبيق واستخدامها بدلاً من كلمة مرور معرف Apple.
هذه بعض الأشياء التي أحب أن أراه ولكن لا يتم تنفيذها حاليًا.