Sinkronizacija između Jira Cloud Instanci
Ne tako rijetko, u određenim poslovnim sferama postoji potreba za radom na odvojenim software instancama. U Atlassian Jira ekosustavu, u sklopu većih, odnosno enterprise kompanija, najčešći primjeri su odvojeni siteovi QA i/ili service desk i razvojnih timova koji rade na različitim Jira cloud instancama. S druge strane, korisnici mogu imati potrebu ‘dijeliti’ Jira zadatke s vanjskim timom bez dijeljenja povjerljivih podataka. U svim navedenim slučajevima česta praksa je uspostaviti sinkronizaciju između određenih zadataka koji se nalaze na različitim siteovima.
Iako na tržištu postoji mnoštvo third-party aplikacija, povezivanje Jira zadataka između dvije ili više instanci, moguće je postaviti putem Atlassian Automation platforme, odnosno automatizacija u sklopu Jire. U sljedećem primjeru koristiti ćemo dvije cloud instance, no ovaj use-case potencijalno se može replicirati i na sinkronizaciju on-prem okruženja (ovisno o postavljenim security politikama i pravilima), odnosno Data Center-a i druge on-prem ili cloud instance.
Webhook automation Jira cloud instanci
Generalan koncept za kreiranja ‘synca’ između dvije Jira cloud instance je relativno jednostavan te koristi automation webhookove. Ukratko, webhook je korisnički definiran povratni poziv preko HTTPS-a. Webhookovi se poglavito koriste za slanje ili dohvaćanje određenih informacija – primjerice, slanje obavijesti o aktualnim incidentima, ili za dohvaćanje popisa određenih zadataka u Jiri.
Jira platforma već duže vrijeme ima funkcionalnost korištenja aplikacijskih webhookova, a s izlaskom i nadogradnjom ‘Automation’ platforme, omogućeno je korištenje webhookova kao pokretača automatizacija ili akcija u sklopu istih.
U sklopu automation ruleova, najviše ćemo se bazirati na korištenje sljedećih komponenti:


