name: Release Notes Template on: workflow_call: inputs: previous_release: description: 'Previous release tag' required: true type: string current_release: description: 'Current release tag' required: true type: string gitea_url: description: 'Gitea URL' required: false type: string default: 'https://gitea.technarts.com' repo_owner: description: 'Repository owner' required: true type: string repo_name: description: 'Repository name' required: true type: string update_release: description: 'Update release description' required: false type: boolean default: false release_id: description: 'Release ID to update' required: false type: string default: '' secrets: gitea_token: description: 'Gitea API token' required: true jobs: generate-and-update: runs-on: ubuntu-latest steps: - name: Generate and update release notes env: GITEA_TOKEN: ${{ secrets.gitea_token }} GITEA_URL: ${{ inputs.gitea_url }} REPO_OWNER: ${{ inputs.repo_owner }} REPO_NAME: ${{ inputs.repo_name }} PREVIOUS_RELEASE: ${{ inputs.previous_release }} CURRENT_RELEASE: ${{ inputs.current_release }} UPDATE_RELEASE: ${{ inputs.update_release }} RELEASE_ID: ${{ inputs.release_id }} run: | echo "Generating release notes: $PREVIOUS_RELEASE -> $CURRENT_RELEASE" echo "Repository: $REPO_OWNER/$REPO_NAME" # Get releases RELEASES=$(curl -s -H "Authorization: token $GITEA_TOKEN" \ "$GITEA_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/releases") # Get release dates PREVIOUS_DATE=$(echo "$RELEASES" | jq -r --arg tag "$PREVIOUS_RELEASE" \ '.[] | select(.tag_name == $tag) | .created_at') CURRENT_DATE=$(echo "$RELEASES" | jq -r --arg tag "$CURRENT_RELEASE" \ '.[] | select(.tag_name == $tag) | .created_at') if [ -z "$PREVIOUS_DATE" ] || [ "$PREVIOUS_DATE" = "null" ]; then echo "ERROR: Release not found: $PREVIOUS_RELEASE" exit 1 fi if [ -z "$CURRENT_DATE" ] || [ "$CURRENT_DATE" = "null" ]; then echo "ERROR: Release not found: $CURRENT_RELEASE" exit 1 fi echo "Date range: $PREVIOUS_DATE to $CURRENT_DATE" # Get merged PRs PRS=$(curl -s -H "Authorization: token $GITEA_TOKEN" \ "$GITEA_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/pulls?state=closed&limit=200") # Build release notes NOTES_HEADER="# Release Notes: $CURRENT_RELEASE"$'\n\n'"## Changes"$'\n\n' # Filter and format PRs PR_LIST=$(echo "$PRS" | jq -r --arg prev_date "$PREVIOUS_DATE" --arg curr_date "$CURRENT_DATE" ' [.[] | select(.merged == true and .merged_at > $prev_date and .merged_at <= $curr_date)] | sort_by(.merged_at) | reverse | .[] | "* **\(.title)** ([#\(.number)](\(.html_url)))\n Author: @\(.user.username)\n Merged: \(.merged_at | split("T")[0])\n" ') # Count PRs PR_COUNT=$(echo "$PRS" | jq --arg prev_date "$PREVIOUS_DATE" --arg curr_date "$CURRENT_DATE" \ '[.[] | select(.merged == true and .merged_at > $prev_date and .merged_at <= $curr_date)] | length') NOTES_FOOTER=$'\n\n'"---"$'\n\n'"**Total changes:** $PR_COUNT pull requests merged" FULL_NOTES="${NOTES_HEADER}${PR_LIST}${NOTES_FOOTER}" echo "Release notes generated: $PR_COUNT PRs found" echo "======================================" echo "$FULL_NOTES" echo "======================================" # Update release if requested if [ "$UPDATE_RELEASE" = "true" ] && [ -n "$RELEASE_ID" ]; then echo "Updating release description..." NOTES_JSON=$(echo "$FULL_NOTES" | jq -Rs .) curl -X PATCH \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ "$GITEA_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/releases/$RELEASE_ID" \ -d "{\"body\":$NOTES_JSON}" echo "Release description updated successfully!" else echo "Skipping release update" fi