본문 바로가기
CI+CD/Slack 연동

Jenkins + Slack 연동 - 5 (dialog 띄우기 + Interactivity & Shortcuts 설정)

by salzzak 2024. 11. 29.
728x90

챗지피티가 짜준 dialog 띄우기 코드를 복붙해서 실행 시켜 보았다.

 

@app.route('/dialog', methods=['POST', 'GET'])
def dialog():
    trigger_id = request.form.get('trigger_id')  # 슬래시 명령어의 트리거 ID
    user_id = request.form.get('user_id')  # 슬랙 사용자 ID
    tmp_str = "ok to be seen"

    # 모달을 열기 위한 페이로드 생성
    dialog_payload = {
        "trigger_id": trigger_id,
        "view": {
            "type": "modal",
            "callback_id": "unittest_modal",
            "title": {
                "type": "plain_text",
                "text": "자동화 도구 모음"
            },
            "blocks": [
                {
                    "type": "input",
                    "block_id": "branch_block",
                    "element": {
                        "type": "plain_text_input",
                        "action_id": "branch_input",
                        "placeholder": {
                            "type": "plain_text",
                            "text": "Enter branch name"
                        }
                    },
                    "label": {
                        "type": "plain_text",
                        "text": f"Branch Name {tmp_str}"
                    }
                },
                {
                    "type": "input",
                    "block_id": "env_block",
                    "element": {
                        "type": "static_select",
                        "action_id": "env_select",
                        "placeholder": {
                            "type": "plain_text",
                            "text": "Select environment"
                        },
                        "options": [
                            {
                                "text": {
                                    "type": "plain_text",
                                    "text": "Staging"
                                },
                                "value": "staging"
                            },
                            {
                                "text": {
                                    "type": "plain_text",
                                    "text": "Production"
                                },
                                "value": "production"
                            }
                        ]
                    },
                    "label": {
                        "type": "plain_text",
                        "text": "Environment"
                    }
                }
            ],
            "submit": {
                "type": "plain_text",
                "text": "Submit"
            }
        }
    }

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {SLACK_BOT_TOKEN}"
    }

    response = requests.post(SLACK_API_URL, json=dialog_payload, headers=headers)

    if response.status_code == 200:
        return jsonify({"response_type": "ephemeral", "text": "Opening unit test dialog..."}), 200
    else:
        return jsonify({"response_type": "ephemeral", "text": "Failed to open dialog."}), 500


@app.route('/slack/interactions', methods=['POST'])
def handle_interactions():
    # Slack은 x-www-form-urlencoded 형식으로 데이터를 보냄
    payload = json.loads(request.form.get('payload'))

    if payload.get('type') == 'view_submission':
        callback_id = payload['view']['callback_id']

        if callback_id == 'unittest_modal':
            values = payload['view']['state']['values']
            branch_name = values['branch_block']['branch_input']['value']
            environment = values['env_block']['env_select']['selected_option']['value']
            user_id = payload['user']['id']

            # 외부 API 호출
            call_external_api(branch_name, environment, user_id)
            return jsonify({"response_action": "clear"})
    
    return "", 200

 

 

Slack > slash command 명령어 실행 시

 

모달창이 뜨긴하는데, Submit 버튼 선택 시

 

 

에러가 발생된다.

 

 

Interactivity & Shortcuts 이 OFF 상태여서 그런듯 한데,

다음과 같이 자신의 서버 + /slack/interaction 을 Request URL 로 작성해준다. (/slack/interaction 부분은 코드와 맞추면 된다.)

 

 

이후 다시, 코드에서 입력한 값을 잘 받아오는지 확인하기 위해 print 문을 넣어주고...

 

한번더 슬래시 커맨드 > 모달 입력 시

 

모달에 입력한 값을 잘 가져옴을 확인할수 있다.

댓글