Bagaimana kami menggunakan Bahasa Kueri Jira dalam praktiknya

Halo semuanya!



Nama saya Sergey Rakov, saya adalah kepala divisi B2G di Rostelecom IT. Saya ingin memberi tahu Anda tentang Jira Query Language (JQL): cara menggunakannya dalam praktik, teknik dasar, masalah apa yang kami hadapi, dan cara kami menyelesaikannya.



gambar Gambar asli diambil dari deviniti.com/atlassian



Ada banyak pelacak tugas, masing-masing cocok untuk memecahkan beberapa masalah dan tidak terlalu membantu dalam memecahkan masalah lainnya. Kami menggunakan banyak dari mereka, tetapi sekarang kami memilih Jira - itu adalah alat utama kami. Secara pribadi, saya sangat suka bahasa JQL-nya, yang sangat menyederhanakan pekerjaan dan memungkinkan Anda memiliki alat yang kuat dan fleksibel untuk menemukan tiket di luar kotak.



Di luar kotak, Jira memiliki penelusuran dasar dan lanjutan. Kedua opsi pencarian ini dapat menyelesaikan sebagian besar masalah yang dihadapi pengguna. Pencarian dasar tidak asing di mata setiap orang yang telah menggunakan layanan toko online setidaknya sekali - ini berfungsi sesuai dengan skema sederhana yang sama. Ada banyak filter: menurut proyek, jenis tugas, menurut pelaksana dan status. Anda juga dapat menambahkan bidang tambahan berdasarkan kriteria yang didukung oleh Jira.



Tapi masalah muncul saat Anda harus melampaui kueri dasar. Misalnya, jika kita ingin mencari tugas yang pernah ada pada pemain tertentu, atau menemukan semua tugas, tidak termasuk satu proyek. Tidak mungkin lagi membuat pilihan rumit untuk proyek dengan satu status tugas dan pelaksana dan satu lagi pelaksana dan status tugas lain menggunakan pencarian dasar.



Pencarian lanjutan datang untuk menyelamatkan. Sintaks JQL sangat mirip dengan SQL. Tapi di JQL, Anda tidak perlu memilih field tertentu yang akan kita pilih, tunjukkan tabel dan database yang akan kita keluaran. Kami hanya menentukan blok dengan kondisi dan bekerja dengan penyortiran - Jira otomatis melakukan sisanya sendiri.



Yang perlu Anda ketahui untuk bekerja dengan JQL adalah nama-nama field yang akan kita gunakan untuk memilih tiket, operator ( = ,! =, <,>, In, not in, was, is , dll.), Kata kunci ( AND , OR, NOT, KOSONG, ORDER BY , dll.) Dan fungsi yang tersedia di luar kotak dalam mode lanjutan ( Now (), CurrentUser (), IssueHistory (), EndOfDay () dan lainnya).



Fields



Jira, saat Anda mengetik di bilah pencarian, dengan sendirinya memberikan petunjuk tentang semua kemungkinan nilai yang Anda cari: menurut bidang dan nilai bidang ini. Bagi saya sendiri, baru-baru ini saya menemukan bidang sistem yang menarik lastViewed . Jira melacak tampilan tiket Anda.

gambar

Berikut dua opsi untuk membuat filter untuk melihat tugas terbaru. Yang pertama adalah opsi lastViewed saya , di mana Jira akan mengembalikan masalah yang telah saya lihat dalam tujuh hari terakhir, diurutkan dalam urutan menurun. Filter ini dikonfigurasi di dasbor saya sebagai gadget, dan saya sering menggunakannya. Karena tiketnya sudah tutup, saya tidak ingat tab dan nomornya, saya cepat buka, lihat tiket terakhirnya apa.



Ada filter standar Dilihat Baru-baru ini. Ini menggunakan fungsi IssueHistory () , pengurutan juga dilakukan oleh bidang lastViewed . Hasilnya sama, tetapi metodenya, bahkan di Jira, bisa digunakan secara berbeda. Perlu dicatat bahwa bidang LastViewed dan IssueHistory () hanya mengembalikan riwayat penelusuran Anda - Anda tidak dapat melihat riwayat pihak ketiga dengan cara ini.



gambar

Jira sebagian besar memiliki operator standar. Operator favorit saya ADALAH , MASUK , TIDAK MASUK , BUKAN , BERUBAH karena mereka bekerja dengan waktu. Ini tidak mungkin dilakukan dalam database konvensional.



gambar



Jira memungkinkan Anda bekerja dengan data historis di luar kotak. Dengan menggunakan operator WAS , Anda dapat menemukan tiket di mana eksekutornya berada dan merupakan User1. Jika tiket itu ada pada saya, lalu diberikan kepada orang lain, permintaan akan menunjukkan bahwa tiket ini pernah ada pada saya. Jelas bahwa untuk pemilihan yang lebih mendetail, Anda perlu menambahkan beberapa ketentuan lagi, tetapi kita akan membahasnya nanti.



Namun, ada satu peringatan: Jira tidak menyimpan riwayat untuk bidang teks: nama tiket dan deskripsinya. Anda tidak dapat menulis di sana: " Bawakan saya tiket di mana kolom Ringkasan berisi kata" Rostelecom ".



