feat: 增加 linear webhook 接口和 discord 通知
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
Ching 2024-03-20 17:05:24 +08:00
parent 1284a009e8
commit 8e100f7170
4 changed files with 140 additions and 0 deletions

73
.drone.yml Normal file
View File

@ -0,0 +1,73 @@
kind: pipeline
type: docker
name: default
steps:
- name: build-and-push
image: plugins/docker
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: git.tunpok.com/ching/linear-discord-webhook
registry: git.tunpok.com
tags: latest
# - name: notify
# image: plugins/webhook
# settings:
# urls: http://bark.tunpok.com/UZ6zC82bKRjQaXiVkosVWh/
# content_type: application/json
# template: |
# {
# "title": "{{#success build.status}}🟢{{else}}🔴{{/success}} Drone Build #{{ build.number }} {{ build.status }} {{#success build.status}}🟢{{else}}🔴{{/success}}",
# "body": "Project: {{ repo.name }}\nBranch: {{ build.branch }}\nCommit: {{ truncate build.commit 8 }}",
# "group": "drone",
# "url": "{{ build.link }}",
# "icon": "https://static-00.iconduck.com/assets.00/drone-icon-2048x2048-6zua2vkz.png"
# }
# when:
# status: [success, failure]
# https://discord.com/api/webhooks/1213409068559900683/szl0AICZwA1V82dg8Vrc_xqOCl1WwnxktlQdf4cdILswR-xZBI5-JOdqGSD8dVUNcUlH
- name: deploy
image: appleboy/drone-ssh
settings:
host:
- 148.135.109.242
username: root
key:
from_secret: ssh_key
passphrase:
from_secret: ssh_passphrase
port: 22
command_timeout: 2m
script:
- echo "Pull new image"
- docker pull git.tunpok.com/ching/linear-discord-webhook:latest
- echo "Go to the project directory"
- cd /root/develop/linear-discord-webhook
- echo "Restart the container"
- docker-compose down && docker-compose up -d
- name: discord notification
image: appleboy/drone-discord
settings:
webhook_id:
from_secret: discord_webhook_id
webhook_token:
from_secret: discord_webhook_token
# message: |
# Drone Build #${DRONE_BUILD_NUMBER} ${DRONE_BUILD_STATUS}
# Project: ${DRONE_REPO_NAME}
# Branch: ${DRONE_BRANCH}
# Commit: ${DRONE_COMMIT_SHA:0:8}
# [Build Log](${DRONE_BUILD_LINK})
when:
status: [success, failure]
volumes:
- name: dockersock
host:
path: /var/run/docker.sock

14
Dockerfile Normal file
View File

@ -0,0 +1,14 @@
# 使用自定义 Docker Registry 中的官方 Python 镜像作为基础镜像
FROM git.tunpok.com/ching/python-env:latest
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到容器中
COPY . .
# port number
EXPOSE 5000
# run flask app
CMD ["python", "app.py"]

43
app.py Normal file
View File

@ -0,0 +1,43 @@
from flask import Flask, request, jsonify
import apprise
import os
from loguru import logger
app = Flask(__name__)
DISCORD_WEBHOOK_URL = os.environ.get('DISCORD_WEBHOOK_URL')
DISCORD_WEBHOOK_ID = DISCORD_WEBHOOK_URL.split('/')[-2]
DISCORD_WEBHOOK_TOKEN = DISCORD_WEBHOOK_URL.split('/')[-1]
@app.route('/linear/issue', methods=['POST'])
def linear_issue():
""" https://developers.linear.app/docs/graphql/webhooks#the-webhook-payload
"""
if request.headers.get('Linear-Event') != 'issue':
logger.error('Invalid event type: %s', request.headers.get('Linear-Event'))
return jsonify({'message': 'Invalid event type'}), 400
data = request.json
logger.info('Received issue webhook: %s', data)
if data['action'] != 'update':
logger.warning('Ignoring issue action: %s', data['action'])
return jsonify({'message': 'Ignoring issue action'}), 200
# Send Discord message
apobj = apprise.Apprise()
apobj.add(f'discord://{DISCORD_WEBHOOK_ID}/{DISCORD_WEBHOOK_TOKEN}/?avatar=No&format=markdown')
apobj.asset.app_id = None
apobj.notify(body='Issue status changed')
# if data['updatedFrom'].get('statusId') != data['issue']['statusId']:
# logger.info('Issue status changed: %s', data['issue']['status']['name'])
# # Send Discord message with embeded content
# # set apprise format to markdown
# apobj.notify(
# body=f'Issue status changed: **{data["issue"]["status"]["name"]}**',
# title=data['issue']['title'],
# body_format=apprise.AppriseFormat.MARKDOWN
# )
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)

10
docker-compose.yml Normal file
View File

@ -0,0 +1,10 @@
version: '3'
services:
barcode-helper:
image: git.tunpok.com/ching/linear-discord-webhook:latest
container_name: linear-discord-webhook
restart: always
environment:
- DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN
ports:
- 9289:5000