name: Discord Notification on: release: types: [published] workflow_dispatch: inputs: tag_name: description: 'Tag name (leave empty for latest release)' required: false type: string jobs: Discord: runs-on: ubuntu-latest name: Discord Notifier steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get release info id: release-info run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then # Pour trigger manuel, récupère le dernier release ou utilise l'input if [ -n "${{ github.event.inputs.tag_name }}" ]; then TAG_NAME="${{ github.event.inputs.tag_name }}" else TAG_NAME=$(gh release list --limit 1 --json tagName --jq '.[0].tagName') fi # Récupère les infos du release via GitHub CLI RELEASE_INFO=$(gh release view "$TAG_NAME" --json name,body,url,author,publishedAt,tagName) echo "tag_name=$(echo "$RELEASE_INFO" | jq -r '.tagName')" >> $GITHUB_OUTPUT echo "name=$(echo "$RELEASE_INFO" | jq -r '.name')" >> $GITHUB_OUTPUT # Utilise EOF pour le body qui peut contenir des caractères spéciaux echo "body<> $GITHUB_OUTPUT echo "$RELEASE_INFO" | jq -r '.body' >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT echo "html_url=$(echo "$RELEASE_INFO" | jq -r '.url')" >> $GITHUB_OUTPUT echo "author_login=$(echo "$RELEASE_INFO" | jq -r '.author.login')" >> $GITHUB_OUTPUT echo "author_html_url=https://github.com/$(echo "$RELEASE_INFO" | jq -r '.author.login')" >> $GITHUB_OUTPUT echo "published_at=$(echo "$RELEASE_INFO" | jq -r '.publishedAt')" >> $GITHUB_OUTPUT else # Pour trigger automatique, utilise les données de l'événement echo "tag_name=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT echo "name=${{ github.event.release.name }}" >> $GITHUB_OUTPUT # Utilise EOF pour le body du release automatique aussi echo "body<> $GITHUB_OUTPUT echo "${{ github.event.release.body }}" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT echo "html_url=${{ github.event.release.html_url }}" >> $GITHUB_OUTPUT echo "author_login=${{ github.event.release.author.login }}" >> $GITHUB_OUTPUT echo "author_html_url=${{ github.event.release.author.html_url }}" >> $GITHUB_OUTPUT echo "published_at=${{ github.event.release.published_at }}" >> $GITHUB_OUTPUT fi env: GH_TOKEN: ${{ github.token }} - name: Get previous release id: previous-release run: | PREV_TAG=$(git tag --sort=-version:refname | grep -v '${{ steps.release-info.outputs.tag_name }}' | head -n1) echo "previous_tag=${PREV_TAG}" >> $GITHUB_OUTPUT - name: Get changed files since last release id: changed-files uses: tj-actions/changed-files@v44 with: base_sha: ${{ steps.previous-release.outputs.previous_tag }} separator: "\n• " - name: Prepare Discord message id: discord-message run: | # Utiliser jq pour créer un JSON valide DESCRIPTION_FULL="${{ steps.release-info.outputs.name }}\n\n${{ steps.release-info.outputs.body }}" DISCORD_EMBEDS=$(jq -n \ --arg title "🚀 New Release: ${{ steps.release-info.outputs.tag_name }}" \ --arg description "$DESCRIPTION_FULL" \ --arg url "${{ steps.release-info.outputs.html_url }}" \ --arg tag "${{ steps.release-info.outputs.tag_name }}" \ --arg author "${{ steps.release-info.outputs.author_login }}" \ --arg author_url "${{ steps.release-info.outputs.author_html_url }}" \ --arg repo "${{ github.event.repository.name }}" \ --arg repo_url "${{ github.event.repository.html_url }}" \ --arg files "${{ steps.changed-files.outputs.all_changed_files }}" \ --arg timestamp "${{ steps.release-info.outputs.published_at }}" \ '[{ "title": $title, "description": $description, "url": $url, "color": 5763719, "thumbnail": { "url": "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" }, "fields": [ { "name": "📦 Version", "value": ("`" + $tag + "`"), "inline": true }, { "name": "👤 Released by", "value": ("[" + $author + "](" + $author_url + ")"), "inline": true }, { "name": "📁 Repository", "value": ("[" + $repo + "](" + $repo_url + ")"), "inline": true }, { "name": "🔗 Download", "value": ("[Release Page](" + $url + ")"), "inline": true }, { "name": "📝 Files Changed", "value": ("• " + $files), "inline": false } ], "timestamp": $timestamp, "footer": { "text": "Workout Cool • Release", "icon_url": "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" } }]') echo "discord_embeds<> $GITHUB_OUTPUT echo "$DISCORD_EMBEDS" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Discord notification env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }} DISCORD_AVATAR: 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png' DISCORD_EMBEDS: ${{ steps.discord-message.outputs.discord_embeds }} uses: Ilshidur/action-discord@master # https://stackoverflow.com/a/68068674/19395252 # https://birdie0.github.io/discord-webhooks-guide/structure/embeds.html # https://github.com/marketplace/actions/changed-files