Contoh kedua adalah dengan operator BERUBAH . Kami ingin menerima tiket perubahan artis setelah 1 Januari 2020. Anda dapat menggunakan kata-kata tambahan lainnya, misalnya, SEBELUM atau tanda>, <, kepada siapa itu lebih nyaman, dan tanggal tertentu. Dalam contoh yang sama, Anda juga dapat membuat negasi dan melihat tiket mana yang digantung pada pengguna mana: penerima tugas tidak diubah SETELAH '2020-01-01' .



Kata kunci



gambar

Kata kunci utamanya adalah ATAU , DAN , BUKAN . Mereka bekerja dengan cara yang sama seperti operator logika. Menggunakan OR , kami mendapatkan satu set tiket lengkap dari dua project A dan B. Jika kami perlu mempersempit pilihan, kami menggunakan AND . Contoh - kita membutuhkan tiket dari draf A, di mana pengguna menjalankan Bed dan: project = A = Bed dan penerima tugas AND . Ini sama dengan penyangkalan.



Fungsi



Menurut dokumentasi, ada 47 fungsi di Jira, tapi saya belum pernah menggunakan semuanya. Berikut ini beberapa, menurut saya, yang utama:



gambar



now () adalah fungsi populer yang memungkinkan Anda menemukan tiket yang, misalnya, telah kedaluwarsa.



currentUser () mengembalikan pengguna saat ini. Jira berisi filter yang telah dikonfigurasi sebelumnya yang menggunakan fitur ini. Dengan currentUser (), Anda bisa melakukan pencarian umum. Beginilah cara saya membuat dasbor universal untuk seluruh tim pengembangan: Saya memasukkan gadget ke dasbor dan di masing-masing gadget saya menunjukkan currentUser (), bukan pengguna tertentu . Dasbor ini akan unik untuk setiap pengguna yang masuk, meskipun konfigurasinya akan sama.



unreleasedVersions () adalah fungsi yang mengembalikan tiket dalam versi yang belum dirilis. Tetapi tidak mengembalikan tiket yang tidak memiliki versi.



startOfDay () mengembalikan awal hari ini. Ada fungsi untuk minggu, bulan dan tahun. Hal yang sama berlaku untuk fungsi penutupan endOfDay () . Mereka memungkinkan Anda untuk menyingkirkan tanggal tertentu, mereka dapat diberikan argumen: jika Anda menulis startOfDay (-1) , maka awal hari sebelumnya akan dikembalikan. Jika Anda membiarkan semuanya apa adanya, permulaan hari ini akan ditampilkan - hasilnya adalah waktunya. Fungsi-fungsi ini membantu menghindari hardcode, kami sering menggunakannya.



Dari issueHistory ()Saya sudah memberi contoh, fungsi ini mengembalikan daftar hanya tampilan Anda.



linkedIssues () adalah fungsi yang memungkinkan Anda menemukan tiket yang ditautkan ke tiket tertentu.



Ini adalah fungsi yang paling sederhana. Tapi mari selami lebih dalam dan lihat koneksi yang lebih kompleks.



assignee was currentUser()

AND fixVersion was in
unreleasedVersions()

AND created > startOfYear()

      
      





Sedikit contoh sintetis, tapi tetap saja. Ini adalah permintaan tunggal yang dibagi menjadi tiga blok. Setelah menyelesaikan bagian pertama dari permintaan, kami akan menerima tiket yang mana saya pernah menjadi artis atau salah satunya saat ini. Sangat penting bahwa WAS tidak hanya ada, tetapi masih ada.



Di bagian kedua, pemfilteran ditambahkan: kami akan memfilter cakupan yang diterima dari tiket saya yang pernah ada dalam versi yang belum dirilis saat ini. Artinya, jika ada tiket di versi unreleased ini dan masih belum dirilis saat ini, tapi kemudian saya transfer tiketnya ke versi lain, dan sudah dirilis, maka tiket tersebut akan diikutsertakan dalam seleksi ini.



Kondisi ketiga adalah tanggal pembuatan. Kami hanya memfilter tiket yang telah dibuat sejak awal tahun ini.



ScriptRunner



Ini adalah plugin yang sangat meningkatkan kemampuan Jira. Biasanya digunakan untuk mengotomatiskan proses, tetapi juga menambahkan banyak fungsi tambahan ke JQL. ScriptRunner adalah plugin pertama kami yang kami kirimkan segera setelah kami pindah ke Jira - pada akhir 2018. Saya sangat aktif meminta untuk menginstal plugin ini, karena tanpanya saya tidak dapat mengumpulkan data tentang tautan dengan epos. Misalnya, saya sering kali perlu mengembalikan semua tiket epik untuk permintaan tertentu atau semua tiket epik dari subkueri. ScriptRunner memungkinkan Anda melakukan semua ini dengan sukses.



Untuk menggunakan fungsi ScriptRunner, Anda perlu menambahkan word issueFunction di atau tidak di JQL . Berikutnya adalah fungsi, misalnya epicsOf () - Ini mengembalikan epics tiket yang cocok dengan kondisi subquery. Subkueri berada dalam tanda kurung di baris kedua, dan kita akan melihatnya lebih dekat.



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





Dalam contoh pertama, kami mencari epos dengan penghapusan waktu selama seminggu terakhir. Retasan hidup untuk pemimpin tim dan manajer: jika Anda lupa mengisi lembar waktu, dan tidak ingat apa yang Anda lakukan minggu lalu, dengan menyelesaikan permintaan ini, Anda akan melihat epos apa yang dikerjakan tim. Dan kemungkinan besar, Anda juga mengerjakannya, karena tim jelas datang dengan pertanyaan. Secara umum, kueri ini membantu mengingat apa yang Anda lakukan, dan semuanya baik-baik saja untuk dilukis.



Kueri itu sendiri mulai mengeksekusi dari tanda kurung, yaitu dari subkueri worklogDate - tanggal pendebetan. Selanjutnya ada spesifikasi > = startOfWeek (-1) - awal minggu. Tapi perhatikan angka -1: artinya kita tidak butuh hari Senin ini, tapi hari terakhir. Dan juga worklogDate <= endOfWeek (-1), artinya, ini kurang dari akhir minggu lalu. Permintaan ini akan mengeluarkan tiket, tidak peduli apa - bug, tugas, cerita pengguna - di mana karyawan menghapus waktunya dari Senin hingga Minggu minggu lalu.



Triknya adalah bahwa fungsi startOfWeek () dan endOfWeek () memungkinkan Anda untuk menghilangkan tanggal. Terlepas dari kapan saya membuat permintaan ini di minggu ini, itu akan mengembalikan cakupan epik yang sama kepada saya. Segera setelah minggu ini berakhir, dia akan mengembalikan eposnya. Anehnya, tidak semua orang menggunakan kesempatan ini: Saya baru-baru ini mempelajari permintaan terbuka yang dibagikan secara publik, dan melihat banyak tanggal hardcode di sana. Dan ada kecurigaan bahwa tanggal-tanggal ini terus berubah. Dan apa yang bisa saya katakan, pada awalnya saya melakukannya sendiri.



Dengan menjalankan subquery, kita mendapatkan set tiket yang biasa. Berikutnya adalah fungsi epicsOf , yang memberi kita daftar epik yang terkait dengan tiket ini. Dan kemudian ada pemfilteran berdasarkan proyek, karena saya hanya perlu epos untuk proyek saya, dan semua orang tidak menarik.



Permintaan berikutnya adalah untuk epos dengan penghapusan tahun ini, tetapi tidak ada kontrak. Permintaan ini muncul karena kami menggunakan Jira tidak hanya sebagai pelacak tugas, tetapi juga untuk akuntansi keuangan. Ada proyek terpisah untuk kontrak, yang kami jalankan dalam bentuk tiket, dan kami menggunakannya sebagai sistem manajemen dokumen elektronik: status terus berubah, kami menghubungkan kontrak dengan epos, kami tahu berapa banyak orang yang telah menghapuskan epik mana, kami tahu berapa biayanya, dan kemudian oleh kami menetapkan biaya kerja untuk setiap kontrak. Plus, melalui kontrak, biaya tenaga kerja ditransfer ke Redmine 2.0. Artinya, kami menghapusnya di Jira, dan kemudian skrip otomatis mentransfer biaya kami ke Redmine 2.0 berdasarkan kontrak ini.



Ketika otomatisasi ini mulai bekerja, saya mulai menerima permintaan dari kolega sejenis: ada epos yang biaya tenaga kerjanya tidak dapat ditransfer ke Redmine, karena tidak ada kontrak di sana. Mari pertimbangkan permintaan lebih detail.



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







Permintaan terlampir berarti kami tertarik dengan tiket yang telah ditagih untuk tahun ini. Fungsi epicsOf mengikuti dari contoh sebelumnya dan memberi kita daftar epics. Selanjutnya, kami ingin memfilter berdasarkan adanya kontrak.



Kontrak dalam tanda kurung adalah jenis tautan internal yang menghubungkan kontrak ke epos. hasLinkType () adalah fungsi di ScriptRunner yang mengembalikan tiket dengan jenis tautan ini. Tetapi saya membutuhkan tiket yang tidak mengandung jenis hubungan ini, dan oleh karena itu saya menggunakan negasi bukan dalam.



Saat syarat pertama terpenuhi, saya mendapat cakupan epos yang relevan tahun ini. Selanjutnya, epos tanpa kontrak disaring, dan di final - untuk proyek tertentu "Video.B2G". Dengan cara ini saya mendapatkan semua epos untuk dikerjakan.



Dan pada akhirnya saya ingin menyarankan untuk lulus tes kecil dari tiga pertanyaan tentang topik posting ini. Akan memakan waktu 2 menit. Setelah lulus, Anda akan melihat penilaian Anda.

Tautan jajak pendapat
Saya akan dengan senang hati mengklarifikasi sesuatu atau menjawab pertanyaan di komentar, jika Anda punya.

Terima kasih.



All Articles