diff --git a/.github/workflows/release-bot.yml b/.github/workflows/release-bot.yml new file mode 100644 index 0000000..6c83342 --- /dev/null +++ b/.github/workflows/release-bot.yml @@ -0,0 +1,103 @@ +name: release bot +on: + schedule: + - cron: 0 5 * * 1 + workflow_dispatch: null +jobs: + release-conditions-check: + name: release conditions check + runs-on: ubuntu-20.04 + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: check if relese is needed + run: > + echo 'COMMITS_NUMBER='$(git rev-list $(echo $(git tag --sort=-taggerdate | + head -n 1))..HEAD --count) >> $GITHUB_ENV + echo vars.RELEASE_THRESHOLD + echo $(git rev-list $(echo $(git tag --sort=-taggerdate | head -n 1))..HEAD --count) + if [ $(git rev-list $(echo $(git tag --sort=-taggerdate | head -n 1))..HEAD --count) -lt vars.RELEASE_THRESHOLD ]; then + exit 1; + fi + - name: Generate token + id: generate_token + uses: tibdex/github-app-token@021a2405c7f990db57f5eae5397423dcc554159c + with: + app_id: ${{ secrets.MR_AVOCADO_ID }} + installation_id: ${{ secrets.MR_AVOCADO_INSTALLATION_ID }} + private_key: ${{ secrets.MR_AVOCADO_PRIVATE_KEY }} + - name: Get Discussion ID and maintainers + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} + run: > + discussion_data=$(gh api graphql -f query='{ + search(first: 100, query: "repo:richtja/autils is:open category:Release-decision", type: DISCUSSION) { + nodes { + ... on Discussion { + id createdAt + } + } + } + }' ) + + echo 'DISCUSSION_ID='$(echo $discussion_data | jq .data.search.nodes[0].id) >> $GITHUB_ENV + + echo 'NEW_COMMITS='$(git log --since="$(echo $discussion_data | jq .data.search.nodes[0].createdAt)" --pretty=oneline) >> $GITHUB_ENV + + usr_names=() + + for utils_meta in ./metadata/autils/*/; do + for metadata_file in $utils_meta*.yml; do + 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 + - name: Create release discussion + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} + run: > + if [ "x$DISCUSSION_ID" = "x" ]; then + gh api graphql -f query='mutation { + createDiscussion(input: { + repositoryId: "R_kgDOIoJP1Q", + categoryId: "DIC_kwDOIoJP1c4CXh5I", + body: "Hello all,\n + Autils reached threshold of 100 commits from the latest release + now we have $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. + Thank you.\n + This vote is meat only for maintainers: ${USR_NAMES[@]}", + title: "Release decision"}) { + + discussion { + id + } + } + } + ' + fi + - name: Add comment to discussion + env: + GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} + run: > + if [ "x$DISCUSSION_ID" = "x" ]; then + gh api graphql -f query='mutation { + addDiscussionComment(input: { + discussionId: "$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 + New commits from the beginning of the voting: $NEW_COMMITS + \nThis vote is meat only for maintainers: ${USR_NAMES[@]}"}) { + + comment { + id + } + } + } + ' + fi