5757 default : true
5858 description : " Set to true if build is required"
5959
60+ release_to_github :
61+ type : boolean
62+ default : true
63+ description : " Create GitHub release from changelog PR"
64+
6065 check_only :
6166 type : boolean
6267 description : " Run only check version on release channel"
@@ -487,6 +492,90 @@ jobs:
487492 COUNT=5 \
488493 task -d tools/moduleversions check:docs
489494
495+ create-github-release :
496+ name : Create GitHub release
497+ runs-on : ubuntu-latest
498+ needs :
499+ - job-CE
500+ - job-EE
501+ - job-SE-Plus
502+ - job-FE
503+ - check-version-on-release-channel
504+ if : ${{ !inputs.check_only && inputs.release_to_github && needs.check-version-on-release-channel.result == 'success' && (inputs.ce || inputs.ee) }}
505+ permissions :
506+ contents : write
507+ pull-requests : read
508+ outputs :
509+ release_status : ${{ steps.release.outputs.release_status }}
510+ release_url : ${{ steps.release.outputs.release_url }}
511+ release_pr_number : ${{ steps.release.outputs.release_pr_number }}
512+ release_pr_url : ${{ steps.release.outputs.release_pr_url }}
513+ release_reason : ${{ steps.release.outputs.release_reason }}
514+ steps :
515+ - name : Create GitHub release from changelog PR
516+ id : release
517+ env :
518+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
519+ TAG : ${{ github.event.inputs.tag }}
520+ REPOSITORY : ${{ github.repository }}
521+ run : |
522+ set -euo pipefail
523+
524+ echo "Checking GitHub release for tag: $TAG"
525+ echo "Repository: $REPOSITORY"
526+
527+ gh release view "$TAG" --repo "$REPOSITORY" >/tmp/release-view.txt 2>/dev/null && release_exists=true || release_exists=false
528+ if [[ "$release_exists" == "true" ]]; then
529+ echo "GitHub release already exists for ${TAG}, skipping"
530+ release_url=$(gh release view "$TAG" --repo "$REPOSITORY" --json url --jq '.url')
531+ echo "Existing release URL: ${release_url}"
532+ echo "release_status=skipped" >> "$GITHUB_OUTPUT"
533+ echo "release_url=${release_url}" >> "$GITHUB_OUTPUT"
534+ echo "release_reason=GitHub release already exists for ${TAG}" >> "$GITHUB_OUTPUT"
535+ exit 0
536+ fi
537+
538+ echo "Searching merged changelog PRs for milestone ${TAG}"
539+ changelog_prs=$(gh pr list \
540+ --repo "$REPOSITORY" \
541+ --state merged \
542+ --search "label:changelog milestone:${TAG}" \
543+ --json number,title,url,body,milestone)
544+
545+ echo "$changelog_prs" | jq '.'
546+
547+ changelog_pr_count=$(echo "$changelog_prs" | jq 'length')
548+ echo "Found ${changelog_pr_count} merged changelog PR(s)"
549+ if [[ "$changelog_pr_count" -ne 1 ]]; then
550+ echo "Expected exactly one merged changelog PR for milestone ${TAG}, found ${changelog_pr_count}" >&2
551+ exit 1
552+ fi
553+
554+ pr_number=$(echo "$changelog_prs" | jq -r '.[0].number')
555+ pr_url=$(echo "$changelog_prs" | jq -r '.[0].url')
556+ pr_body=$(echo "$changelog_prs" | jq -r '.[0].body')
557+
558+ if [[ -z "${pr_body//[[:space:]]/}" ]]; then
559+ echo "Changelog PR #${pr_number} body is empty" >&2
560+ exit 1
561+ fi
562+
563+ notes_file=$(mktemp)
564+ printf '%s\n' "$pr_body" > "$notes_file"
565+
566+ gh release create "$TAG" \
567+ --repo "$REPOSITORY" \
568+ --title "$TAG" \
569+ --notes-file "$notes_file"
570+
571+ release_url=$(gh release view "$TAG" --repo "$REPOSITORY" --json url --jq '.url')
572+
573+ echo "release_status=created" >> "$GITHUB_OUTPUT"
574+ echo "release_url=${release_url}" >> "$GITHUB_OUTPUT"
575+ echo "release_pr_number=${pr_number}" >> "$GITHUB_OUTPUT"
576+ echo "release_pr_url=${pr_url}" >> "$GITHUB_OUTPUT"
577+ echo "release_reason=GitHub release created from changelog PR #${pr_number}" >> "$GITHUB_OUTPUT"
578+
490579 send-release-results-to-loop :
491580 name : Send release results to Loop
492581 runs-on : ubuntu-latest
@@ -496,21 +585,29 @@ jobs:
496585 - job-SE-Plus
497586 - job-FE
498587 - check-version-on-release-channel
588+ - create-github-release
499589 if : ${{ always() && inputs.send_results_to_loop }}
500590 steps :
501591 - name : Send results to Loop
502592 env :
503593 LOOP_WEBHOOK_URL : ${{ secrets.LOOP_WEBHOOK_URL }}
504594 TAG : ${{ github.event.inputs.tag }}
505595 CHANNEL : ${{ github.event.inputs.channel }}
596+ RELEASE_TO_GITHUB : ${{ inputs.release_to_github }}
597+ CHECK_ONLY : ${{ inputs.check_only }}
506598 CE_ENABLED : ${{ inputs.ce }}
507599 EE_ENABLED : ${{ inputs.ee }}
508600 CE_RESULT : ${{ needs.job-CE.result }}
509601 EE_RESULT : ${{ needs.job-EE.result }}
510602 SE_PLUS_RESULT : ${{ needs.job-SE-Plus.result }}
511603 FE_RESULT : ${{ needs.job-FE.result }}
512- # will be `success` only if all jobs in the matrix have succeeded
513604 CHECK_RESULT : ${{ needs.check-version-on-release-channel.result }}
605+ GH_RELEASE_RESULT : ${{ needs.create-github-release.result }}
606+ GH_RELEASE_STATUS : ${{ needs.create-github-release.outputs.release_status }}
607+ GH_RELEASE_URL : ${{ needs.create-github-release.outputs.release_url }}
608+ GH_RELEASE_PR_NUMBER : ${{ needs.create-github-release.outputs.release_pr_number }}
609+ GH_RELEASE_PR_URL : ${{ needs.create-github-release.outputs.release_pr_url }}
610+ GH_RELEASE_REASON : ${{ needs.create-github-release.outputs.release_reason }}
514611 run : |
515612 export TZ=Europe/Moscow
516613 DATE=$(date +"%Y-%m-%d %H:%M:%S UTC+03:00")
@@ -526,7 +623,6 @@ jobs:
526623 esac
527624 }
528625
529- # Build header row and status row dynamically
530626 HEADER_ROW="| Edition |"
531627 STATUS_ROW="| Status |"
532628
@@ -549,7 +645,21 @@ jobs:
549645 HEADER_ROW+=" Check |"
550646 STATUS_ROW+=" $(get_status_emoji $CHECK_RESULT) |"
551647
552- # Count columns for separator
648+ if [[ "$RELEASE_TO_GITHUB" == "true" && "$CHECK_ONLY" != "true" ]]; then
649+ HEADER_ROW+=" GitHub Release |"
650+ if [[ "$GH_RELEASE_RESULT" == "failure" ]]; then
651+ STATUS_ROW+=" :x: |"
652+ elif [[ "$GH_RELEASE_STATUS" == "created" ]]; then
653+ STATUS_ROW+=" :white_check_mark: |"
654+ elif [[ "$GH_RELEASE_STATUS" == "dry-run" ]]; then
655+ STATUS_ROW+=" :memo: |"
656+ elif [[ "$GH_RELEASE_STATUS" == "skipped" ]]; then
657+ STATUS_ROW+=" :fast_forward: |"
658+ else
659+ STATUS_ROW+=" :grey_question: |"
660+ fi
661+ fi
662+
553663 COL_COUNT=$(echo "$HEADER_ROW" | tr -cd '|' | wc -c)
554664 COL_COUNT=$((COL_COUNT - 1))
555665 SEPARATOR_ROW="|"
0 commit comments