إذا أدخلت "Jira Badoo" في سلسلة البحث على Habré ، فستستغرق النتائج أكثر من صفحة واحدة: نذكرها في كل مكان تقريبًا ، لأنها تلعب دورًا مهمًا في عملياتنا. وكل واحد منا يريد مختلفة قليلا عنها.

يتوقع المطور ، الذي تلقى مهمة المراجعة ، أن يتم الإشارة إلى وجود فرع في المهمة ، وهناك روابط إلى الفرق وسجل التغيير. يتوقع المطور الذي كتب الكود رؤية التعليقات في جيرا بعد المراجعة. يريد المختبر ، الذي يتلقى المهمة من بعدهم ، رؤية نتائج الاختبار ويكون قادرًا على تشغيل التجميعات الضرورية دون الانتقال إلى واجهات أخرى. يريد مديرو المنتجات عمومًا إنشاء عشر مهام تطوير في نفس الوقت عن طريق الضغط على زر واحد.
وكل هذا متاح اليوم ويحدث تلقائيًا. لقد
طبقنا معظم السحر في PHP باستخدام واجهة برمجة تطبيقات Jira المتطورة باستمرار وباستخدام
webhook . واليوم نريد أن نشارك مع المجتمع إصدارنا من العميل لواجهة برمجة التطبيقات هذه.
في البداية ، أردنا فقط التحدث عن الأفكار والنهج الذي نستخدمه ، ثم قررنا أنه لا يوجد بالتأكيد رمز كاف لمثل هذه المقالة من أجل الوضوح. لذلك كان هناك نسخة مفتوحة المصدر من
Badoo Jira PHP Client . شكرا جزيلا ل
ShaggyRatte للمساعدة في وصفها. ومرحبا بكم في كات!
مزيد من التفاصيل والسياق. ماذا يمكن أن يفعل؟
في الواقع ، Badoo Jira PHP Client عبارة عن مجموعة من فئات المجمّع الجاهزة لاستجابات Jira API ، والتي يمكن أن يتصرف معظمها مثل ActiveRecord: فهم يعرفون كيفية الحصول على بيانات عن أنفسهم وكيفية تحديثها على الخادم ودعم التهيئة البطيئة وذاكرة التخزين المؤقت للبيانات على المستوى التعليمات البرمجية. جميع كيانات Jira التي يجب عليك التعامل معها بشكل مستمر يتم التفافها:
الإصدار ، الحالة ، الأولوية ، سجل التغيير ، المستخدم ، الإصدار ، المكون ، إلخ (تقريبًا كل ما تراه في الواجهة).
بالإضافة إلى ذلك ، يوفر Badoo Jira PHP Client تسلسل هرمي لفئة واحدة لجميع حقول Jira المخصصة ويمكنه إنشاء تعريفات للفصل لكل حقل مخصص تحتاج إليه.
$Issue = new \Badoo\Jira\Issue('SMPL-1'); $Issue->addComment('Sample comment text'); $Issue->attachFile('kitten.jpeg', 'pretty!', 'image/jpeg'); if ($Issue->getStatus()->getName() === 'Open') { $Issue->step('In Progress'); }
$DeveloperField = new \Example\CustomFields\Developer($Issue); $DeveloperField->setValue('username')->save();
$User = \Badoo\Jira\User::get('username'); $User->watchIssue('SMPL-1'); $User->assign('SMPL-2');
بفضل هذا ، أصبح التفاعل مع API من PHP أبسط وأكثر ملاءمة ، وتنتقل وثائق Jira الخاصة بك مباشرةً إلى الرمز ، مما يسمح لك باستخدام الإكمال التلقائي في IDE للعديد من الإجراءات القياسية.
لكن أول الأشياء أولا.
ميزات API واجهناها
عندما بدأنا في استخدام Jira API بنشاط ، كان متاحًا فقط من خلال بروتوكول SOAP. ظهر إصدار REST الخاص به لاحقًا ، وكنا من بين المستخدمين الأوائل. في ذلك الوقت ، كان هناك عدد قليل جدًا من عملاء REST المتوفرين للجمهور والمكتوبين بلغة PHP. كان من الصعب للغاية العثور على شيء يمكن دمجه بسهولة في قاعدة الكود الخاصة بنا ، والانتقال تدريجياً من SOAP إلى REST. لذلك لم يكن لدينا خيار: قررنا مواصلة تطوير عملائنا.
لذلك عشنا بسحب وإسقاط جميع أنواع الخارقة والعكازات من عميل SOAP واكتساب أخرى جديدة بسبب خصائص REST. نتيجة لذلك ، قمنا بتطوير بعض الفصول الجريئة للغاية مع مجموعة من التعليمات البرمجية المكررة ، وهناك حاجة إلى إزالة هذه الفوضى.
كانت الحقول المخصصة دائمًا هي المكان الأكثر إيلامًا بالنسبة لنا: لدينا أكثر من 300 منها (في وقت كتابة هذا المقال - 338) ، وهذا الرقم يتزايد ببطء.
رسائل خطأ غريبة
على مدار التاريخ الطويل للتفاعل مع API ، رأينا الكثير من الأشياء المختلفة. معظم رسائل الخطأ كافية ، ولكن هناك تلك التي يجب عليك إجهاد عقلك كثيرًا.
على سبيل المثال ، إذا تعرفت Jira فجأة على روبوت في المستخدم الخاص بك ، فستبدأ في إظهار كلمة التحقق الخاصة به. في هذه الحالة ، عند الوصول إلى واجهة برمجة التطبيقات (API) ، فإنه يتجاهل بشكل خجل رأس
قبول التشفير: application / json ويمنحك HTML. بطبيعة الحال ، قد لا يكون العميل الذي ينتظر JSON جاهزًا لهذا "الترحيب".
وهنا مثال على العمل مع حقل مخصص:

