Skip to content

Prepare infra meeting notes as release #107

Prepare infra meeting notes as release

Prepare infra meeting notes as release #107

name: "Prepare infra meeting notes as release"
on:
workflow_dispatch:
inputs:
milestone_id:
description: '"Current" milestone id to prepare as release'
required: true
type: string
milestone_name:
description: '"Current" milestone name'
required: true
default: 'current'
type: string
next_milestone_id:
description: '"Next" milestone id'
required: true
# "permanent" 'next' milestone: https://github.com/jenkins-infra/helpdesk/milestone/10
default: '10'
type: string
next_milestone_name:
description: '"Next" milestone name'
required: true
default: 'next'
type: string
jobs:
release:
name: "Prepare infra meeting notes as release"
runs-on: "ubuntu-latest"
steps:
- name: "Get current date"
id: date
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
- name: "Generate markdown from current and next milestone"
id: milestones_as_markdown
uses: actions/github-script@v6
with:
result-encoding: string
script: |
const getMilestoneAsMarkdown = async function(milestone, milestoneName, issuesState, closeReason) {
const opts = github.rest.issues.listForRepo.endpoint.merge({
...context.issue,
milestone,
state: issuesState,
sort: 'created',
direction: 'desc',
per_page: 100,
})
const issues = await github.paginate(opts)
let markdown = ''
let category = (closeReason == 'completed') ? 'Done' : 'Closed as not planned'
let query = '?closed=1'
// There should not be any closed issue in the 'next' milestone, only 'Done' ones
if (issuesState == 'open') {
category = (milestoneName != 'next') ? 'Work In Progress' : 'Backlog'
if (milestoneName == 'todo') category = 'TODO (next milestone)'
query = ''
}
title = `* [${category}](${context.payload.repository.html_url}/milestone/${milestone}${query}):`
if (issues.length > 0) {
for (const issue of issues) {
if ((issuesState == 'open') || ((issuesState == 'closed') && (issue.state_reason == closeReason))){
markdown = markdown.concat("\r\n").concat(` * [${issue.title}](${issue.html_url})`)
}
}
}
if (markdown != '') markdown = title.concat("\r\n").concat(markdown)
return markdown
}
done = await getMilestoneAsMarkdown(context.payload.inputs.milestone_id, context.payload.inputs.milestone_name, 'closed', 'completed')
notPlanned = await getMilestoneAsMarkdown(context.payload.inputs.milestone_id, context.payload.inputs.milestone_name, 'closed', 'not_planned')
wip = await getMilestoneAsMarkdown(context.payload.inputs.milestone_id, context.payload.inputs.milestone_name, 'open', '')
try {
todoMilestone = parseInt(context.payload.inputs.milestone_id) + 1
todo = await getMilestoneAsMarkdown(todoMilestone, 'todo', 'open', '')
} catch (error) {
console.error(error);
todo = ''
}
next = await getMilestoneAsMarkdown(context.payload.inputs.next_milestone_id, context.payload.inputs.next_milestone_name, 'open', '')
return `Markdown for the infra team sync meeting notes preparation:
<pre><code>
${done}
${notPlanned}
${wip}
${next}
</code></pre>
<details><summary>Preview:</summary>
${done}
* New items:
* placeholder 1
* placeholder 2
${wip}
${todo}
<!--
${next}
-->
</details>
Generated from the ["${context.payload.inputs.milestone_name}"](${context.payload.repository.html_url}/milestone/${context.payload.inputs.milestone_id}) and the ["${context.payload.inputs.next_milestone_name}"](${context.payload.repository.html_url}/milestone/${context.payload.inputs.next_milestone_id}) milestones.`
- name: "Create release"
id: create_release
uses: actions/github-script@v6
env:
CURRENT_DATE: ${{ steps.date.outputs.date }}
RELEASE_BODY: ${{steps.milestones_as_markdown.outputs.result}}
with:
script: |
name = `infra-team-sync-${process.env.CURRENT_DATE}`
tag = `${name}_${context.runNumber}`
try {
await github.rest.repos.createRelease({
name: name,
owner: context.repo.owner,
repo: context.repo.repo,
body: process.env.RELEASE_BODY,
tag_name: tag,
draft: true,
generate_release_notes: true,
prerelease: false,
});
} catch (error) {
core.setFailed(error.message);
}