كيف نستخدم لغة Jira Query في الممارسة

مرحبا جميعا!



اسمي سيرجي راكوف ، وأنا رئيس قسم B2G في Rostelecom IT. أريد أن أخبركم عن لغة Jira Query (JQL): كيفية استخدامها في الممارسة العملية ، والتقنيات الأساسية ، وما هي المشاكل التي واجهناها وكيف حلناها.



صورة الصورة الأصلية مأخوذة من deviniti.com/atlassian



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



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



ولكن تظهر مشكلة عندما تحتاج إلى تجاوز الاستعلامات الأساسية. على سبيل المثال ، إذا أردنا العثور على المهام التي سبق أن تم إجراؤها على مؤدٍ معين ، أو البحث عن جميع المهام ، باستثناء مشروع واحد. لم يعد من الممكن إجراء اختيار صعب لمشروع ذي حالة مهمة ومنفذ واحد ومنفذ آخر وحالة مهمة أخرى باستخدام البحث الأساسي.



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



كل ما تحتاج إلى معرفته للعمل مع JQL هو أسماء الحقول التي سنختار بواسطتها التذاكر والمشغلين ( = ،! = ، <،> ، في ، ليس في ، كان ، هو ، وما إلى ذلك) ، الكلمات الرئيسية ( و و OR و NOT و EMPTY و ORDER BY وما إلى ذلك) والوظائف المتوفرة خارج الصندوق في الوضع المتقدم ( Now () و CurrentUser () و IssueHistory () و EndOfDay () وغيرها).



مجالات



Jira ، عندما تكتب في شريط البحث ، يعطي نفسه تلميحات لجميع القيم الممكنة التي تبحث عنها: حسب الحقول وقيم هذه الحقول. بالنسبة لي ، اكتشفت مؤخرًا مجال نظام مثير للاهتمام تم عرضه مؤخرًا . جيرا تتعقب وجهات نظر تذكرتك.

صورة

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



يوجد مرشح قياسي تم عرضه مؤخرًا. يستخدم الدالة IssueHistory () ، ويتم الفرز أيضًا بواسطة الحقل lastViewed . النتيجة هي نفسها ، لكن الطريقة ، حتى في Jira ، يمكن استخدامها بشكل مختلف. من الجدير بالذكر أن حقلي LastViewed و IssueHistory () يعيدان محفوظات الاستعراض فقط - لا يمكنك عرض محفوظات الأطراف الثالثة بهذه الطريقة.



صورة

بالنسبة للجزء الأكبر ، لدى Jira عوامل تشغيل قياسية. المشغلون المفضلون لدي هم WAS ، WAS IN ، WAS NOT IN ، WAS NOT ، تغيرت لأنها تعمل مع الوقت. هذا غير ممكن في قواعد البيانات التقليدية.



صورة



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



ومع ذلك ، هناك تحذير واحد: لا يخزن Jira محفوظات الحقول النصية: أسماء التذاكر وأوصافها. لا يمكنك أن تكتب هناك: " أحضر لي التذاكر حيث احتوى حقل الملخص على كلمة" Rostelecom " ".



المثال الثاني مع عامل التشغيل CHANGED . نود استلام التذاكر التي تم فيها تغيير المنفذ بعد 1 يناير 2020. يمكنك استخدام كلمات إضافية أخرى ، على سبيل المثال ، قبل أو علامات> ، <، لأنها أكثر ملاءمة لأي شخص ، وتاريخ محدد. في نفس المثال ، يمكنك أيضًا إجراء نفي ومعرفة أي التذاكر التي تم تعليقها على المستخدمين: لم يتم تغيير المتنازل بعد '2020-01-01' .



الكلمات الدالة



صورة

الكلمات الرئيسية الرئيسية هي OR ، AND ، NOT . إنهم يعملون بنفس طريقة العوامل المنطقية. باستخدام OR ، نحصل على مجموعة كاملة من التذاكر من مشروعين A و B. إذا احتجنا إلى تضييق نطاق الاختيار ، فإننا نستخدم AND . مثال - نحتاج إلى تذاكر من المسودة أ ، حيث كان المستخدم ينفذ السرير و: المشروع = أ = السرير والمكلف به . نفس الشيء مع الإنكار.



المهام



وفقًا للوثائق ، هناك 47 وظيفة في Jira ، لكنني لم أستخدمها جميعًا مطلقًا. فيما يلي عدد قليل ، في رأيي ، أهمها:



صورة



الآن () وظيفة شائعة تتيح لك العثور على التذاكر التي انتهت صلاحيتها ، على سبيل المثال.



يسترجع currentUser () المستخدم الحالي. يحتوي Jira على عوامل تصفية مُعدة مسبقًا تستخدم هذه الميزة. باستخدام currentUser () ، يمكنك إجراء عمليات بحث عامة. هذه هي الطريقة التي صنعت بها لوحة تحكم عالمية لفريق التطوير بأكمله: لقد قمت بحشو الأدوات على لوحة القيادة وأشرت إلى currentUser () بدلاً من مستخدم معين في كل منها . ستكون لوحة التحكم فريدة لكل مستخدم قام بتسجيل الدخول ، على الرغم من أن التكوين سيكون هو نفسه.



unreleasedVersions () هي وظيفة تقوم بإرجاع التذاكر الموجودة في إصدارات لم يتم طرحها. لكنه لا يعيد التذاكر التي لم يتم تعيين إصدار لها.



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



من الإصدارلقد قدمت بالفعل مثالاً ، هذه الوظيفة ترجع قائمة بآرائك فقط.



linkIssues () هي وظيفة تتيح لك العثور على التذاكر المرتبطة بتذكرة معينة.



هذه هي أبسط الوظائف. لكن دعونا نتعمق قليلاً ونلقي نظرة على اتصالات أكثر تعقيدًا.



assignee was currentUser()

AND fixVersion was in
unreleasedVersions()

AND created > startOfYear()

      
      





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



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



الشرط الثالث هو تاريخ الخلق. نحن نقوم بتصفية التذاكر التي تم إنشاؤها منذ بداية العام الحالي فقط.



ScriptRunner



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



لاستخدام وظائف ScriptRunner ، تحتاج إلى إضافة مشكلة كلمة إضافية وظيفة في JQL أو لا . بعد ذلك تأتي الوظيفة ، على سبيل المثال epicsOf () - تقوم بإرجاع ملحمة التذاكر التي تطابق شروط طلب البحث الفرعي. يأتي طلب البحث الفرعي في السطر الثاني بين قوسين ، وسنلقي نظرة فاحصة عليه.



issueFunction in epicsOf
("worklogDate >= startOfWeek(-1) AND worklogDate <= endOfWeek(-1)")
AND project in (".B2G")
      
      





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



يبدأ الاستعلام نفسه في التنفيذ من الأقواس ، أي من الاستعلام الفرعي worklogDate - تاريخ الخصم . علاوة على ذلك ، هناك مواصفات > = startOfWeek (-1) - بداية الأسبوع. لكن انتبه إلى الرقم -1: يعني أننا لسنا بحاجة هذا الإثنين ، بل نحتاج إلى الأخير. وكذلك worklogDate <= endOfWeek (-1)، أي أنه أقل من نهاية الأسبوع الماضي. سيصدر هذا الطلب تذاكر ، بغض النظر عن - الأخطاء والمهام وقصص المستخدمين - التي قام الموظفون بشطب الوقت من الاثنين إلى الأحد من الأسبوع الماضي.



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



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



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



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



issueFunction in epicsOf("worklogDate >= startOfYear()")
AND issueFunction not in hasLinkType(Contract)
AND project in (".B2G")
      
      







الطلب المرفق يعني أننا مهتمون بالتذاكر التي تم تحصيلها لهذا العام. تتبع وظيفة epicsOf من المثال السابق وتعطينا قائمة بالملاحم. بعد ذلك ، نريد التصفية حسب وجود العقود.



العقد بين قوسين هو نوع من الارتباط الداخلي الذي يربط العقود بالملاحم. hasLinkType () هي دالة في ScriptRunner تقوم بإرجاع التذاكر بنوع الارتباط هذا. لكني أحتاج تذاكر لا تحتوي على هذا النوع من العلاقات ، وبالتالي لا أستخدم النفي.



عندما تم استيفاء الشرط الأول ، حصلت على نطاق من الملاحم ذات الصلة هذا العام. علاوة على ذلك ، تم تصفية الملاحم بدون عقود ، وفي النهاية - لمشروع معين "Video.B2G". بهذه الطريقة حصلت على كل الملاحم للعمل معها.



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

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

شكرا لك.



All Articles