عندما تكتب رمزًا و "اختبار الآن" ، فأنت تختبره ، فمن السهل جدًا أن تفهم أن customfield_12664 هو
المطورون . وإذا كان مثل هذا الخطأ يتسلل في مكان ما على الإنتاج (على سبيل المثال ، لأن شخصًا ما غير التكوين وتغيير قائمة القيم المقبولة لحقل التحديد) ، فغالبًا ما تكون الطريقة الوحيدة لتحديد الحقل هي الدخول إلى جيرا ومعرفة الاسم من هناك. علاوة على ذلك ، في واجهته ، لا يتم عرض المعرفات - الأسماء فقط.
اتضح أنه عندما تريد معرفة اسم الحقل الذي أدى إلى الخطأ وتصحيح التكوين الخاص به ، يمكنك القيام بذلك إما من خلال طلب واجهة برمجة التطبيقات ، أو باستخدام بعض الطرق غير الواضحة الأخرى: البحث عن طريق الكود المصدري للصفحة ، وفتح الإعدادات لحقل تعسفي وتصحيح عنوان URL في شريط العناوين ، إلخ. لا يمكن تسمية هذه العملية بالراحة ، وفي كل مرة تستغرق هذه المهمة البسيطة وقتًا طويلاً.
لكن أسماء الحقول الغامضة لا تقتصر على المشكلات. إليك ما يبدو عليه التفاعل مع واجهة برمجة التطبيقات إذا ارتكبت خطأ في بنية البيانات لتحديث الحقل:


العديد من تنسيقات البيانات المختلفة
ولا تنس أن تحديث الحقول بأنواعها المختلفة يتطلب هياكل بيانات مختلفة.
$Jira->issue()->edit( 'SMPL-1', [ 'customfield_10200' => ['name' => 'denkoren'], 'customfield_10300' => ['value' => 'PHP'], 'customfield_10400' => [['value' => 'Android'], ['value' => 'iOS']], 'security' => ['id' => 100500], 'description' => 'Just text', ], );
إجابات API الخاصة بهم مختلفة بالطبع.
من الممكن أن تضع ذلك في الاعتبار فقط إذا كنت تعمل باستمرار مع واجهة برمجة تطبيقات Jira ولم تشتت انتباهك لفترة طويلة عن طريق حل المشاكل الأخرى. وإلا ، فإن هذه الميزات تنفد من الذاكرة في غضون أسبوعين. بالإضافة إلى ذلك ، تحتاج إلى تذكر نوع الحقل الذي تحتاجه من أجل "إطعام" بهيكلها الصحيح. عندما يكون لديك المئات من الحقول المخصصة ، فغالبًا ما يتعين عليك البحث في الكود عن المكان الذي كان لا يزال يستخدم فيه ، أو الصعود إلى لوحة المشرف Jira.
قبل أن نكتب عملائنا ، كان Stack Overflow و Atlassian Community أفضل أصدقائي فيما يتعلق بتحديث الحقول المخصصة. الآن يتم غوغل هذه المعلومات بسهولة وسرعة ، لكننا تحولنا إلى واجهة برمجة تطبيقات REST عندما كانت لا تزال جديدة إلى حد ما وتم تطويرها بنشاط: لقد استغرق الأمر عشر دقائق للعثور على طلب حليقة مناسب في Google ، ثم اضطررت إلى تحليل هذه المجموعة من الأقواس بعيونك وتحويلها في البنية الصحيحة لـ PHP ، والتي غالبًا ما لم تنجح في المحاولة الأولى.
بشكل عام ، التفاعل مع الحقول المخصصة هو العملية التي كانت إعادة التنظيم مطلوبة في المقام الأول.
ماذا يتكون العميل من؟
فئات للعمل مع الحقول المخصصة
بادئ ذي بدء ، أردنا التخلص من تذكر هياكل البيانات للتفاعل مع API والحصول على أسماء الحقول القابلة للقراءة عند حدوث أخطاء.
نتيجة لذلك ، أنشأنا تسلسل هرمي لفئة واحدة لجميع الحقول المخصصة. اتضح ثلاث طبقات:
- أصل مجردة مشترك للجميع: \ Badoo \ Jira \ CustomFields \ CustomField .
- حسب فئة الملخص لكل نوع من الحقول: SelectField أو UserField أو TextField ، إلخ.
- حسب الفصل لكل حقل محدد: على سبيل المثال ، المطور أو المراجع .
يمكن كتابة هذه الفئات بشكل مستقل ، أو يمكن إنشاؤها تلقائيًا باستخدام مولد سيناريو خاص (سنعود إليه).

بفضل هذه البنية ، من أجل تعليم الكود لتحديث قيمة الحقل المخصص الخاص بك من النوع
Select List (اختيار متعدد) ، يكفي إنشاء فئة PHP موروثة من
SelectField . في الواقع ، يتحول كل حقل Jira مخصص إلى ActiveRecord منتظم في كود PHP.
namespace \Example\CustomFields; class Developer extends \Badoo\Jira\CustomFields\SingleUserField { const ID = 'customfield_10200'; const NAME = 'Developer'; }
في نفس الفصل ، نقوم بتخزين معلومات حول الحقل: بشكل افتراضي ، هذا هو المعرف واسم الحقل وقائمة القيم المتاحة ، إذا كانت محدودة (على سبيل المثال ، في
خانة الاختيار والاختيار ).
أمثلة على الحقول في واجهة جيرا وفئتها المقابلة
class IssueFor extends \Badoo\Jira\CustomFields\SingleSelectField { const ID = 'customfield_10662'; const NAME = 'Issue for'; const VALUE_BI = 'BI'; const VALUE_C_C = 'C\C++'; const VALUE_HTML_CSS = 'HTML\CSS'; const VALUE_JS = 'JS'; const VALUE_OTHER = 'Other'; const VALUE_PHP = 'PHP'; const VALUE_TRANSLATION = 'Translation'; const VALUES = [ self::VALUE_BI, self::VALUE_C_C, self::VALUE_HTML_CSS, self::VALUE_JS, self::VALUE_OTHER, self::VALUE_PHP, self::VALUE_TRANSLATION, ]; public function getItemsList() : array { return static::VALUES; } }
اتضح أن هذا النوع من الوثائق مخصص لجيرا ، الموجود مباشرة في كود PHP. عندما تكون قريبة جدًا ، فهي مريحة جدًا وتسريع عملية التطوير بشكل كبير ، مع تقليل عدد الأخطاء.
بالإضافة إلى ذلك ، تصبح رسائل الخطأ أكثر وضوحًا: بدلاً من قول أي شيء ، تعطل
"customfield_12664" ، على سبيل المثال ، شيء مثل هذا:
Uncaught Badoo\Jira\Exception\CustomField: User 'asdkljfh' not found in Jira. Can't change 'Developer' field value.
فئات للعمل مع كائنات النظام
يحتوي Jira على الكثير من البيانات ذات بنية معقدة: على سبيل المثال ، حقل System and
Security system (نظام
الحالة والأمان) ، والروابط بين المهام ، والمستخدمين ، والإصدارات ، والمرفقات (الملفات).
نحن أيضا ملفوفة لهم في الفصول الدراسية:
هذه الأغلفة تمنح IDE الخاص بك القدرة على معرفة البيانات المتاحة وتتيح لك إضفاء الطابع الرسمي على واجهات الوظيفة في التعليمات البرمجية الخاصة بك. نحن نستخدم إعلانات الكتابة بنشاط ، حيث يسمح لنا دائمًا برؤية خطأ حتى أثناء كتابة التعليمات البرمجية بفضل تمييز IDE. وإذا كنت لا تزال تفوتك الخطأ ، فسيظهر بالضبط في المكان الذي ظهر فيه لأول مرة ، وليس المكان الذي أسقطت فيه الكود أخيرًا.
لا تزال هناك طرق ثابتة تسمح لك بالحصول على كائن بسرعة من خلال بعض المعايير:
$users = \Badoo\Jira\User::search('<pattern>');
تلتزم هذه الطرق بالقواعد العامة بحيث يسهل العثور عليها:
- :: search () ، إذا كنت بحاجة إلى العثور على كائنات حسب عدة مجالات: \ Badoo \ Jira \ Issue :: search () يبحث عن المهام باستخدام JQL ، حيث يمكنك تحديد العديد من معايير البحث ، و \ Badoo \ Jira \ User :: search () يبحث عن المستخدم في نفس الوقت عن طريق "الاسم" (تسجيل الدخول) ، و "البريد الإلكتروني" و "اسم العرض" (الاسم الذي يتم تقديمه على الويب) ؛
- :: by * () ، إذا كنت بحاجة إلى الحصول على الكائن ليس بمعرف ، ولكن وفقًا لمعايير أخرى: \ Badoo \ Jira \ User :: byEmail () يبحث عن مستخدم عن طريق عنوان بريده الإلكتروني ؛
- :: for * () يبحث عن كل الكائنات المرتبطة بشيء: \ Badoo \ Jira \ Version :: forProject
يعطي جميع الإصدارات من مشروع معين ؛ - :: fromStdClass () ستنشئ كائنًا من بيانات أولية لها بنية مناسبة ، لكن لم يتم تلقيها من واجهة برمجة التطبيقات ، ولكن ، على سبيل المثال ، من webhook : في نص طلب POST ، يرسل Jira JSON بمعلومات مختلفة حول الحدث ، بما في ذلك نص المهمة بما في ذلك جميع المجالات. بناءً على هذه البيانات ، يمكنك إنشاء كائن \ Badoo \ Jira \ Issue واستخدامه كالمعتاد.
فئة \ Badoo \ جيرا \ العدد
يبدو لي أن لقطة شاشة PhpStorm التالية بليغة في حد ذاتها:

في جوهر الأمر ، يربط كائن
\ Badoo \ Jira \ Issue كل ما هو موضح أعلاه في نظام واحد. يقوم بتخزين جميع المعلومات حول المهمة ، ولديه طرق للوصول السريع إلى البيانات الأكثر استخدامًا ، ونقل المهام بين الحالات ، إلخ.
لإنشاء كائن في أبسط الحالات ، يكفي معرفة مفتاح المهمة فقط.
إنشاء كائن مع مفتاح مهمة فقط في جيبك $Issue = new \Badoo\Jira\Issue('SMPL-1');
يمكنك أيضًا استخدام أي مجموعة بيانات مجزأة. على سبيل المثال ، تحتوي معلومات الارتباط بين المهام القادمة من واجهة برمجة التطبيقات على عدد قليل فقط من الحقول: المعرف والملخص والحالة والأولوية والإصدار.
\ Badoo \ Jira \ Issue يسمح لك بجمع كائن من هذه البيانات بحيث يمكن إرجاعها على الفور ، والباقي ، الوصول إلى API.
إنشاء كائن ، والتخزين المؤقت القيم لبعض الحقول $IssueFromLink = \Badoo\Jira\Issue::fromStdClass( $LinkInfo, [ 'id', 'key', 'summary', 'status', 'priority', 'issuetype', ] );
يتم تحقيق ذلك من خلال التهيئة البطيئة والتخزين المؤقت للبيانات في الكود. يعتبر هذا النهج مناسبًا بشكل خاص حيث يمكنك فقط تبادل كائنات
\ Badoo \ Jira \ Issue في التعليمات البرمجية الخاصة بك ، بغض النظر عن مجموعة الحقول التي تم إنشاؤها باستخدامها.
الحصول على بيانات المهمة المفقودة $IssueFromLink->getSummary();
كيف نذهب إلى APIفي Jira API ، من الممكن عدم الحصول على جميع الحقول لمهمة ، ولكن فقط الحقول المطلوبة حاليًا: على سبيل المثال ، المفتاح والملخص فقط. ومع ذلك ، نحن لا نذهب عمدا إلى جيرا لحقل واحد فقط في getter. في المثال أعلاه ، سيقوم getDescription () بتحديث المعلومات حول جميع الحقول في وقت واحد. نظرًا لأن
\ Badoo \ Jira \ Issue ليس لديه أدنى فكرة عما تحتاج إليه بعد ذلك ، فمن الأفضل الحصول على كل شيء من واجهة برمجة التطبيقات على الفور ، حيث ذهبنا إلى هناك على أي حال. نعم ، الاستعلام "الحصول على وصف فقط" والاستعلام "الحصول على جميع الحقول افتراضيًا" لبضع مئات من التذاكر يستغرق أوقاتًا مختلفة ، لكن بالنسبة لهذا الاختلاف ، لا يكون هذا ملحوظًا.
//Time for single field: 0.40271635055542 (second) //Time for all default fields: 0.84159119129181 (second)
من الأشكال ، من الواضح أنه عند تلقي ثلاثة حقول فقط (حقل واحد في الطلب) ، سيكون من الأفضل الحصول على كل شيء دفعة واحدة ، بدلاً من الذهاب إلى API لكل منها. في الواقع ، تعتمد نتيجة هذا القياس على تكوين Jira والخادم الذي يعمل عليه. من مهمة إلى مهمة ومن القياس إلى القياس ، تتغير الأرقام ، وتبين أن
الوقت لكل الحقول الافتراضية أقل بثلاثة من
الوقت للحقل الواحد ، وغالبًا ما يكون أقل من اثنين.
ومع ذلك ، عند العمل مع عدد كبير من المهام ، يمكن قياس الفرق بالثواني. لذلك ، عندما تعلم أنك تحتاج فقط إلى المفتاح والوصف لـ 500 تذكرة ، تظل القدرة على الحصول عليها مع استعلام واحد فعال في أساليب
\ Badoo \ Jira \ Issue :: search () و
\ Badoo \ Jira \ Issue :: byKeys () .
\ Badoo \ جيرا \ العدد - بشكل عام عن المهام في بعض الملخصات جيرا. لكن جيرا (مثل حقولنا) ليست مجردة - فهي تحتوي على مجموعة محددة للغاية من الحقول المخصصة وسير العمل الخاص بها. إنك تستخدم بعض الحقول والتحولات اللينة في كثير من الأحيان ، لذلك ليس من السهل للغاية ملاحقتها كل طريق طويل. لذلك ، يمكن تمديد
\ Badoo \ Jira \ Issue بسهولة بطرق خاصة به لتكوين Jira محدد.
مثال على امتداد الفئة بطريقة للحصول على حقل مخصص بسرعة namespace \Deploy; class Issue extends \Badoo\Jira\Issue {
قضية إنشاء طلب
إنشاء مهمة في جيرا هو إجراء معقد إلى حد ما. عند القيام بذلك من خلال واجهة الويب ، تظهر لك شاشة خاصة (إنشاء شاشة) مع مجموعة من الحقول. بعض منهم يمكنك ملء ببساطة لأنك تريد ، وبعضها علامة إلزامية. في الوقت نفسه ، يمكن أن تكون "إنشاء شاشة" فريدة لكل مشروع وحتى بالنسبة لأنواع مختلفة من المهام في مشروع واحد. لذلك هناك كل أنواع القيود على قيم الحقول وعلى إمكانية تعيين قيمة الحقل في عملية إنشاء المهمة.
الشيء الأكثر غير سارة للمطورين في هذا الموقف هو أن هذه القيود تنطبق على API. يحتوي الأخير على طلب خاص (
إنشاء meta متاح في واجهة برمجة تطبيقات REST منذ الإصدار 5.0) ، حيث يمكنك الحصول على قائمة بإعدادات الحقل المتاحة عند إنشاء مهمة. ومع ذلك ، فإن المطور الذي يحتاج إلى "مجرد عمل شيء بسيط الآن" لن يزعج هذا على الأرجح.
ونتيجة لذلك ، حدث مثل هذا: نظرًا لأن طلب إنشاء مهمة يمكن أن يكون كبيرًا جدًا ، فقد قمنا في كثير من الأحيان بإضافة البيانات إليه تدريجيًا ، وتلقينا خطأً عندما حاولنا إرسال كل شيء إلى Jira. بعد ذلك ، اضطررت إلى البحث في الكود عن جميع الأماكن التي تغير فيها شيء ما في الطلب ، ولمحاولة طويلة ومملة لفهم الخطأ الذي حدث بالضبط.
لذلك ، فعلنا
\ Badoo \ جيرا \ العدد \ CreateRequest . يسمح لك بمشاهدة الخطأ مسبقًا ، في المكان الذي تحاول فيه فعل شيء خاطئ: قم بإعطاء الحقل نوعًا من القيمة المنحنية أو قم بتغيير الحقل غير المتاح. على سبيل المثال ، إذا حاولت تحديد مكوّن غير موجود في المشروع ، فسوف يتعطل الاستثناء في المكان الذي قمت به فيه ، وليس في المكان الذي أرسلت فيه الطلب في النهاية إلى API.
تدفق العمل مع CreateRequest يبدو شيء مثل هذا $Request = new \Badoo\Jira\Issue\CreateRequest('DD', 'Task', $Client); $Request ->setSummary('summary') ->setDescription('description') ->setFieldValue('For QA', 'custom field with some comments for QA who will check the issue'); $Request->send();
العمل مع API مباشرة
تغطي مجموعة الفصول الموضحة أعلاه معظم الاحتياجات. ومع ذلك ، نحن ندرك جيدًا أن الأغلبية بعيدة عن كل شيء. لذلك ، لدينا أيضًا عميل صغير للعمل مع واجهة برمجة التطبيقات مباشرةً -
\ Badoo \ Jira \ REST \ Client .
حالة استخدام العملاء $Jira = \Badoo\Jira\REST\Client::instance(); $Jira->setJiraUrl('https://jira.example.com/'); $Jira->setAuth('user', 'password') $IssueInfo = $Jira->issue()->get('SMPL-1');
مولد فئة للحقول المخصصة
لجعل العمل مع الحقول المخصصة مناسبًا ، يجب أن يكون لكل حقل فئة خاصة به في التعليمات البرمجية. لقد أنشأناها يدويًا حسب الحاجة ، ولكن قبل نشر العميل ، قررنا أن هذا النهج قد لا يكون مناسبًا للغاية للمستخدمين الجدد. لذلك ، أنشأنا مولدًا خاصًا يمكنه الانتقال إلى واجهة برمجة التطبيقات لـ Jira للحصول على قائمة بالحقول المخصصة وإنشاء فئات قوالب لأنواع الحقول المعروفة.
نعتقد أنه بالنسبة لمعظم المهام ، يكفي استخدام
بن / إنشاء برنامج نصي CLI من مستودعنا. يمكنك أن تطلب منه أن يقول عن نفسه من خلال خيار
--hel / /h :
./bin/generate --help
في أبسط الحالات ، يكفي إنشاء عنوان URL لـ Jira الخاص بك والمستخدم وكلمة المرور الخاصة به ومساحة الاسم للفئات والدليل حيث تضع الكود:
./bin/generate -u user -p password --jira-url https://jira.mlan --target-dir custom-fields --namespace CustomFields
قمنا أيضًا بتطبيق القدرة على إضافة القوالب الخاصة بنا وإنشاء فصول للحقول الفردية. يمكن العثور على هذا في
الوثائق .
استنتاج
نحن نحب ما حصلنا عليه. من خلال هذا المفهوم - الفصول الخاصة بنا للحقول المخصصة والأغلفة للحالات والإصدارات والمستخدمين ، وما إلى ذلك - كنا نعيش لأكثر من عام ونشعر بالراحة. قبل نشر الشفرة ، قمنا حتى بتوسيع الوظيفة وإضافة أشياء رائعة لم تصل إلى يديك لفترة طويلة لاستخدام العميل كان أكثر ملاءمة: على سبيل المثال ، أضفنا القدرة على تحديث العديد من الحقول في Issue في طلب واحد وكتبنا مولدًا للفئة للحقول المخصصة.
في رأينا ، لقد كان الأمر جيدًا ، والذي يجب بالتأكيد الشعور به لفهم ما إذا كان يناسب مهامك ومتطلباتك. تحت لنا - مناسبا فقط.
الرابط مرة أخرى:
github.com/badoo/jira-client .
شكرا لك على القراءة حتى النهاية. نأمل أن يستفيد هذا الرمز ويوفر الوقت ليس فقط لنا.