تخصيص Jira لاحتياجاتك. تدفق مثالي وتذكرة مثالية



إذا كنت تعمل في شركة تكنولوجيا معلومات ، فمن المرجح أن تكون عملياتك مبنية حول منتج Atlassian المعروف - Jira. هناك العديد من متتبعات المهام في السوق لحل نفس المشاكل ، بما في ذلك الحلول مفتوحة المصدر (Trac ، Redmine ، Bugzilla) ، ولكن ربما Jira هي الأكثر استخدامًا اليوم.

اسمي دميتري سيمينخين ، أنا قائد فريق في Badoo. في سلسلة قصيرة من المقالات ، سأخبرك بالضبط كيف نستخدم Jira ، وكيف قمنا بتخصيصها لعملياتنا ، وما هي الأشياء الجيدة التي "تم ثنيها" في الأعلى ، وبالتالي ، كيف قمنا بتحويل أداة تتبع المشكلات إلى مركز اتصال واحد للمهمة وتبسيط حياتنا. في هذه المقالة ، سترى تدفقنا في الداخل ، وتعلم كيف يمكنك "تحريف" Jira الخاص بك ، وقراءة حول الميزات الإضافية للأداة التي قد لا تعرفها.

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

ميزات إضافية لجيرا


لجعل النص التالي أكثر قابلية للفهم ، دعنا نتعرف على الأدوات التي توفرها لنا Jira لتنفيذ قائمة الرغبات غير القياسية - تلك التي تتجاوز وظائف Jira القياسية.

REST API


بشكل عام ، استدعاء أمر API هو طلب HTTP لعنوان URL لواجهة برمجة التطبيقات يشير إلى الطريقة (GET و PUT و POST و DELETE) والأمر ونص الطلب. نص الطلب ، بالإضافة إلى استجابة API ، بتنسيق JSON. مثال على طلب يعرض تمثيل JSON لتذكرة:

GET /rest/api/latest/issue/{ticket_number} 

باستخدام واجهة برمجة التطبيقات ، يمكنك استخدام البرامج النصية بأي لغة برمجة:

  • إنشاء تذاكر ؛
  • تعديل أي خصائص للتذاكر (مدمجة ومخصصة) ؛
  • كتابة التعليقات ؛
  • استخدام JQL (لغة الاستعلام المدمجة) لتلقي أي قوائم تذاكر ؛
  • وغير ذلك الكثير.

وثائق مفصلة API متاحة هنا .

لقد كتبنا عميل Jira API عالي المستوى الخاص بنا في PHP ، والذي ينفذ جميع الأوامر التي نحتاجها. فيما يلي مثال لأوامر التعامل مع التعليقات:

 public function addComment($issue_key, $comment) {  return $this->_post("issue/{$issue_key}/comment", ['body' => $comment]); } public function updateComment($issue_key, $comment_id, $new_text) {  return $this->_put("issue/{$issue_key}/comment/{$comment_id}", ['body' => $new_text]); } public function deleteComment($issue_key, $comment_id) {  return $this->_delete("issue/{$issue_key}/comment/{$comment_id}"); } 

Webhooks


باستخدام الرد التلقائي على الويب ، يمكنك تكوين استدعاء وظيفة رد اتصال خارجية على مضيفك لمختلف الأحداث في جيرا. في الوقت نفسه ، يمكنك تكوين أي عدد تريده من القواعد حتى "تختنق" عناوين URL المختلفة لأحداث مختلفة ولتذاكر تتطابق مع الفلتر المحدد في الرد التلقائي على الويب. واجهة تكوين الخطافات الإلكترونية متاحة لمسؤول Jira.

ونتيجة لذلك ، يمكنك إنشاء قواعد مثل هذا:

الاسم : "SRV - تم إنشاء / تحديث ميزة جديدة"
URL : www.myremoteapp.com/webhookreceiver
النطاق : المشروع = SRV واكتب ("ميزة جديدة")
الأحداث : تم تحديث المشكلة ، تم إنشاء المشكلة

في هذا المثال ، سيتم استدعاء عنوان URL المحدد لإنشاء تذكرة وتغيير الأحداث المقابلة لمرشح النطاق . في الوقت نفسه ، سيحتوي نص الطلب على جميع المعلومات الضرورية حول ما تم تغييره بالضبط والحدث الذي حدث.

من المهم أن تفهم أن Jira لا تضمن تسليم الحدث الخاص بك. إذا لم يستجب عنوان URL الخارجي أو تم الرد عليه بخطأ ، فلن يكون هذا مرئيًا في أي مكان (ربما باستثناء السجلات). لذلك ، يجب أن يكون معالج أحداث webhook موثوقًا به قدر الإمكان. على سبيل المثال ، يمكنك وضع قائمة انتظار الأحداث ومحاولة معالجتها حتى تنجح. سيساعد هذا في حل المشكلات المتعلقة بالخدمات غير المتاحة مؤقتًا ، على سبيل المثال ، أي قاعدة بيانات خارجية ضرورية للمعالجة الصحيحة للحدث.

وثائق مفصلة على الخطافات الإلكترونية متاحة هنا .

Scriptrunner


هذا هو البرنامج المساعد لـ Jira ، وهي أداة قوية للغاية تسمح لك بتخصيص الكثير من Jira (بما في ذلك القدرة على استبدال webhooks). يتطلب استخدام هذا البرنامج المساعد معرفة Groovy. الميزة الرئيسية للأداة بالنسبة لنا هي أنه يمكنك تضمين منطق مخصص في التدفق عبر الإنترنت. سيتم تنفيذ كود البرنامج النصي الخاص بك على الفور في بيئة Jira استجابة لإجراء محدد. على سبيل المثال ، يمكنك إنشاء الزر الخاص بك في واجهة التذكرة ، والنقر فوقها سيؤدي إلى إنشاء تذاكر مرتبطة بالمهمة الحالية أو تشغيل اختبارات الوحدة لهذه المهمة. وإذا حدث خطأ بشكل مفاجئ ، فستعرف كمستخدم على الفور الأمر.

يمكن للمهتمين قراءة الوثائق .

التدفق: ما هو مخفي تحت غطاء محرك السيارة


والآن حول كيفية تطبيق الميزات الإضافية لـ Jira في مشاريعنا. ضع في اعتبارك هذا في سياق المرور عبر تذكرة التدفق النموذجية من الإنشاء إلى الإغلاق. في نفس الوقت سأخبرك عن التدفق نفسه.

فتح / تراكم


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

Project = SRV AND assignee is EMPTY AND status in (Open)

قيد التقدم


الفروق الفنية في العمل مع Git
وتجدر الإشارة إلى أننا نعمل على كل مهمة في فرع Git منفصل. بالنسبة لهذا ، لدينا اتفاق على أن اسم الفرع في البداية يجب أن يحتوي على رقم التذكرة. على سبيل المثال ، SRV-123_new_super_feature . أيضًا ، يجب أن تحتوي تعليقات كل التزام في الفرع على رقم التذكرة بتنسيق [SRV-123]: {comment}. نحن بحاجة إلى مثل هذا التنسيق ، على سبيل المثال ، للإزالة الصحيحة لمهمة "سيئة" من البناء. يتم وصف كيفية القيام بذلك بالتفصيل في المقالة .

يتم التحكم في هذه المتطلبات بواسطة خطافات Git. على سبيل المثال ، إليك محتويات Prepar-الالتزام-msg ، التي تعد تعليقًا على الالتزام ، وتحصل على رقم التذكرة من اسم الفرع الحالي:

 #!/bin/bash b=`git symbolic-ref HEAD| sed -e 's|^refs/heads/||' | sed -e 's|_.*||'` c=`cat $1` if [ -n "$b" ] && [[ "$c" != "[$b]:"* ]] then echo "[$b]: $c" > $1 fi 

إذا حاولت دفع التزام بتعليق "غير صحيح" ، فسيتم رفض هذه الدفعة. كما سيتم رفض محاولة بدء فرع بدون رقم تذكرة في البداية.

عندما تضرب التذكرة المطور ، فإن أول شيء يتفكك فيه. نتيجة التحلل هي فكرة المطور حول كيفية حل المشكلة والمدة التي سيستغرقها الحل. بعد توضيح جميع التفاصيل الرئيسية ، يتم نقل التذكرة إلى الحالة قيد التقدم ، ويبدأ المطور في كتابة الرمز.

من المعتاد بالنسبة لنا تحديد تاريخ الاستحقاق للمهمة في الوقت الذي يتم فيه نقلها إلى حالة قيد التقدم. إذا لم يقم المطور بذلك ، فسوف يتلقى تذكيرًا في برنامج Messenger للشركات. نص خاص كل ساعتين:

  • باستخدام Jira REST API يختار التذاكر قيد التقدم مع حقل تاريخ الاستحقاق الفارغ ( المشروع = SRV AND status = 'In Progress' AND duedate is EMPTY ) ؛
  • يختار تذاكر غير مكتملة مع تاريخ استحقاق أقدم من التاريخ الحالي ( المشروع = SRV و status = "قيد التقدم" و Duedate ليس فارغًا و duedate <now () ) ؛
  • يتعرف على مطور كل تذكرة من خلال قراءة الحقل المقابل في التذكرة ، بالإضافة إلى دليل المطور ؛
  • يقوم بتجميع التذاكر بواسطة المطورين ويؤدي ويرسل رسائل تذكير إلى HipChat باستخدام واجهة برمجة التطبيقات الخاصة به.

بعد أن قام بجميع الالتزامات الضرورية ، دفع المطور الفرع إلى اللفت المشترك. في هذه الحالة ، يشعل خطاف Git بعد الاستلام ، والذي يقوم بالكثير من الأشياء المثيرة للاهتمام:

  • يتم التحقق من اسم فرع Git ، بالإضافة إلى التعليقات على الالتزامات ، للتأكد من توافقها مع قواعدنا ؛
  • يتم التحقق من أن التذكرة التي يرتبط بها الفرع ليست مغلقة (لا يمكنك دفع رمز جديد إلى تذاكر مغلقة) ؛
  • يتم التحقق من بنية ملفات PHP المعدلة (PHP -l file_name.php ) ؛
  • يتم فحص التنسيق ؛
  • إذا كانت التذكرة التي تم دفع الفرع إليها هي الحالة المفتوحة ، فسيتم تحويلها تلقائيًا إلى الحالة قيد التقدم ؛
  • يتم إرفاق التذكرة بالفرع ، ويتم الإدخال المقابل في الحقل المخصص لتذكرة Commits باستخدام واجهة برمجة تطبيقات Jira. يبدو هذا:


(يمثل الفرع الفرعي رابطًا لفروع الفرع برأسه نشأ الفرع الحالي في أداة مراجعة كود Codeisok الخاصة بنا) ؛

  • يتم إنشاء تعليق في التذكرة مع جميع الالتزامات في هذه الدفعة.

    (عايدة هو الاسم الشرطي لمجمع الأتمتة لدينا للعمل مع Jira و Git وليس فقط. ومن هذا الاسم تظهر التعليقات التلقائية في التذكرة. لقد كتبنا المزيد عن Aida في المقالة ).
    يختلف النقر على تجزئة فتح التنفيذ باختلاف المراجعة السابقة للفرع (سأوضح أدناه كيف يبدو) ؛
  • يقوم بالتحقق مما إذا كانت هناك ملفات في الفرع قد تتطلب الترجمة إلى اللغات المدعومة (على سبيل المثال ، قوالب صفحة الويب) ، وإذا كانت هناك أي ملفات ، يتم تعيين القيمة الجديدة \ Changed على الحقل المخصص لتذكرة Lexems. هذا يضمن أن التذكرة لن تذهب إلى الإنتاج بدون ترجمة كاملة ؛
  • تتم إضافة اسم الموظف الذي يدفع الفرع إلى قائمة المطورين (حقل مخصص لبطاقة المطورين )

قيد المراجعة


