From aaad113865bdf8120de2e249568b7e15be9c7e54 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 28 Jun 2023 07:20:08 +0200 Subject: [PATCH] fix: Fix release creation --- .../workflows/draft-release-notes-on-tag.yaml | 2 +- .../draft-release-notes-on-tag2.yaml | 159 ++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/draft-release-notes-on-tag2.yaml diff --git a/.github/workflows/draft-release-notes-on-tag.yaml b/.github/workflows/draft-release-notes-on-tag.yaml index 737fd2995b8..d8740f09326 100644 --- a/.github/workflows/draft-release-notes-on-tag.yaml +++ b/.github/workflows/draft-release-notes-on-tag.yaml @@ -155,7 +155,7 @@ jobs: } // Create release with the draft changelog - await github.repos.createRelease({ + await github.rest.repos.createRelease({ owner: context.repo.owner, repo: context.repo.repo, tag_name: '${{ github.event.ref }}', diff --git a/.github/workflows/draft-release-notes-on-tag2.yaml b/.github/workflows/draft-release-notes-on-tag2.yaml new file mode 100644 index 00000000000..93e1ccdc8fe --- /dev/null +++ b/.github/workflows/draft-release-notes-on-tag2.yaml @@ -0,0 +1,159 @@ +name: Draft release notes on tag +on: + push + +jobs: + draft_release_notes2: + name: Draft release notes + #if: github.event.ref_type == 'tag' && github.event.master_branch == 'master' + runs-on: ubuntu-latest + steps: + - name: Get milestone title + id: milestoneTitle + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # 6.4.1 + with: + result-encoding: string + script: | + // Get the milestone title ("X.Y.Z") from tag name ("vX.Y.Z") + //const milestoneTitle = '${{github.event.ref}}'.startsWith('v') ? + // '${{github.event.ref}}'.substring(1) : + // '${{github.event.ref}}' + const milestoneTitle = '1.16.0' + + // Look for the milestone + const milestone = (await github.paginate('GET /repos/{owner}/{repo}/milestones', { + owner: context.repo.owner, + repo: context.repo.repo, + state: 'all' + })).find(m => m.title == milestoneTitle) + if (!milestone) { + core.setFailed('Failed to find milestone: ${milestoneTitle}') + return + } + + // Get pull requests of the milestone + const pullRequests = (await github.paginate('/repos/{owner}/{repo}/issues', { + owner: context.repo.owner, + repo: context.repo.repo, + milestone: milestone.number, + state: 'closed' + })) + .filter(i => i.pull_request && i.pull_request.merged_at) // Skip closed but not merged + .filter(p => !p.labels.find(label => label.name == 'tag: no release notes')) // Skip excluded + + // Group PR by components and instrumentations + var prByComponents = new Map() + var prByInstrumentations = new Map() + var otherPRs = new Array() + for (let pullRequest of pullRequests) { + var captured = false + for (let label of pullRequest.labels) { + const index = label.name.indexOf(':') + if (index == -1) { + core.notice('Unsupported label: ${label.name}') + continue + } + const labelKey = label.name.substring(0, index) + const labelValue = label.name.slice(index + 1) + var map = null + if (labelKey == 'comp') { + map = prByComponents + } else if (labelKey == 'inst') { + map = prByInstrumentations + } + if (map) { + var prs = map.get(label.description) + if (!prs) { + prs = new Array() + map.set(label.description, prs) + } + prs.push(pullRequest) + captured = true + } + } + if (!captured) { + otherPRs.push(pullRequest) + } + } + + // Sort components and instrumenations + prByComponents = new Map([...prByComponents].sort()); + const lastInstrumentation = 'All other instrumentations' + prByInstrumentations = new Map([...prByInstrumentations].sort( + (a, b) => { + if (a[0] == lastInstrumentation) { + return 1 + } else if (b[0] == lastInstrumentation) { + return -1 + } + return String(a[0]).localeCompare(b[0]) + } + )); + + // Generate changelog + const decorators = { + 'tag: breaking change': ':warning:', + 'tag: experimental': ':test_tube:', + 'tag: diagnostics': ':mag:', + 'tag: performance': ':zap:', + 'tag: security': ':closed_lock_with_key:', + 'type: bug': ':bug:', + 'type: documentation': ':book:', + 'type: enhancement': ':sparkles:', + 'type: feature request': ':bulb:', + 'type: refactoring': ':broom:' + } + function decorate(pullRequest) { + var line = '' + var decorated = false; + for (let label of pullRequest.labels) { + if (decorators[label.name]) { + line += decorators[label.name] + decorated = true + } + } + if (decorated) { + line += ' ' + } + return line + } + function format(pullRequest) { + var line = `${decorate(pullRequest)}${pullRequest.title} (#${pullRequest.number}` + // Add author if community labeled + if (pullRequest.labels.some(label => label.name == "tag: community")) { + line += ` - thanks @${pull.user.login} for the contribution!` + } + line += ')' + return line; + } + + var changelog = '# Components\n\n'; + for (let pair of prByComponents) { + changelog += '## '+pair[0]+'\n\n' + for (let pullRequest of pair[1]) { + changelog += '* ' + format(pullRequest) + '\n' + } + changelog += '\n' + } + changelog += '# Instrumentations\n\n' + for (let pair of prByInstrumentations) { + changelog += '## '+pair[0]+'\n\n' + for (let pullRequest of pair[1]) { + changelog += '* ' + format(pullRequest) + '\n' + } + changelog += '\n' + } + changelog += '# Other changes\n\n' + for (let pullRequest of otherPRs) { + changelog += '* ' + format(pullRequest) + '\n' + } + + // Create release with the draft changelog + await github.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: '${{ github.event.ref }}', + name: milestoneTitle, + draft: true, + body: changelog + })