From 602e846f64082182908b3333c5e26907fa7265a1 Mon Sep 17 00:00:00 2001 From: Nikita Belonogov Date: Wed, 29 Nov 2023 03:10:18 +0400 Subject: [PATCH] ci: PLATE-675: Add /jira chatops command --- .github/workflows/jira-command.yml | 97 ++++++++++++++++++++ .github/workflows/slash-command-dispatch.yml | 57 ++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 .github/workflows/jira-command.yml create mode 100644 .github/workflows/slash-command-dispatch.yml diff --git a/.github/workflows/jira-command.yml b/.github/workflows/jira-command.yml new file mode 100644 index 00000000..bde6b9c8 --- /dev/null +++ b/.github/workflows/jira-command.yml @@ -0,0 +1,97 @@ +name: "/git command" + +on: + repository_dispatch: + types: [ jira-command ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.client_payload.github.payload.issue.number }}-${{ github.event.client_payload.slash_command.command }}-${{ github.event.client_payload.slash_command.args.unnamed.arg1 || github.event.client_payload.slash_command.args.all }} + +jobs: + create: + if: ${{ github.event.client_payload.slash_command.args.unnamed.arg1 == 'create' }} + runs-on: ubuntu-latest + timeout-minutes: 3 + steps: + - uses: hmarr/debug-action@v2.1.0 + + - name: Check user's membership + uses: actions/github-script@v7 + id: check-membership + env: + ACTOR: ${{ github.actor }} + with: + github-token: ${{ secrets.GIT_PAT }} + script: | + const { repo, owner } = context.repo; + const actor = process.env.ACTOR; + const { data: membership } = await github.rest.orgs.getMembershipForUser({ + org: owner, + username: actor, + }); + if (membership.state != "active") { + const error = `Unfortunately you don't have membership in ${owner} organization, Jira Issue was not created`; + core.setOutput("error", error); + core.setFailed(error); + } + + - name: Checkout Actions Hub + uses: actions/checkout@v4 + with: + token: ${{ secrets.GIT_PAT }} + repository: HumanSignal/actions-hub + path: ./.github/actions-hub + + - name: Jira Create Issue + id: jira-create-issue + uses: ./.github/actions-hub/actions/jira-create-issue + with: + jira_server: ${{ vars.JIRA_SERVER }} + jira_username: ${{ secrets.JIRA_USERNAME }} + jira_token: ${{ secrets.JIRA_TOKEN }} + summary: ${{ github.event.client_payload.github.payload.issue.title }} + description: ${{ github.event.client_payload.github.payload.issue.body }} + project: ${{ github.event.client_payload.slash_command.args.unnamed.arg3 || 'TRIAG' }} + type: ${{ github.event.client_payload.slash_command.args.unnamed.arg2 || 'task' }} + + - name: Add reaction to command comment on success + uses: peter-evans/create-or-update-comment@v3 + with: + token: ${{ secrets.GIT_PAT }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + comment-id: ${{ github.event.client_payload.github.payload.comment.id }} + body: | + > Jira issue [${{ steps.jira-create-issue.outputs.key }}](${{ steps.jira-create-issue.outputs.link }}) is created + > + > [Workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + reactions: "+1" + + - name: Add reaction to command comment on failure + uses: peter-evans/create-or-update-comment@v3 + if: failure() + with: + token: ${{ secrets.GIT_PAT }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + comment-id: ${{ github.event.client_payload.github.payload.comment.id }} + body: | + > **Error**: failed to execute "${{ github.event.client_payload.slash_command.args.unnamed.arg1 }}" command + > ${{ steps.check-membership.outputs.error }} + > [Workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + reactions: "-1" + + help: + if: github.event.client_payload.slash_command.args.unnamed.arg1 == 'help' || !contains(fromJson('["create"]'), github.event.client_payload.slash_command.args.unnamed.arg1) + runs-on: ubuntu-latest + timeout-minutes: 1 + steps: + - name: Update comment + uses: peter-evans/create-or-update-comment@v3 + with: + token: ${{ secrets.GIT_PAT }} + repository: ${{ github.event.client_payload.github.payload.repository.full_name }} + comment-id: ${{ github.event.client_payload.github.payload.comment.id }} + body: | + > Command | Description + > --- | --- + > /jira create [task|bug|story] `PROJECT` | Create a Jira issue in project `PROJECT` + reaction-type: hooray diff --git a/.github/workflows/slash-command-dispatch.yml b/.github/workflows/slash-command-dispatch.yml new file mode 100644 index 00000000..7aa1f0f9 --- /dev/null +++ b/.github/workflows/slash-command-dispatch.yml @@ -0,0 +1,57 @@ +name: Slash Command Dispatch +on: + issue_comment: + types: [created] + +env: + commands_list: | + jira + +jobs: + slashCommandDispatch: + if: startsWith(github.event.comment.body, '/') + timeout-minutes: 1 + runs-on: ubuntu-latest + steps: + - uses: hmarr/debug-action@v2.1.0 + + - name: 'Validate command' + id: determine_command + uses: actions/github-script@v7 + env: + COMMANDS_LIST: ${{ env.commands_list }} + with: + github-token: ${{ secrets.GIT_PAT }} + script: | + const body = context.payload.comment.body.toLowerCase().trim() + const commands_list = process.env.COMMANDS_LIST.split("\n") + console.log("Detected PR comment: " + body) + console.log("Commands list: " + commands_list) + commandArray = body.split(/\s+/) + const contextCommand = commandArray[0].split('/')[1].trim(); + console.log("contextCommand: " + contextCommand) + core.setOutput('command_state', 'known') + if (! commands_list.includes(contextCommand)) { + core.setOutput('command_state', 'unknown') + core.setOutput('command', contextCommand) + } + + - name: Slash Command Dispatch + id: scd + if: ${{ steps.determine_command.outputs.command_state != 'unknown' }} + uses: peter-evans/slash-command-dispatch@v3 + with: + token: ${{ secrets.GIT_PAT }} + issue-type: "pull-request" + reactions: true + commands: ${{ env.commands_list }} + + - name: Edit comment with error message + if: ${{ steps.determine_command.outputs.command_state == 'unknown' }} + uses: peter-evans/create-or-update-comment@v3 + with: + comment-id: ${{ github.event.comment.id }} + body: | + > '/${{ steps.determine_command.outputs.command }}' is unknown command. + > See '/help' + reactions: eyes, confused