Skip to content

v0.6.3-beta

v0.6.3-beta #55

name: Discord Release Notification
on:
release:
types: [published]
workflow_dispatch:
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Get Release Information
id: get_release
run: |
# 1. Define a random delimiter to prevent the text "EOF" inside release notes from breaking the script
DELIMITER="EOF_$(date +%s)"
if [ "${{ github.event_name }}" == "release" ]; then
# --- AUTOMATIC TRIGGER (Read from Event Path for safety) ---
# Read name/tag safely using jq from the event file
echo "RELEASE_NAME=$(jq -r .release.name "$GITHUB_EVENT_PATH")" >> $GITHUB_ENV
echo "RELEASE_TAG=$(jq -r .release.tag_name "$GITHUB_EVENT_PATH")" >> $GITHUB_ENV
# Read Body safely
echo "RELEASE_BODY<<$DELIMITER" >> $GITHUB_ENV
jq -r .release.body "$GITHUB_EVENT_PATH" >> $GITHUB_ENV
echo "$DELIMITER" >> $GITHUB_ENV
# URLs and Author
echo "RELEASE_URL=$(jq -r .release.html_url "$GITHUB_EVENT_PATH")" >> $GITHUB_ENV
echo "RELEASE_AUTHOR=$(jq -r .release.author.login "$GITHUB_EVENT_PATH")" >> $GITHUB_ENV
echo "RELEASE_AUTHOR_AVATAR=$(jq -r .release.author.avatar_url "$GITHUB_EVENT_PATH")" >> $GITHUB_ENV
# Assets
echo "ASSETS<<$DELIMITER" >> $GITHUB_ENV
jq -r '.release.assets | map("[\(.name)](\(.browser_download_url))") | join("\n")' "$GITHUB_EVENT_PATH" >> $GITHUB_ENV
echo "$DELIMITER" >> $GITHUB_ENV
else
# --- MANUAL TRIGGER (Fetch via CURL) ---
RELEASE_DATA=$(curl -s -H "Authorization: token ${{ github.token }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/latest")
echo "RELEASE_NAME=$(echo "$RELEASE_DATA" | jq -r '.name')" >> $GITHUB_ENV
echo "RELEASE_TAG=$(echo "$RELEASE_DATA" | jq -r '.tag_name')" >> $GITHUB_ENV
echo "RELEASE_BODY<<$DELIMITER" >> $GITHUB_ENV
echo "$RELEASE_DATA" | jq -r '.body' >> $GITHUB_ENV
echo "$DELIMITER" >> $GITHUB_ENV
echo "RELEASE_URL=$(echo "$RELEASE_DATA" | jq -r '.html_url')" >> $GITHUB_ENV
echo "RELEASE_AUTHOR=$(echo "$RELEASE_DATA" | jq -r '.author.login')" >> $GITHUB_ENV
echo "RELEASE_AUTHOR_AVATAR=$(echo "$RELEASE_DATA" | jq -r '.author.avatar_url')" >> $GITHUB_ENV
echo "ASSETS<<$DELIMITER" >> $GITHUB_ENV
echo "$RELEASE_DATA" | jq -r '.assets | map("[\(.name)](\(.browser_download_url))") | join("\n")' >> $GITHUB_ENV
echo "$DELIMITER" >> $GITHUB_ENV
fi
- name: Send Discord Notification
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
RELEASE_BODY: ${{ env.RELEASE_BODY }}
RELEASE_URL: ${{ env.RELEASE_URL }}
RELEASE_NAME: ${{ env.RELEASE_NAME }}
RELEASE_TAG: ${{ env.RELEASE_TAG }}
RELEASE_AUTHOR: ${{ env.RELEASE_AUTHOR }}
RELEASE_AUTHOR_AVATAR: ${{ env.RELEASE_AUTHOR_AVATAR }}
ASSETS: ${{ env.ASSETS }}
run: |
REPO_NAME="${{ github.repository }}"
REPO_URL="https://github.com/${{ github.repository }}"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
if [ -z "$ASSETS" ]; then
ASSETS="No downloadable assets"
fi
# Truncate release body if it exceeds Discord's limit
MAX_DESC_LENGTH=4000
if [ ${#RELEASE_BODY} -gt $MAX_DESC_LENGTH ]; then
echo "Release body is ${#RELEASE_BODY} characters, truncating..."
RELEASE_BODY_TRUNCATED="${RELEASE_BODY:0:$MAX_DESC_LENGTH}... [Read full release notes]($RELEASE_URL)"
else
RELEASE_BODY_TRUNCATED="$RELEASE_BODY"
fi
# Create Discord payload
DISCORD_PAYLOAD=$(jq -n \
--arg title "🚀 New Release: $RELEASE_NAME" \
--arg description "$RELEASE_BODY_TRUNCATED" \
--arg url "$RELEASE_URL" \
--arg tag "$RELEASE_TAG" \
--arg author "$RELEASE_AUTHOR" \
--arg avatar "$RELEASE_AUTHOR_AVATAR" \
--arg assets "$ASSETS" \
--arg timestamp "$TIMESTAMP" \
--arg repo "$REPO_NAME" \
--arg repo_url "$REPO_URL" \
'{
embeds: [{
title: $title,
description: $description,
url: $url,
color: 3066993,
fields: [
{ name: "📦 Version", value: ("`" + $tag + "`"), inline: true },
{ name: "👤 Author", value: ("[" + $author + "](https://github.com/" + $author + ")"), inline: true },
{ name: "📂 Repository", value: ("[" + $repo + "](" + $repo_url + ")"), inline: false },
{ name: "⬇️ Downloads", value: $assets, inline: false }
],
author: { name: $author, icon_url: $avatar, url: ("https://github.com/" + $author) },
timestamp: $timestamp,
footer: { text: ("Released from " + $repo) }
}]
}')
echo "Sending notification to Discord..."
RESPONSE=$(curl -s -w "\n%{http_code}" -H "Content-Type: application/json" \
-d "$DISCORD_PAYLOAD" \
"$DISCORD_WEBHOOK_URL")
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
if [ "$HTTP_CODE" -eq 204 ] || [ "$HTTP_CODE" -eq 200 ]; then
echo "Success: $HTTP_CODE"
else
echo "Failed: $HTTP_CODE"
exit 1
fi