بعد كتابة الرمز والتأكد من استيفاء جميع متطلبات المهمة وعدم الإخلال بالاختبارات ، يعين المطور تذكرة للمراجع (حالة المراجعة ). عادة ، يقرر المطور من سيراجع تذكرته. على الأرجح ، سيكون مطورًا آخر على دراية جيدة بالجزء الصحيح من الشفرة. تتم المراجعة باستخدام أداة Codeisok ، التي تفتح على الفور مع الاختلاف المطلوب عن طريق النقر على رابط الفرع الفرعي في حقل تذكرة Commits أو في التعليق كتجزئة تجزئة في التعليقات.

يرى المراجع شيئًا مثل هذا:


بعد الانتهاء من المراجعة ، يضغط المراجع على زر إنهاء ، ومن بين أشياء أخرى ، يحدث في هذه اللحظة ما يلي:

  • باستخدام واجهة برمجة تطبيقات JIra ، يتم إنشاء تعليق في التذكرة مع تعليقات من المراجع في سياق الرمز. يبدو شيء مثل هذا:


  • إذا كانت هناك أي تعليقات على الرمز وقرر المراجع إعادة فتح التذكرة ، فسيتلقى المطور إشعارًا بذلك في HipChat (يتم ذلك باستخدام قاعدة webhook التي تعمل على إعادة الفتح) ؛
  • يتم ملء حقل تذكرة المراجعين .

تم الحل


علاوة على ذلك ، إذا نجحت المراجعة ، يتم إرسال التذكرة إلى تراكم مهندسي ضمان الجودة في الحالة التي تم حلها . ولكن في الوقت نفسه ، باستخدام الرد التلقائي على الويب للحدث الذي تم حله ، يتم تشغيل الاختبارات التلقائية على رمز الفرع في الخلفية. بعد بضع دقائق ، سيظهر تعليق جديد في التذكرة ، سيبلغك بنتائج الاختبار.



أيضًا ، في أي وقت ، يمكنك بدء تشغيل اختبار متكرر يدويًا عن طريق النقر على زر اختبارات وحدة التشغيل الخاصة في قائمة التذاكر. بعد التشغيل الناجح ، سيظهر تعليق جديد في التذكرة ، على غرار التعليق السابق.


في الواقع ، هذا الزر هو أحد حالات المهام الإضافية في سير عمل Jira ، وهي ترجمة تقوم بتشغيل نص Groovy للمكوّن الإضافي ScriptRunner. يستدعي البرنامج النصي عنوان URL خارجيًا ، والذي يبدأ التشغيل التجريبي ، وإذا استجاب عنوان URL بنجاح ، فستعود التذكرة إلى حالتها السابقة (في حالتنا ، تم الحل ).

في اللقطة / في اللقطة - حسنا


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

يتم الوصول إلى موارد اللقطة باستخدام عناوين URL الخاصة التي يتم إنشاؤها في البرنامج النصي لإنشاء اللقطة ويتم وضعها في رأس التذكرة باستخدام Jira API. ونتيجة لذلك ، نرى روابط إلى الموقع ولوحة الإدارة والسجلات والأدوات الأخرى التي يتم تنفيذها في بيئة التصوير:



أيضًا ، في وقت إنشاء اللقطة ، يتم تشغيل برنامج نصي يحلل محتويات الملفات التي تم تغييرها وينشئ طلبات لترجمة الرموز المميزة الجديدة التي تم العثور عليها. بعد اكتمال الترجمة ، يتم تغيير قيمة حقل Lexems إلى Done ويمكن إضافة التذكرة إلى التصميم .

إذا نجح الاختبار في اللقطة ، فسيتم تحويل التذكرة إلى الحالة In Shot - OK.

في البناء / في البناء - حسنا


نقوم بتحميل الرمز مرتين في اليوم - في الصباح وفي المساء. للقيام بذلك ، يتم إنشاء فرع بناء خاص ، والذي سيتم دمجه في النهاية مع سيد ووضعه في "المعركة".

