ΕΛ/ΛΑΚ | creativecommons.gr | mycontent.ellak.gr |
freedom

Ενσωμάτωση git-issue με GitHub/GitLab: issue management από τη γραμμή εντολών

Το project μου για το φετινό Google Summer of Code ήταν να επεκτείνω το git-issue, ένα αποκεντρωμένο σύστημα διαχείρισης ζητημάτων με έμφαση στην απλότητα και με βάση το Git, με τη δυνατότητα ανταλλαγής δεδομένων με τις γνωστές πλατφόρμες GitHub και GitLab. Ο απώτερος σκοπός ήταν να μπορεί ο χρήστης να κάνει εισαγωγή ζητημάτων, να προσθέσει κάποιο σχόλιο ή να κάνει κάποια αλλαγή, και τέλος να εξάγει τα αποτελέσματα. Και όλα αυτά από τη γραμμή εντολών.

Οι αλλαγές αυτές έγιναν σε ξεχωριστό GitHub repository, και περιέχονται από το commit d7d499e, έως και το a47e475.

GitHub και GitLab: πολύ δημοφηλείς πλατφόρμες ανάπτυξης λογισμικού ανοιχτού κώδικα

Ανάπτυξη του κώδικα

Η πρώτη μου προτεραιότητα ήταν να προσθέσω κάποια καινούργια χαρακτηριστικά στο git-issue όπως ημερομηνίες λήξης για ένα ζήτημα, προτεραιότητα (βάρος) και εκτίμηση χρόνου που θα χρειαστεί για να λυθεί. Αυτό έγινε για να εξισωθούν με τα χαρακτηριστικά του GitLab, όπου υπήρχαν ήδη.

Ένα πολύ χρήσιμο εργαλείο κατά την ανάπτυξη ήταν οι αυτοματοποιημένες δοκιμές, παρεχόμενες από τη γνώστη online πλατφόρμα Travis CI. Για παράδειγμα, ένα ζήτημα που αποκάλυψε σε αυτό το σημείο ήταν το εξής: Οι εκδόσεις του προγράμματος UNIX date ήταν διαφορετικές σε Linux (όπου ήταν GNU) και σε OS X. Έτσι, προστέθηκαν έλεγχοι ώστε να χρησιμοποιείται η σωστή έκδοση.

Αφού τελείωσε αυτό το κομμάτι, προχώρησα στο κύριο μέρος τής εργασίας: Την εισαγωγή/εξαγωγή δεδομένων από GitLab/GitHub. Και εκεί υπήρχαν κάποιες προκλήσεις, καθώς οι διεπαφές των δύο site –αν και, σε γενικές γραμμές, σχεδόν πανομοιότυπες– διαφέρουν σε κάποια λεπτά σημεία. Ένα τέτοιο σημείο ήταν οι διαφορετικές διαμορφώσεις που απαιτούν: Το GitLab αρνούνταν να εμφανίσει τις αλλαγές γραμμής, εκτός και αν προπορεύονταν από 2+ κενά!

Για την ανάγνωση JSON, χρησιμοποιήθηκε το πρόγραμμα jq. Αντίστοιχα, για τη λήψη/αποστολή δεδομένων μέσω HTTP, χρησιμοποιήθηκε το curl. Και τα δύο προγράμματα προϋπήρχαν σαν απαιτήσεις στο git-issue.

Παραδείγματα χρήσης

Παραδείγματα χρήσης των καινούργιων χαρακτηριστικών, καθώς και του αποτελέσματος

Ας αναφέρουμε πρώτα συνοπτικά τη διαχείριση των καινούργιων χαρακτηριστικών. Έστω ότι έχουμε ένα ζήτημα 60f84 (η αναφορά σε όλα τα ζητήματα στο git-issue γίνεται με έναν δεκαεξαδικό αριθμό, του οποίου αρκεί να γράψουμε αρκετά ψηφία ώστε να αναφέρεται σε μοναδικό ζήτημα) και θέλουμε να δώσουμε μια καταληκτική ημερομηνία την επόμενη Πέμπτη. Μπορούμε να τρέξουμε:

$ git issue duedate 60f84 'next tuesday'
Added duedate 2019-08-27T00:00:00+03:00

