Dies ist Folgeartikel 6 aus meiner Serie zu GitHub-Webhooks.
Heute zeige ich die Skripte, die Issues und Pull-Requests verarbeiten.
Inhaltlich sind sich beide Dinge sehr ähnlich, daher sehen die Skripte
auch fast gleich aus. So gleich, dass ich nur eine gemeinsame
Skriptbesprechung mache.
Beide Skripte sind nur für gbsplay aktiv und schicken jeweils eine
Benachrichtigung an die gbsplay-Mailingliste, wenn ein neues Item
(Issue oder Pull-Request) eröffnet wurde.
handle_issue.pl
- #!/usr/bin/perl -I.
- use warnings;
- use strict;
-
- use WebHookLib;
-
- use constant SENDTO => 'gbsplay-dev@lists.uguu.de';
-
- my $json = read_payload();
-
- my $repository = $json->{repository}->{full_name};
- unless ($repository eq 'mmitch/gbsplay') {
- print " (R/$repository is ignored)\n";
- exit;
- }
-
- my $action = $json->{action};
- unless ($action eq 'opened') {
- print " (A/$action is ignored)\n";
- exit;
- }
-
- my $number = $json->{issue}->{number};
- my $title = $json->{issue}->{title};
- my $issue_url = $json->{issue}->{html_url};
- my $issue_body = crlf($json->{issue}->{body});
-
- my $subject = sprintf "new issue #%d: %s\n", $number, $title;
- my $mail_body = sprintf "see %s\n\n%s\n", $issue_url, $issue_body;
-
- send_mail(SENDTO, $subject, $mail_body);
- print " mail sent.\n";
handle_pull_request.pl
- #!/usr/bin/perl -I.
- use warnings;
- use strict;
-
- use WebHookLib;
-
- use constant SENDTO => 'gbsplay-dev@lists.uguu.de';
-
- my $json = read_payload();
-
- my $repository = $json->{repository}->{full_name};
- unless ($repository eq 'mmitch/gbsplay') {
- print " (R/$repository is ignored)\n";
- exit;
- }
-
- my $action = $json->{action};
- unless ($action eq 'opened') {
- print " (A/$action is ignored)\n";
- exit;
- }
-
- my $number = $json->{pull_request}->{number};
- my $title = $json->{pull_request}->{title};
- my $pr_url = $json->{pull_request}->{html_url};
- my $pr_body = crlf($json->{pull_request}->{body});
-
- my $subject = sprintf "new pull request #%d: %s\n", $number, $title;
- my $mail_body = sprintf "see %s\n\n%s\n", $pr_url, $pr_body;
-
- send_mail(SENDTO, $subject, $mail_body);
- print " mail sent.\n";
Codereview
- Hilfsmethoden laden über
-I.
und use WebHookLib;
- Payload nach
$json
einlesen
- das betroffene Repository prüfen – falls es nicht
mmitch/gbsplay
ist, loggen wir das als Begründung und brechen ab
- die gemeldete Action prüfen – falls sie nicht
opened
ist, loggen
wir das als Begründung und brechen ab
- Nummer, Titel, URL und Beschreibung des Items besorgen (bei der
Beschreibung die Umwandlung der Zeilenumbrüche nicht vergessen)
- Betreffzeile der Mail aus Nummer und Titel zusammenbauen
- Body der Mail aus URL und Beschreibung zusammenbauen
- Mail verschicken
- Logzeile schreiben
- fertig
Ähnlichkeit
Beide Skripte unterscheiden sich nur in insgesamt 5 Zeilen:
- 3×
issue
vs. pull_request
in der JSON-Struktur
- 2× Variablenname
$issue_…
vs. $pr_…
(meine
Schuld ;-)
"issue"
vs. "pull request"
im Betreff der verschickten Mail
Man könnte die Skripte zusammenführen, aber ich will ja kleine,
einzeln austauschbare Einheiten. Mit 32 Zeilen ist jedes Skript total
simpel. Wenn ich beide verheirate, lande ich bei vermutlich 40
Zeilen, die aber zusätzliche Fallunterscheidungen usw. haben – das
wird unnötig kompliziert. Außerdem will ich ja die Möglichkeit
haben, ein einzelnes Skript wegzuwerfen und (ggf. in einer anderen
Programmiersprache) neu zu implementieren.
Einzig wenn jetzt ein Bug auftritt, dann muss ich ihn zweimal fixen.
Das halte ich für vertretbar. Kein nicht-triviales Programm ist
bugfrei, aber diese beiden Skripte gehen schon stark in Richtung trivial…
Renee B am : Renee B via Twitter
Netz - Rettung - Recht am : Wellenreiten 02/2019