Skip to content

Commit 6ff05e7

Browse files
authored
chore(ci): add automatic github release (#2291)
Signed-off-by: Maksim Fedotov <maksim.fedotov@flant.com>
1 parent 1c92be0 commit 6ff05e7

1 file changed

Lines changed: 113 additions & 3 deletions

File tree

.github/workflows/release_module_release-channels.yml

Lines changed: 113 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ on:
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

Comments
 (0)