diff --git a/.github/workflows/release-bot.yml b/.github/workflows/release-bot.yml index 11417f8..b6dcb7e 100644 --- a/.github/workflows/release-bot.yml +++ b/.github/workflows/release-bot.yml @@ -5,6 +5,7 @@ on: workflow_dispatch: null jobs: release-vote: + permissions: write-all name: release vote runs-on: ubuntu-20.04 steps: @@ -55,20 +56,21 @@ jobs: usr_names+=("@$(sed -n '/github_usr_name:[[:space:]]*\([^[:space:]]\+\)/{s/github_usr_name:[[:space:]]*//;s/[[:space:]]//g;p;q;}' $metadata_file)") done done - echo 'USR_NAMES='$(echo "${usr_names[@]}" | tr ' ' '\n' | sort -u) >> $GITHUB_ENV + echo 'TIME_FOR_RELEASE=0' >> $GITHUB_ENV - name: Create release discussion if: ${{ env.TIME_FOR_VOTE == 1 }} env: GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} run: | - if [[ "${{ env.DISCUSSION_ID }}" = "null" ]]; then + if [[ ${{ env.DISCUSSION_ID }} = "null" ]]; then gh api graphql -f query='mutation { createDiscussion(input: { repositoryId: ${{ vars.REPOSITORY_ID }}, categoryId: ${{ vars.CATEGORY_ID }}, body: "Hello all, - Autils reached threshold of ${{ vars.RELEASE_THRESHOLD }} commits from the latest release and now we have ${{ env.COMMITS_NUMBER }} commits from the latest release. Therefore, it is time to vote if new release is needed. Please use :+1: or :-1: for this discussion to vote. + Autils reached threshold of ${{ vars.RELEASE_THRESHOLD }} commits from the latest release and now we have ${{ env.COMMITS_NUMBER }} commits from the latest release. Therefore, it is + time to vote if new release is needed. Please use :+1: for this discussion if you agree with the release. The release will be run when all maintainers will :+1:. Thank you.\n\nThis vote is meat only for maintainers: ${{ env.USR_NAMES }}", title: "Release decision"}) { @@ -79,17 +81,58 @@ jobs: } ' fi + - name: Count votes + if: ${{ env.TIME_FOR_VOTE == 1 }} + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} + run: | + if [[ ${{ env.DISCUSSION_ID }} != "null" ]]; then + readarray -t usr_names <<< "${{ env.USR_NAMES }}" + thumbs_up_users=$(gh api graphql -f query='{ + node(id: ${{ env.DISCUSSION_ID }}) { + ... on Discussion { + reactions(content:THUMBS_UP, first:50) { + nodes{ + createdAt + user { + login + } + } + } + } + } + }' | jq .data.node.reactions.nodes[].user.login | sort | tr -d '"') + missing_votes=($(comm -23 <(echo "${usr_names[@]}" | tr -d '@') <(echo "${thumbs_up_users[@]}"))) + if [ "${#missing_votes[@]}" -eq 0 ]; then + gh api graphql -f query='mutation { + closeDiscussion(input: { + discussionId: ${{ env.DISCUSSION_ID }}}) { + + discussion { + id + } + } + }' + echo "It is time for release." + echo 'TIME_FOR_RELEASE=1' >> $GITHUB_ENV + else + echo "We don't have enought votes." + fi + + echo 'MISSING_VOTES_NAMES='$(printf '@%s' "${missing_votes[@]}" | tr ' ' '\n' | sort -u) >> $GITHUB_ENV + fi - name: Add comment to discussion if: ${{ env.TIME_FOR_VOTE == 1 }} env: GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} run: | - if [[ "${{ env.DISCUSSION_ID }}" != "null" ]]; then + if [[ ${{ env.DISCUSSION_ID }} != "null" && ${{ env.TIME_FOR_RELEASE }} == 0 ]]; then gh api graphql -f query='mutation { addDiscussionComment(input: { discussionId: ${{ env.DISCUSSION_ID }}, - body: "This is a kindly reminder of ongoing release voting. Please use :+1: or :-1: for this discussion to vote. - Thank you.\n\nNew commits from the beginning of the voting: ${{ env.NEW_COMMITS }}\nThis vote is meat only for maintainers: ${{ env.USR_NAMES }}"}) { + body: "This is a kindly reminder of ongoing release voting. Please use :+1: or for this discussion to vote. + Thank you.\n\nNew commits from the beginning of the voting: ${{ env.NEW_COMMITS }} + The maintainers who have not voted yet: ${{ env.MISSING_VOTES_NAMES }}"}) { comment { id @@ -98,3 +141,9 @@ jobs: } ' fi + - name: Release + if: ${{ env.TIME_FOR_RELEASE == 1 }} + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} + run: | + echo 'RELEASE'