[PYTHON] Ich habe versucht, Slack über das Update von Redmine zu informieren

Einführung

Dieses Mal habe ich mich entschlossen, Redmine-Ticket-Updates in meinem Unternehmen zu melden, daher werde ich das zusammenfassen.

Hintergrund der Korrespondenz

Meine Firma verwendet Redmine, um ein bestimmtes Geschäft auszulagern, aber wenn der Outsourcer eine Untersuchungshaft erhält, reagiert das Ticket nur langsam! !! Es wurde oft gesagt (obwohl die Wörter etwas weicher sind ...).

Danach, als ich nach der Ursache suchte, schien es, dass ** ich die Untersuchungshaft ** </ font> überhaupt nicht bemerkte.

Nur E-Mails können Benachrichtigungen abfangen, wenn Sie Ihr Ticket in Redmine verlängern. .. Ich verstehe dieses Gefühl ...! Wenn Sie Benachrichtigungen wie Backlog festlegen können, werden Sie dies auch dann bemerken, wenn Sie noch andere Arbeiten ausführen, aber natürlich gibt es keine solche Funktion.

Ich habe mich gefragt, was ich tun soll, aber wenn ich eine Benachrichtigung an ** slack ** erhalte, das als Business-Chat-Tool in unserem Unternehmen sehr aktiv ist, werde ich es wahrscheinlich bemerken. Ich dachte, dass ich diese Funktion gemacht habe.

Diese Anforderung

  1. Benachrichtigen Sie Slack of Tickets, die in Redmine auf einen bestimmten Status aktualisiert wurden
  • Wenn möglich in Echtzeit zusammenarbeiten
  • Der Inhalt der Benachrichtigung ist der Titel von Redmine und der Link zum Ticket der verantwortlichen Person. (Ich erwarte nur, dass es verwirrt wird, wenn ich Slack über den Untersuchungsinhalt informiere. Es ist wichtig, zuerst zu bemerken)

Suchen Sie zunächst nach etwas, das mit der vorhandenen Integration verwendet werden kann

Sofort erschien https://www.sejuku.net/blog/852461 Dieser Artikel

Verwenden Sie die RSS-App

Ergebnis: ✕ Da die von uns verwendete Redmine im Intranet erstellt wird, habe ich aufgegeben, weil ich mit RSS überhaupt keine Verbindung zu Redmine herstellen kann.

Verwenden Sie das Redmine-Plug-In

Ergebnis: ✕ Benachrichtigen von Slack mit einem Webhook über ein Plug-In namens "Redmine Slack" Der Inhalt war genau das, was ich diesmal machen wollte, aber der Auslöser ist ** nur, wenn ich ein neues Ticket erstelle ... **. Es ist lecker ... (Da es sich um ein Plug-In handelt, das so gefragt zu sein scheint, wollte ich, dass Sie den Freiheitsgrad ein wenig mehr erhöhen ...)

Korrespondenzpolitik

Verwenden Sie abschließend die Redmine-API, um aktiv Daten (Tickets) zu erfassen, die die Bedingungen erfüllen, und um die Lücke zu benachrichtigen. Ich habe mich auf die Korrespondenz festgelegt. Da ich die API so getroffen habe, wie ich es mag, scheint sie in Zukunft sehr vielseitig zu sein.

Anforderungsdefinition erneut

  1. Einmal alle 30 Minuten benachrichtigen (Charge alle 30 Minuten ausführen)
  2. Bedingung: Erhalten Sie innerhalb von 30 Minuten ein Ticket mit dem Ticketstatus "Rückgabe" und der Verlängerungszeit
  3. locker Benachrichtigungselemente sind Ticketnummer, URL, Titel, verantwortliche Person

Implementierungsdetails

Erstellen einer verarbeitenden Python-Datei

sashimodoshi.py


# -*- coding: utf-8 -*-
import digdag
import requests
import sys
import os
from datetime import datetime, timedelta
import json

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from .utils.util_slacker import UtilSlacker