في وقت بناء فرع البناء ، يتلقى نص برمجي خاص يستخدم استعلام JQL قائمة بالتذاكر في حالة In Shot - OK ويحاول تجميدها في فرع البناء عند استيفاء جميع الشروط التالية:

  • اكتملت ترجمة التذكرة أو لا حاجة إلى ترجمة أي شيء ( Lexems in ('No'، 'Done') ) ؛
  • المطور موجود في مكان العمل (يتحقق نظام الدمج التلقائي من القاعدة الداخلية سواء كان المطور في إجازة أو في إجازة مرضية ، وإذا كان الأمر كذلك ، فلا يمكن تجميد التذكرة يدويًا إلا من قبل مهندسي الإصدار أو مطور آخر مسؤول ، وهو ما يشار إليه في الحقل الخاص نائب المطور ؛ يتلقى قائد المطور الغائب في هذه الحالة إشعارًا بأنه لا يمكن إضافة التذكرة تلقائيًا إلى البنية) ؛
  • لا تحتوي البطاقة على علامة Up in Build التي تم تعيينها من قبل Developer (هذا حقل مخصص خاص للتذكرة يسمح للمطور بتحديد متى ستذهب التذكرة إلى البنية ) ؛
  • لا يعتمد فرع التذاكر على فرع آخر لم يصل بعد إلى الرئيسي أو المبنى الحالي. نحن نبذل قصارى جهدنا لتجنب مثل هذا الموقف ، ولكن يحدث هذا في بعض الأحيان عندما يقوم المطور بإنشاء فرع خاص به ليس من سيد ، ولكن من فرع من تذكرة أخرى ، أو عندما يجمد فرعًا آخر لنفسه. يمكن القيام بذلك أيضًا عن طريق الصدفة ، لذلك قررنا أن الحماية الإضافية لن تضر.

تجدر الإشارة إلى أن الدمج التلقائي قد لا يحدث بسبب تعارض الدمج. في هذه الحالة ، يتم نقل التذكرة تلقائيًا إلى حالة إعادة الفتح وتعيينها للمطور ، حيث يتلقى إشعارًا على الفور في HipChat ، وتتم إضافة رسالة مقابلة إلى تعليق التذكرة. بعد حل النزاع ، تعود التذكرة إلى المبنى.

إذا كان كل شيء على ما يرام وتم تجميد فرع التذكرة في البناء ، يتم نقل التذكرة تلقائيًا إلى حالة In Build ، ويتم كتابة اسم البناء في الحقل المخصص لتذكرة Build_Name .


علاوة على ذلك ، باستخدام هذه القيمة ، من السهل الحصول على قائمة التذاكر التي تم نشرها مع كل بناء. على سبيل المثال ، للبحث عن شخص ما لإلقاء اللوم إذا حدث خطأ ما.

في المرحلة التالية ، يقوم مهندسو QA أيضًا بالتحقق مما إذا كان رمز المهمة يعمل بشكل صحيح جنبًا إلى جنب مع المهام الأخرى في البناء. إذا كان كل شيء على ما يرام ، يتم تعيين التذكرة يدويًا على In Build - OK.

عن الإنتاج / الإنتاج - موافق / مغلق


علاوة على ذلك ، في البناء ، يتم تشغيل مجموعة الاختبارات الكاملة لدينا (الوحدة ، والتكامل ، والسيلينيوم ، وما إلى ذلك). إذا كان كل شيء على ما يرام ، يتم تجميد البناء بشكل رئيسي ، ويتم وضع الرمز للإنتاج. يتم تحويل التذكرة إلى حالة الإنتاج.

علاوة على ذلك ، يتأكد المطور (أو العميل) من أن الميزة تعمل بشكل صحيح عند الإنتاج ، وتعين حالة التذكرة عند الإنتاج - موافق.

بعد أسبوعين ، يتم تلقائيًا تحويل التذاكر في حالة الإنتاج - موافق إلى الحالة المغلقة ، إذا لم يقم شخص ما بذلك يدويًا من قبل.

