From ae14567f9703537de2be151ef6ec544df7f3dbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9mentine=20Urquizar?= Date: Fri, 2 Sep 2022 16:22:21 +0200 Subject: [PATCH] Add CI manifest to automate some step of the release management when creating/closing a Milestone --- .../release-management-automation.yml | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 .github/workflows/release-management-automation.yml diff --git a/.github/workflows/release-management-automation.yml b/.github/workflows/release-management-automation.yml new file mode 100644 index 000000000..5386a76fb --- /dev/null +++ b/.github/workflows/release-management-automation.yml @@ -0,0 +1,164 @@ +name: Automate some steps of release management + +# /!\ No git flow are handled here + +# For each Milestone created (not opened!), and if the release is NOT a patch release (only the patch changed) +# - the roadmap issue is created, see https://github.com/meilisearch/core-team/blob/main/issue-templates/roadmap-issue.md +# - the changelog issue is created, see https://github.com/meilisearch/core-team/blob/main/issue-templates/changelog-issue.md + +# For each Milestone closed +# - the `release_version` label is created +# - this label is applied to all issues/PRs in the Milestone + +on: + milestone: + types: [created, closed] + +jobs: + +# ----------------- +# MILESTONE CREATED +# ----------------- + + get-release-version: + if: github.event.action == 'created' + runs-on: ubuntu-latest + outputs: + is-patch: ${{ steps.check-patch.outputs.is-patch }} + env: + MILESTONE_VERSION: ${{ github.event.milestone.title }} + steps: + - uses: actions/checkout@v3 + - name: Check if this release is a patch release only + id: check-patch + run: | + echo version: $MILESTONE_VERSION + if [[ $MILESTONE_VERSION =~ ^v[0-9]+\.[0-9]+\.0$ ]]; then + echo 'This is NOT a patch release' + echo ::set-output name=is-patch::false + elif [[ $MILESTONE_VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo 'This is a patch release' + echo ::set-output name=is-patch::true + else + echo "Not a valid format of release, check the Milestone's title." + echo 'Should be vX.Y.Z' + exit 1 + fi + + create-roadmap-issue: + needs: get-release-version + # Create the roadmap issue if the release is not only a patch release + if: github.event.action == 'created' && needs.get-release-version.outputs.is-patch == 'false' + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.MEILI_BOT_GH_PAT }} + ISSUE_TEMPLATE: issue-template.md + MILESTONE_VERSION: ${{ github.event.milestone.title }} + MILESTONE_URL: ${{ github.event.milestone.html_url }} + MILESTONE_DUE_ON: ${{ github.event.milestone.due_on }} + steps: + - uses: actions/checkout@v3 + - name: Download the issue template + run: curl -s https://raw.githubusercontent.com/meilisearch/core-team/main/issue-templates/roadmap-issue.md > $ISSUE_TEMPLATE + - name: Replace all empty occurences in the templates + run: | + # Replace all <> occurences + sed -i "s/<>/$MILESTONE_VERSION/g" $ISSUE_TEMPLATE + + # Replace all <> occurences + milestone_id=$(echo $MILESTONE_URL | cut -d '/' -f 7) + sed -i "s/<>/$milestone_id/g" $ISSUE_TEMPLATE + + # Replace release date if exists + if [[ ! -z $MILESTONE_DUE_ON ]]; then + date=$(echo $MILESTONE_DUE_ON | cut -d 'T' -f 1) + sed -i "s/Release date\: 20XX-XX-XX/Release date\: $date/g" $ISSUE_TEMPLATE + fi + - name: Create the issue + run: | + gh issue create \ + --title "$MILESTONE_VERSION ROADMAP" \ + --label 'epic,impacts docs,impacts integrations,impacts cloud' \ + --body-file $ISSUE_TEMPLATE \ + --milestone $MILESTONE_VERSION + + create-changelog-issue: + needs: get-release-version + # Create the changelog issue if the release is not only a patch release + if: github.event.action == 'created' && needs.get-release-version.outputs.is-patch == 'false' + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.MEILI_BOT_GH_PAT }} + ISSUE_TEMPLATE: issue-template.md + MILESTONE_VERSION: ${{ github.event.milestone.title }} + MILESTONE_URL: ${{ github.event.milestone.html_url }} + steps: + - uses: actions/checkout@v3 + - name: Download the issue template + run: curl -s https://raw.githubusercontent.com/meilisearch/core-team/main/issue-templates/changelog-issue.md > $ISSUE_TEMPLATE + - name: Replace all empty occurences in the templates + run: | + # Replace all <> occurences + sed -i "s/<>/$MILESTONE_VERSION/g" $ISSUE_TEMPLATE + + # Replace all <> occurences + milestone_id=$(echo $MILESTONE_URL | cut -d '/' -f 7) + sed -i "s/<>/$milestone_id/g" $ISSUE_TEMPLATE + - name: Create the issue + run: | + gh issue create \ + --title "Create release changelogs for $MILESTONE_VERSION" \ + --label 'impacts docs,documentation' \ + --body-file $ISSUE_TEMPLATE \ + --milestone $MILESTONE_VERSION \ + --assignee curquiza + +# ---------------- +# MILESTONE CLOSED +# ---------------- + + create-release-label: + if: github.event.action == 'closed' + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.MEILI_BOT_GH_PAT }} + MILESTONE_VERSION: ${{ github.event.milestone.title }} + MILESTONE_DUE_ON: ${{ github.event.milestone.due_on }} + steps: + - uses: actions/checkout@v3 + - name: Create the $MILESTONE_VERSION label + run: | + label_description="PRs/issues solved in $MILESTONE_VERSION" + if [[ ! -z $MILESTONE_DUE_ON ]]; then + date=$(echo $MILESTONE_DUE_ON | cut -d 'T' -f 1) + label_description="$label_description released on $date" + fi + + gh api repos/curquiza/meilisearch/labels \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -f name="$MILESTONE_VERSION" \ + -f description="$label_description" \ + -f color='ff5ba3' + + labelize-all-milestone-content: + if: github.event.action == 'closed' + needs: create-release-label + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.MEILI_BOT_GH_PAT }} + MILESTONE_VERSION: ${{ github.event.milestone.title }} + steps: + - uses: actions/checkout@v3 + - name: Add label $MILESTONE_VERSION to all PRs in the Milestone + run: | + prs=$(gh pr list --search milestone:"$MILESTONE_VERSION" --limit 1000 --state all --json number --template '{{range .}}{{tablerow (printf "%v" .number)}}{{end}}') + for pr in $prs; do + gh pr $pr edit --add-label $MILESTONE_VERSION + done + - name: Add label $MILESTONE_VERSION to all issues in the Milestone + run: | + issues=$(gh issue list --search milestone:"$MILESTONE_VERSION" --limit 1000 --state all --json number --template '{{range .}}{{tablerow (printf "%v" .number)}}{{end}}') + for issue in $issues; do + gh issue edit $issue --add-label $MILESTONE_VERSION + done