class Main():
    def __init__(self, incoming_webhook_url, slack_token):
        self.incoming_webhook_url = incoming_webhook_url
        self.slack_token = slack_token
        self.slacker = UtilSlacker(self.incoming_webhook_url, self.slack_token)
    
    def main(self):
        redmine_api_key = "API-Zugriffsschlüssel" # 個人設定>API-Zugriffsschlüsselから取得
        redmine_url = "http://Redmine URL"

        #Aktualisierungsdatum innerhalb von 30 Minuten
        now = datetime.utcnow() + timedelta(minutes=-30)
        now = now.strftime('%Y-%m-%dT%H:%M:%SZ')

        request_url_for_issues = redmine_url + "/issues.json"
        params = {
            "key": redmine_api_key,
            "project_id": "dd",
            "status_id": 4,
            "updated_on": ">=" + now
        }
        issues_res = requests.get(request_url_for_issues, params)
        issues_responses = json.loads(issues_res.text)
        print(issues_responses)

        fields = []

        if len(issues_responses["issues"]) == 0: #Wenn es 0 ist, wird es verarbeitet
            return

        for issue in issues_responses["issues"]:
           issue_id = issue["id"]
           subject = issue["subject"]
           assigned_to_name = issue["assigned_to"]["name"]

           field = {
               "title": subject,
               "value": "Verantwortliche Person:" + assigned_to_name + "\r\nlink:<" + redmine_url + "/issues/{0}|{0}>".format(issue_id),
           }
           print(field)
           fields.append(field)

        msg = "`Untersuchungshaft`Ich habe ein Ticket für.\r\n Bitte überprüfen Sie die verantwortliche Person."
        channel = "#pj-〇〇"
        user = "Redmine Untersuchungshaftbenachrichtigung"
        icon_emoji = ":redmine:"
        fallback = "redmine"
        title = ""

        attachment1 = self.slacker.attachment_creater(
            fallback=fallback, title=title, color="danger", fields=fields)
        attachments = [attachment1]
        self.slacker.slack_messenger(
            msg, channel, user, icon_emoji, is_link_name=1, attachments=attachments)

Wir rufen diesen Prozess im Batch auf, aber da wir bereits einen Digdag-Server haben, haben wir beschlossen, ihn darauf auszuführen.

sashimodoshi.dig


timezone: Asia/Tokyo

schedule:
  cron>: 00,30 10-18 * * 1-5
  weekly>: Thu,10:30:00

_export:
  workflow_name: "sashimodoshi"

+sashimodoshi:
   py>: bin.python_project.sashimodoshi.Main.main
   incoming_webhook_url: ${env.incoming_webhook_url}
   slack_token: ${env.slack_token}

Die Dig-Datei sieht so aus. In den Zeitplaneinstellungen ist die Ausführung von Montag bis Freitag zwischen 10:00 und 18:00 Uhr für 30 Minuten festgelegt. (Ich ahme diesen Ort nur nach, aber ich habe ihn noch nicht eingeholt ...)

Tatsächliche Slack-Benachrichtigung

Das Implementierungsimage sieht folgendermaßen aus. image.png Ich verwende dieses Mal den Anhang in der Slack-Benachrichtigungs-API und er sieht gut aus!

Nachwort

Dieses Mal haben wir eine Slack-Benachrichtigung mit Schwung implementiert, um die Arbeitseffizienz und Automatisierung zu verbessern, aber als verbleibendes Problem

  • Der API-Schlüssel sollte mit einem Allzweckkonto zur Benachrichtigung ausgestellt werden, nicht mit einem persönlichen Konto von Redmine
  • Einstellungsinformationen sollten überhaupt nicht in die Python-Datei geschrieben werden

Es ist da, also werde ich es bald reparieren.

Dies ist das erste Mal, dass ich Python richtig berührt habe, aber ich lerne noch, weil es anscheinend weiterhin eine aktive Rolle in Bezug auf Arbeitseffizienz und Automatisierung spielen wird, z. B. die Möglichkeit, APIs schnell zu verbinden und in einigen Fällen Excel zu betreiben. Ich werde gehen! !!

Recommended Posts

Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, Zabbix Server über einen Ausführungsfehler der AWS Lambda-Funktion zu informieren
Ich habe versucht, das Umfangsverhältnis mit 100 Millionen Stellen zu ermitteln
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht zu debuggen.
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe ein Tool erstellt, um Slack über Connpass-Ereignisse zu informieren, und es zu Terraform gemacht
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, einen automatischen Nachweis der Sequenzberechnung zu implementieren
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, PCANet zu implementieren
Benachrichtigen Sie Slack über GitHub Push
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Liste aller Änderungen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Pytorchs Datensatz zu erklären
Ich habe Watson Voice Authentication (Speech to Text) ausprobiert.
Ich habe Teslas API berührt
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen