name: Notify Slack channel based on new issue label on: issues: types: [labeled] jobs: config: runs-on: "ubuntu-latest" outputs: has-secrets: ${{ steps.check.outputs.has-secrets }} steps: - name: "Check for secrets" id: check shell: bash run: | if [ -n "${{ (secrets.SLACK_WEBHOOK_URL != '') || '' }}" ]; then echo "has-secrets=1" >> "$GITHUB_OUTPUT" fi notify: needs: config if: needs.config.outputs.has-secrets runs-on: ubuntu-latest steps: - name: "Download teams.yml to know which label is for which team" run: wget https://raw.githubusercontent.com/grafana/grafana/main/.github/teams.yml - name: "Determine which team to notify" run: | # Default to null values. CHANNEL="null" TEAM="null" echo "${{ github.event.label.name }} label added" export CURRENT_LABEL="${{ github.event.label.name }}" # Enable the use of the label in yq evaluations # yq is installed by default in ubuntu-latest if [[ $(yq e 'keys | .[] | select(. == env(CURRENT_LABEL))' teams.yml ) ]]; then # Check if we have a channel set to notify on comments. if [[ $(yq '.[env(CURRENT_LABEL)] | has("channel-label")' teams.yml ) == true ]]; then CHANNEL=$(yq '.[env(CURRENT_LABEL)].channel-label' teams.yml) echo "Ready to send issue to channel ID ${CHANNEL}" fi if [[ $(yq '.[env(CURRENT_LABEL)] | has("exclude-github-team")' teams.yml ) == true ]]; then TEAM=$(yq '.[env(CURRENT_LABEL)].exclude-github-team' teams.yml) echo "Will not send issue to channel if issue author is part of the team ${TEAM}" fi fi # set environment for next steps echo "CHANNEL=${CHANNEL}" >> $GITHUB_ENV echo "TEAM=${TEAM}" >> $GITHUB_ENV - name: "Prepare payload" uses: frabert/replace-string-action@v2.0 id: preparePayload with: # replace double quotes with single quotes to avoid breaking the JSON payload sent to Slack string: ${{ github.event.issue.title }} pattern: '"' replace-with: "'" flags: 'g' - name: Get Token id: get_workflow_token uses: peter-murray/workflow-application-token-action@v2 with: application_id: ${{ secrets.APP_GRAFANA_TEAM_CHECKER_ID }} application_private_key: ${{ secrets.APP_GRAFANA_TEAM_CHECKER_KEY }} - name: "Check that issue author is not part of the team" if: ${{ env.TEAM != 'null' }} run: | response=$(gh api /orgs/grafana/teams/${{ env.TEAM }}/memberships/${{ github.event.issue.user.login }} -i -H "Accept: application/vnd.github.v3+json") STATUS_CODE=$(echo "$response" | head -n 1 | cut -d' ' -f2) if [ "$status_code" -eq 404 ]; then echo "The user was not found in the team." echo "USER_FOUND=false" >> $GITHUB_ENV else echo "The user was potentially found in the team" echo "USER_FOUND=maybe" >> $GITHUB_ENV fi env: GITHUB_TOKEN: ${{ steps.get_workflow_token.outputs.token }} - name: "Send Slack notification" if: ${{ (env.CHANNEL != 'null') && ((env.USER_FOUND == 'false') || (env.TEAM != 'null')) }} uses: slackapi/slack-github-action@v1.24.0 with: payload: > { "icon_emoji": ":grafana:", "username": "Grafana issue labeled", "text": "Issue \"${{ steps.preparePayload.outputs.replaced }}\" labeled \"${{ github.event.label.name }}\": ${{ github.event.issue.html_url }}, please triage.", "channel": "${{ env.CHANNEL }}" } env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}