Ako povučemo paralelu sa svakodnevicom, ove dvije komponente možemo protumačiti na sljedeći način:
Send web request možemo zamisliti kao informacije koje dajemo ili pak pitanje koje postavljamo Jiri. Zamislimo da pišemo pismo u kojem se nalaze određene informacije. Ovisno o samoj HTTP metodi, Jira, odnosno servis kojem šaljemo informacije ili postavljamo ‘pitanje’ će nam vratiti određeni odgovor. Primjerice, metodom
GET
možemo dohvatiti podatke o određenom Jira zadatku, Atlassian useru i slično. S druge strane, metodomPOST
Jiri dajemo informacije koje želimo – primjerice, šaljemo podatke o određenom Jira zadatku (npr. key, naziv zadatka, trenutni status i slično).Incoming webhook je ‘točka’ koja pokreće određeni proces, odnosno automatizaciju. Ponovno, ako povučemo paralelu sa svakodnevnim aktivnostima, “Incoming webhook” možemo zamisliti kao ‘sandučić’ za pisma, u koji kada ubacimo poštu. Nakon toga, primatelj otvara sandučić, pročita pismo/poruku i odrađuje određene zadatke te nam, ovisno o potrebi, nazad šalje odgovor na našu poruku.
Ok, kako onda syncamo Jira cloud instance?
Sada kada znamo što je webhook i generalni koncept slanja poruka odnosno upita i dobivanja odgovor na isti, možemo pogledati koncept sinkronizacije zadataka između dvije Jira cloud instance.
SITE1 je originalna instanca na kojoj kreiramo zadatke
SITE2 je remote instanca na kojoj se automatski kreiraju ‘replike’ zadataka te s koje se ti isti zadaci odnosno podaci sa zadataka sinkroniziraju na originalnu instancu.
U našem primjeru sveukupno imamo 8 različitih automation ruleova. 4 na originalnoj Jira cloud instanci te 4 na remote instanci. Od navedenih 8 automatizacija, inicijalne 4 se koriste za ‘povezivanje’ Jira zadataka između dvije Jira cloud instance.
Automatizacija #1: Slanje informacija sa SITE1 na SITE2
Ovisno o potrebama, automatizacija može funkcionirati na način da se prilikom kreiranja svakog zadatka u određenom projektu automatski kreira i remote zadatak na drugoj instanci. Ukoliko pak želimo fleksibilnost i sinkronizaciju samo određenih zadataka, možemo postaviti dodatne kriterije ili ručnu akciju koja će pokrenuti automatizaciju.
Nakon pokretanja automatizacije, dolazimo do akcije Send web request koja putem POST
metode šalje sve podatke o Jira zadatku s kojeg je pokrenuta automatizacija > Web request body = Issue data (Jira format)
. Ovisno o tome tko je automation rule actor, potrebno je dodati autorizacijski token u header upita, odnosno web request-a kojeg šaljemo. Više informacija o kreiranju authorization token-a pronađite ovdje.
Automatizacija #2: Primanje informacija na SITE2 sa SITE1
U automatizaciji na remote Jira cloud instanci (SITE2), nakon primanja informacija koje smo poslali sa originalne instance, podatke koje smo poslali dohvaćamo preko {{webhookData}}
smart valuea. Tako, primjerice možemo kreirirati novi zadatak na remote instanci koji ima isti summary i description kao i originalni issue.
Za dohvaćanje podataka možemo koristiti sljedeće smart value:
Summary:
{{webhookData.issue.fields.summary}}
Description:
{{webhookData.issue.fields.description}}
Original issue key:
{{webhookData.issue.key}}
Automatizacija #3: Slanje keya novokreiranog zadatka s jedne Jira cloud instance na drugu
Prethodna automatizacija kreirala je Jira zadatak na remote instanci sa kopiranim određenim vrijednostima sa originalnog zadatka. Sljedeći korak je slanje informacije keya sa ‘dupliciranog’ zadatka na remote instanci i upisivanje istog na originalni zadatak. I dalje smo na instanci SITE2 gdje imamo automatizaciju koja nakon kreiranja zadatka, preko POST
metode šalje informacije na SITE1.
Automatizacija #4: Upisivanje keya novokreiranog remote zadatka na originalni zadatak
Preko automatizacije #3 smo poslali sve podatke sa novokreiranog zadatka na remote instanci. Prisjetimo se da smo na novokreirani zadatak upisali key originalnog zadatka pa putem te informacije znamo koji Jira zadatak na SITE1 instanci trebamo prvo pronaći i naknadno urediti, odnosno upisati podatak keya remote zadatka.
Kao prvi korak, u automatizaciji ponovno koristimo Incoming webhook trigger. Ovoga puta za Execute this automation rule with: odabiremo opciju Issues provided by running the following JQL search. Za JQL možemo koristiti sljedeći upit key={{webhookData.issue.fields.customfield_<ID>}}
gdje umjesto <ID>
vrijednosti trebamo upisati ID polja na remote instanci u koji smo upisali key originalnog zadatka. Ako se vratimo u dio automatizacije #2, tražimo ID polja Original issue key. Upute kako pronaći ID polja možete pronaći ovdje.
Na originalnom zadatku, osim samog key zadatka s remote instance možemo upisati i link odnosno URL novokreiranog, dupliciranog zadatka. U ovom slučaju na SITE1 instanci, kreirano je novo URL polje pod nazivom “Remote issue URL”, no također je moguće kreirati direktni link između dva Jira zadatka te postaviti određenu relaciju (npr. “blocks”, “relates” i sl.).
Za ovaj primjer smo koristili sljedeće smart value:
Remote issue key:
{{webhookData.issue.key}}
Remote issue URL:
{{webhookData.issue.self.split("rest").get(0)}}browse/{{webhookData.issue.key}}
*za upisivanje adrese u URL polje koristili smo funkcije dostupne u tekstualnim poljima i stringovima
Nakon završetka sve 4 automatizacije, na oba Jira zadatka možemo vidjeti podatke o ‘replici’ zadatka na drugoj instanci. Na originalnom zadatku vidimo key i web adresu (URL) remote zadatka, dok na remote zadatku možemo vidjeti key originalnog zadatka. Naravno, ovisno o potrebama, mogu se zapisati dodatne informacije odnosno podaci na oba zadatka.
‘Sync’ podataka
Prethodnim dijelom, odnosno automatizacijama, dobili smo ‘poveznicu’ između dva Jira zadatka. Također, putem keyeva na jednom, odnosno drugom zadatku, znamo koje podatke i gdje ih trebamo sinkronizirati.
U sljedećem dijelu prikazana je sinkronizacija sa SITE2 na SITE1 instancu. Ukoliko je potrebno, na analogan način može se postaviti i sinkronizacija u drugom smjeru.
Automatizacija #5: Slanje informacija o promjeni na zadatku
Nakon što dođe do promjene podataka na remote zadatku, želimo određene vrijednosti sinkronizirati na originalni. Koristimo trigger Issue Updated, no ukoliko želimo specificirati da se automatizacija pokrene samo u slučaju određenih izmjena, možemo koristiti i trigger poput Field value changed. U sklopu automatizacije, ponovno šaljemo web request sa podacima promijenjenog zadatka. Ukoliko pak ne želimo slati sve podatke sa zadatka, u Send web request akciji možemo odabrati Custom data opciju za Web request body polje, te specificirati informacije koje želimo poslati.
Automatizacija #6: Ažuriranje originalnog zadatka
Na SITE1 instanci, analogno kao u automatizaciji #4, putem JQL-a tražimo originalni zadatak na kojem ćemo raditi promjene, odnosno ažurirati podatke. Kako na remote zadatku imamo informaciju o key-u originalnog zadatka (upisanu u custom polja), ovu informaciju možemo jednostavno dohvatiti. Za kraj, preko Edit issue fields akcije te {{webhookData}}
smart value-a, ažuriramo originalni Jira zadatak.
Na sličan način mogu se sinkronizirati i statusi pojedinog Jira zadatka, neovisno o tome da li je workflow na obje instance jednak ili različit.
Kako to u konačnici izgleda?
Iako na prvu možda izgleda kao puno posla, cijeli proces je relativno jednostavan te ‘u globalu’ samo šaljemo podatke s jedne Jira cloud instance na drugu. Od svih poslanih/primljenih informacija, izvlačimo one koje su nam potrebne te ih upisujemo, odnosno kopiramo na određena mjesta u određena polja. U primjeru ispod, možemo vidjeti kako imamo 2 sinkronizirana zadatka na 2 različite instance te nakon izmjene vrijednosti Start date polja na remote instanci, ista vrijednost se automatski upisuje, odnosno sinkronizira na originalni zadatak.
Automation – temelj sinkronizacije između Jira cloud instanci
Automation je vrlo jednostavan ali ‘moćan’ alat u sklopu Jire i Confluencea te automation platforma (koja skoro svakoga dana dobiva nove nadogradnje) može zamijeniti veliki broj third-party aplikacija koje su do sada možda bile ključni dio procesa u određenim organizacijama.
U ovom smo vam blogu pokazali kako da izvučete maksimum iz sinkronizacije Jira cloud instanci, a ukoliko imate daljnjih pitanja, slobodno se obratite našem timu certificiranih Atlassian konzultanata.
Također, mogao bi vas zanimati i blog o menađmentu resursa kroz Jiru i BigPicture pa svakako bacite oko i na njega!