تجدر الإشارة أيضًا إلى الحالات الإضافية التي قد توجد فيها التذكرة:

  • المتطلبات - عندما لا يكون من الممكن الحصول بسرعة من العميل على التوضيحات اللازمة للمهمة ، ومن دونهم لا يمكن مواصلة العمل على التذكرة ، يتم نقل التذكرة إلى هذه الحالة وتعيينها لمن يحتاج إلى تقديم توضيحات
  • معلق - إذا تم تعليق عمل التذكرة ، على سبيل المثال ، إذا تم حظر المطور من قبل مهام فريق مجاور أو تم إجباره على التبديل إلى مهمة أكثر إلحاحًا ؛
  • إعادة فتح - يمكن إعادة اكتشاف مهمة للمطور بعد مراجعة ، بعد الاختبار ، بعد محاولة فاشلة لدمج فرع مع رئيسي.

ونتيجة لذلك ، يبدو الرسم البياني المبسط لسير العمل لدينا كما يلي:


تذكرة - مركز اتصالات للمهمة


نتيجة لتمرير التذكرة من خلال التدفق ، يكتسب رأسها النموذج التالي تقريبًا:



ما هو المثير للاهتمام هنا الذي خصصناه لأنفسنا والذي لم أذكره بعد؟

  • مكون - يستخدم لتجميع تذكرة داخل قسم كبير. المجموعات الفرعية المختلفة هي المسؤولة عن المكونات المختلفة ، وبالتالي ، في لوحات العدادات الخاصة بهم ، يرون المهام الخاصة بمكوناتهم فقط. على سبيل المثال ، يمكنني سرد ​​كافة الأخطاء المفتوحة لمكونات فريقي باستخدام هذا الاستعلام:

     Project = SRV AND type = Bug AND status = Open AND component in componentsLeadByUser(d.semenihin) 

  • مراجعة - ما إذا كانت مراجعة الرمز مطلوبة. مطلوب الافتراضي. إذا تم تعيين قيمة الحقل على لا ، ستحصل التذكرة على الفور على الحالة التي تم حلها.

    QA - هل يحتاج المختبر إلى التحقق. مطلوب الافتراضي. إذا تم تعيين قيمة الحقل على لا ، ستنتقل التذكرة على الفور إلى حالة In Shot - OK.

    Sprint - في حالتنا ، تكون ذات صلة فقط بالمهام ذات نوع الميزة الجديدة ، وهي الخطة التي نرسمها مسبقًا لمدة أسبوع.
  • تاريخ الاستحقاق - يحدد المطور التاريخ الذي ستكون فيه التذكرة قيد الإنتاج. عرضت قبل بدء العمل في المهمة.
  • الموقف - في الواقع ، سجل قصير مع وصف موجز للحالة الحالية للمهمة. على سبيل المثال ، "20/08 أنا في انتظار الترجمات" ، "21/08 مطلوب توضيح من العميل بشأن المشكلة X" . يساعد هذا في رؤية ملخص موجز للمهمة في قائمة المهام الأخرى.
  • Msg4QA - معلومات لمهندسي ضمان الجودة ، والتي يشاركها المطور لتبسيط عملية الاختبار

نحاول إجراء مناقشة للقضايا المثيرة للجدل مع مدير المهمة في تعليقات التذكرة ، وليس "تشويه" توضيحات مهمة عن طريق البريد والمراسلة الفورية. ومع ذلك ، إذا جرت المناقشة "على الجانب" ، فمن المستحسن للغاية نسخ ما وافقت عليه في التذكرة.

بالإضافة إلى النصوص "البشرية" ، كما ذكرت أعلاه ، تتم كتابة الكثير من الأشياء تلقائيًا في تعليق باستخدام واجهة برمجة التطبيقات:

  • يرتكب
  • مراجعة النتائج ؛
  • نتائج تشغيل الاختبار.

في بعض الأحيان يمكن أن تتداخل التعليقات التلقائية ، على سبيل المثال ، مع مديري المنتجات. لذلك ، قمنا بعمل نص JS بسيط يضيف زرًا إلى واجهة Jira ويسمح لك بتقليل جميع التعليقات التلقائية ، مع ترك التعليقات البشرية فقط. ونتيجة لذلك ، تبدو التعليقات التلقائية المصغرة مدمجة.



كود شبيبة البرنامج النصي الذي قمنا بتضمينه في قالب التذكرة
 window.addEventListener('load', () => {   const $ = window.jQuery;   const botsAttrMatch = [       'aida',       'itops.api'   ].map(bot => `[rel="${bot}"]`).join(',');   if (!$) {       return;   }   const AIDA_COLLAPSE_KEY = 'aida-collapsed';   const COMMENT_SELECTOR = '.issue-data-block.activity-comment.twixi-block';   const JiraImprovements = {       init() {           this.addButtons();           this.handleAidaCollapsing();           this.handleCommentExpansion();           // Handle toggle button and aida collapsing and put it on a loop           // to handle unexpected JIRA behaviour           const self = this;           setInterval(function () {               self.addButtons();               self.handleAidaCollapsing();           }, 2000);           addCss(`               #badoo-toggle-bots {                   background: #fff2c9;                   color: #594300;                   border-radius: 0 3px 0 0;                   margin-top: 3px;                   display: inline-block;               }           `);       },       addButtons() {           // Do we already have the button?           if ($('#badoo-toggle-bots').length > 0) {               return;           }           // const headerOps = $('ul#opsbar-opsbar-operations');           const jiraHeader = $('#issue-tabs');           // Only add it in ticket state           if (jiraHeader.length > 0) {               const li = $('<a id="badoo-toggle-bots" class="aui-button aui-button-primary aui-style" href="/">Collapse Bots</a>');               li.on('click', this.toggleAidaCollapsing.bind(this));               jiraHeader.append(li);           }       },       toggleAidaCollapsing(e) {           e.preventDefault();           const isCollapsed = localStorage.getItem(AIDA_COLLAPSE_KEY) === 'true';           localStorage.setItem(AIDA_COLLAPSE_KEY, !isCollapsed);           this.handleAidaCollapsing();       },       handleAidaCollapsing() {           const isCollapsed = localStorage.getItem(AIDA_COLLAPSE_KEY) === 'true';           const aidaComments = $(COMMENT_SELECTOR).has(botsAttrMatch).not('.manual-toggle');           if (isCollapsed) {               aidaComments.removeClass('expanded').addClass('collapsed');               $('#badoo-toggle-bots').text('Show Bots');           }           else {               aidaComments.removeClass('collapsed').addClass('expanded');               $('#badoo-toggle-bots').text('Collapse Bots');           }       },       handleCommentExpansion() {           $(document.body).delegate('a.collapsed-comments', 'click', function () {               const self = this; // eslint-disable-line no-invalid-this               let triesLeft = 100;               const interval = setInterval(() => {                   if (--triesLeft < 0 || self.offsetHeight === 0) {                       clearInterval(interval);                   }                   // Element has been removed from DOM. ie new jira comments have been added                   if (self.offsetHeight === 0) {                       JiraImprovements.handleAidaCollapsing();                   }               }, 100);           });           $(document.body).delegate(COMMENT_SELECTOR, 'click', function () {               $(this).addClass('manual-toggle');// eslint-disable-line no-invalid-this           });       }   };   JiraImprovements.init();   function addCss(cssText) {       const style = document.createElement('style');       style.type = 'text/css';       if (style.styleSheet) {           style.styleSheet.cssText = cssText;       }       else {           style.appendChild(document.createTextNode(cssText));       }       document.head.appendChild(style);   } }); 


ماذا ايضا؟


API webhooks Jira :

  • HipChat, - ( );
  • HipChat ( , );
  • ( ) ( ; );
  • ; , ;
  • In progress ;
  • , «» (, On Review), ;
  • , Jira (, «d.semenihin (Day off)»). .

الملخص


Jira — , , . , , . Jira , .

— . Jira , Jira. , - .

شكرا لكم على اهتمامكم!

Source: https://habr.com/ru/post/ar424655/


All Articles