Και εδώ φαίνεται η ευελιξία του GNU date: Δεν επιτρέπει μόνο ημερομηνίες όπως ’09-06-2020′, αλλά και ‘tomorrow‘, ‘saturday 4 pm‘ και ‘next month‘!

Με παρόμοιο τρόπο λειτουργούν και τα weight, timespent, timeestimate.

Συνολικά, χωρίς τις εντολές για τη διαχείριση των νέων χαρακτηριστικών προστέθηκαν 5 καινούργιες εντολές: create, export, exportall, filter-apply, dump.

Για τη δημιουργία ενός μεμονωμένου ζητήματος σε GitHub/GitLab (με βάση ένα τοπικό ζήτημα) χρησιμοποιείται το git issue create:

$ git issue create 1f2 gitlab vyrondrosos demo

Κάθε ζήτημα που εισάγεται/εξάγεται «μαρκάρεται» από το git-issue (μπορεί να επιβεβαιωθεί με την εντολή git issue show <issueid>).Έτσι, όλα τα σχετικά με ένα repository ζητήματα εξάγονται (εάν φυσικά έχουν γίνει αλλαγές) με την υποεντολή export:

$ git issue export <provider> <user> <repo>
Issue b83d92872dc16440402516a5f4ce1b8cc6436344 hasn't been modified, skipping...
Comment a93764f32179e93493ceb0a7060efce1e980aff1 hasn't been modified, skipping...
Exporting issue 9179d381135273220301f175c03b101b3e9c703d as #15
...
...

Από την άλλη, αν θέλουμε να εξάγουμε όλα τα ζητήματα, χρήσιμη είναι η exportall:

$ git issue exportall <provider> <user> <repo>
Creating issue 9179d38...
Couldn't add assignee user1. Skipping...
Creating issue 3651dd3...
Creating new Milestone ver3...
Creating comment d72c68d0177b500a91ea37548e6594f84457fd5b...

Κυρίως για λόγους αποσφαλμάτωσης, αναπτύχθηκε και μια εντολή dump η οποία εκτυπώνει όλα τα ζητήματα σε μορφή JSON:

$ git issue dump
{
"issues": [
{
"sha": "4fb7a9f",
"tags": [
"closed"
],
...
...

Και τέλος, η εντολή filter-apply «τρέχει» μια εντολή ή script για κάθε ζήτημα, ώστε να αυτοματοποιηθεί η εκτέλεση αλλαγών που πρέπει να γίνουν σε όλα τα δεδομένα.

$ git issue filter-apply editdesc.sh
Filtering issue 4fb7a9ffcfc9f79b87b497e137f097c643ec3332...
Filtering issue cdaf1208bdf9c6dd839e15ea05e2d007903f4a09...
Filtering issue f3dc62b500455fccc8174fd400aabc9e561a7d19...
Filter applied. To commit the results, run "gi git commit -a".

Αναλυτικότερα περιγράφονται οι καινούργιες εντολές στο README.md.

Συμπεράσματα

Η κατάσταση στην οποία αφήνει το τέλος του Summer of Code το εγχείρημα μου είναι, τουλάχιστον από τη δική μου σκοπιά, ικανοποιητική. Ένα θέμα στο οποίο μπορεί να υπάρξει βελτίωση είναι η ταχύτητα σε αργά δίκτυα με τη συνένωση κάποιων API requests. Επίσης, θα ήταν καλό να γραφούν scripts υποστήριξης της εντολής filter-apply, τα οποία υλοποιούν κάποιες απλές διεργασίες όπως π.χ προσθήκη nametags στην περίπτωση που ένας χρήστης επιθυμεί να εξάγει ζητήματα δημιουργημένα από άλλους.

Το πιo σημαντικό στάδιο είναι φυσικά η δοκιμή στον πραγματικό κόσμο, και έτσι προτείνω σε όλους τους ενδιαφερόμενους να κατεβάσουν τον κώδικα, και να στείλουν τις προτάσεις τους (και τα bug reports!). Προσωπικά είμαι πλέον πεπεισμένος ότι το git-issue είναι και μπορεί να είναι ένα πολύ χρήσιμο εργαλείο για τους λάτρεις της γραμμής εντολών –αλλά και της UNIX φιλοσοφίας γενικότερα– και θα ήθελα να συνεχίσω να έχω ενεργό ρόλο στην ανάπτυξη του.

Leave a Comment