GitHubにプッシュしたときに、Backlogにコメントを書き込む仕組みの作り方(AWS Lambda使用)【後編】

So erstellen Sie einen Mechanismus zum Schreiben von Kommentaren in Backlog beim Pushen an GitHub (mit AWS Lambda) [Teil 2]

letztes Mal:
■ So erstellen Sie einen Mechanismus zum Schreiben von Kommentaren in das Backlog beim Pushen an GitHub (mit AWS Lambda) [Teil 1]
https://fourmix-blog.myshopify.com/blogs/aws/220118

Als Fortsetzung des letzten Mals möchte ich die Webhook-Funktion des GitHub-Repositorys und AWS Lambda verwenden, um die Funktion zum automatischen Schreiben von Kommentaren zu verwandten Problemen im Backlog zu realisieren.

<Inhalt>

(0) Dinge, die vorbereitet werden müssen (Teil 1)

(1) AWS Lambda und Amazon API Gateway konfigurieren (Teil 1)

(2) GitHub-Webhook-Einstellungen (Teil 1)

(3) GitHub-Authentifizierung mit AWS Lambda (Teil 1)

(4) Axios-Paket hochladen

(5) Backlog-API aufrufen

(6) Informationen zur AWS-Nutzungsgebühr

(4) Axios-Paket hochladen

Wir verwenden das Axios-Paket, um Anfragen an die Backlog-API zu senden.

Erstellen Sie in Ihrem lokalen Ordner einen „nodejs“-Ordner und öffnen Sie ihn in VS Code .

Führen Sie von der Konsole aus Folgendes aus

npm i -y npm i axios

Nach der Ausführung komprimieren Sie den NodeJS-Ordner selbst.

Klicken Sie anschließend in den Ebenen in der AWS Lambda-Konsole auf „Ebene erstellen“, um eine Ebene zu erstellen.

Fügen Sie abschließend die hinzugefügte Ebene zur Ebene der Funktion hinzu.

(5) Backlog-API aufrufen

Implementieren Sie abschließend den Prozess zum Aufrufen der Backlog-API.

■ Aufgabenkommentare hinzufügen
https://developer.nulab.com/ja/docs/backlog/api/2/add-comment/

Geben Sie zunächst einen API-Schlüssel aus den persönlichen Einstellungen auf der Backlog-Seite aus.

Fügen Sie als Nächstes Umgebungsvariablen aus der AWS Lambda-Konsole hinzu.

BACKLOG_APIKEY: API-Schlüssel, der zuvor ausgegeben wurde
BACKLOG_API_ENDPOINT: API-Endpunkt
BACKLOG_TASKKEY_PREFIX: Präfix des Zielaufgabenschlüssels korrigiert

 // axiosの読み込みconst axios = require('axios').default; exports.handler = async (event) => { // ヘッダ取得 const headers = event.headers; // ボディ取得 
const body = event.body;

 // den Körper objektivieren
 const bodyObj = JSON.parse(body);

 // Validierung ausführen und Fehler behandeln
 if (!isValid(body, headers)) {

 // Fehler zurückgeben
 const Antwort = {
 Statuscode: 500,
 body: 'Validierungsfehler',
 };
 Rückantwort;
 }

 // Commit-Informationen vom Body-Objekt abrufen
 const commits = getCommits(bodyObj);

 // Beenden, wenn keine Ziel-Commits vorhanden sind.
 if(commits.length === 0){
 const Antwort = {
 Statuscode: 500,
 body: „Es gab keinen Commit, dessen Commit-Nachricht mit „${process.env.BACKLOG_TASKKEY_PREFIX}“ begann“,
 };
 Rückantwort;
 }

 // Zweignamen abrufen (allen Commits gemeinsam)
 const commit_ref = bodyObj.ref.replace('refs/heads/','');

 // Zweig-URL abrufen (gemeinsam für alle Commits) 
const branch_url = bodyObj.repository.url + '/tree/' + commit_ref;

 // Verarbeitung für jedes Commit
 for (const commit of commits) {

 // Aufgabenschlüssel und Kommentar abrufen
 const {taskkey, comment} = getComment(commit_ref, branch_url, commit);

 // API-Aufruf
 wait axios.post(`${process.env.BACKLOG_API_ENDPOINT}${taskkey}/comments?apiKey=${process.env.BACKLOG_APIKEY}`, {
 Inhalt: Kommentar
 });
 }

 // eine normale Antwort zurückgeben
 const Antwort = {
 Statuscode: 200,
 body: „${commits.length}-Commits verarbeitet.“ `,
 };
 Rückantwort;

 // validieren, ob die Anfrage von Github stammt
 Funktion isValid(body, headers) {
 const crypto = require('crypto');
 const hmac = crypto.createHmac('sha1', process.env.GITHUB_SECRET);
 hmac.update(body, 'utf8');
 const Signatur = 'sha1=' + hmac.digest('hex'); 
Rückgabesignatur === headers['x-hub-signatur'];
 }

 // Ziel-Commit abrufen und zurückgeben
 Funktion getCommits(bodyObj){

 // Commits abrufen, deren Commit-Nachricht mit der Umgebungsvariablen BACKLOG_TASKKEY_PREFIX beginnt
 let commits = bodyObj.commits.filter(function(i){

 // Anzahl der Zeichen von BACKLOG_TASKKEY_PREFIX abrufen
 const len ​​​​=process.env.BACKLOG_TASKKEY_PREFIX.length;

 return i.message.slice(0,len) === process.env.BACKLOG_TASKKEY_PREFIX;
 })
 Rückgabe-Commits;
 }

 // Den Kommentar zusammenstellen und zurückgeben
 Funktion getComment(commit_ref, branch_url, commit){

 // Issue-Schlüssel aus Commit-Nachricht abrufen
 const commit_messages = commit.message.split(' ');
 const taskkey = commit_messages[0];

 // Kommentar erstellen
 let comment = ` 
Der folgende Fix wurde auf Github übertragen.

 [Zweig]: ${commit_ref}
 [Branch-URL]: ${branch_url}
 [Aufgabenschlüssel]: ${taskkey}
 [Name des Committers]: ${commit.author.name}
 [Commit-Nummer]: ${commit.id}
 [Commit-URL]: ${commit.url}
 [Nachricht festschreiben]:
 ${commit.message}
 `;
 return {taskkey, comment};
 }
 };

Wenn Sie nun auf GitHub pushen, wird der Kommentar automatisch zum „In der Commit-Nachricht beschriebenen Problem“ hinzugefügt, wie unten gezeigt.

(6) Informationen zur AWS-Nutzungsgebühr

Was die besorgniserregende AWS-Nutzungsgebühr betrifft, so lautet sie wie folgt.
*Der Preis ist der Preis zum Zeitpunkt der Erstellung dieses Artikels.

■ Amazon API Gateway
Bis zu 300 Millionen monatliche Anfragen, 1.000.000 Anfragen: 1,00 USD
* Während des kostenlosen Zeitraums ( ein Jahr nach Erstellung eines Kontos) sind jedoch bis zu 1 Million Anfragen kostenlos.

■ AWS Lambda
0,20 $ pro Million Anfragen
pro GB-Sek.: 0,0000166667 USD
*Während des kostenlosen Zeitraums sind jedoch 1 Million kostenlose Anfragen pro Monat und 400.000 GB Rechenzeit pro Monat kostenlos.

Mit anderen Worten: Während des Gratiszeitraums ist es kostenlos. Nach Ablauf des Gratiszeitraums wird mit ca. 1,20 USD gerechnet. (es sei denn, die Anzahl der Commits ist extrem hoch)

Daher habe ich die Verknüpfung mithilfe von AWS über den Webhook von GitHub zusammengefasst. Wenn Sie es anwenden, können Sie meiner Meinung nach bei jedem Push CI-Prüfungen durchführen, Nachrichten an Slack senden und viele andere Dinge.
Bitte nehmen Sie verschiedene Herausforderungen an.

Autorenname: Molly

Front-End-Ingenieur, der React liebt.