ChatOps

ChatOps

GitLab ChatOps를 쓰면 Slack 같은 채팅 서비스를 통해 CI/CD job과 상호작용할 수 있어요. 팀과 일을 논의하면서 같은 앱 안에서 CI/CD job을 실행하고 출력을 확인할 수 있으니, 협업·트러블슈팅·업무 계획을 한곳에서 처리하기 좋습니다.

출처: 문서

본문

슬래시 명령(/) 통합을 활용하면 ChatOps를 트리거할 수 있어요. 사용 가능한 통합은 이렇게 두 가지입니다.

ChatOps 워크플로우와 CI/CD 구성 (ChatOps workflow and CI/CD configuration)

ChatOps는 프로젝트의 기본 브랜치에 있는 .gitlab-ci.yml에서 지정한 job을 찾아요. job을 찾으면 ChatOps가 그 job만 포함하는 파이프라인을 생성합니다. when: manual로 설정했다면 파이프라인은 만들어지지만 job이 자동으로 시작되지는 않아요.

ChatOps로 실행한 job은 GitLab에서 실행한 job과 기능이 동일해요. job은 GITLAB_USER_ID 같은 기존 CI/CD 변수로 추가 권한 검증을 할 수 있지만, 이 변수들은 덮어쓰기(override)도 가능해요.

job이 표준 CI/CD 파이프라인의 일부로 실행되지 않도록 rules를 설정해 두어야 해요. ChatOps가 job에 전달하는 CI/CD 변수는 이렇습니다.

  • CHAT_INPUTrun 슬래시 명령에 전달된 인자.
  • CHAT_CHANNEL — job이 실행되는 채팅 채널 이름.
  • CHAT_USER_ID — job을 실행하는 사용자의 채팅 서비스 ID.

job 실행 결과는 이렇게 전달돼요.

  • job이 30분 안에 완료되면 ChatOps가 job 출력을 채팅 채널로 보냅니다.
  • job이 30분을 넘겨 완료되면 Slack API 같은 방법을 써서 채널에 데이터를 보내야 해요.

ChatOps에서 job 제외하기 (Exclude a job from ChatOps)

채팅에서 실행되지 않도록 하려면 .gitlab-ci.yml에서 job을 except: [chat]으로 설정하면 돼요.

ChatOps 응답 커스터마이즈 (Customize the ChatOps reply)

ChatOps는 단일 명령으로 실행된 job의 출력을 채널에 응답으로 보냅니다. 예를 들어 다음 job이 실행되면 채팅 응답은 Hello world가 돼요.

stages:
- chatops

hello-world:
  stage: chatops
  rules:
    - if: $CI_PIPELINE_SOURCE == "chat"
  script:
    - echo "Hello World"

job에 명령이 여러 개 있거나 before_script가 설정되어 있다면, ChatOps는 명령과 그 출력을 채널로 보내요. 명령은 ANSI 색상 코드로 감싸집니다.

한 명령의 출력만 골라서 응답하고 싶다면 그 출력을 chat_reply 섹션에 넣으면 돼요. 다음 job은 현재 디렉터리의 파일 목록을 보여줍니다.

stages:
- chatops

ls:
  stage: chatops
  rules:
    - if: $CI_PIPELINE_SOURCE == "chat"
  script:
    - echo "This command will not be shown."
    - echo -e "section_start:$( date +%s ):chat_reply\r\033[0K\n$( ls -la )\nsection_end:$( date +%s ):chat_reply\r\033[0K"

ChatOps로 CI/CD job 실행하기 (Run a CI/CD job using ChatOps)

사전 요구사항은 이렇습니다.

  • 프로젝트에 대해 Developer, Maintainer, Owner 역할이 있어야 해요.
  • 프로젝트가 슬래시 명령 통합을 사용하도록 설정되어 있어야 해요.

Slack이나 Mattermost에서 기본 브랜치의 CI/CD job을 실행할 수 있습니다. CI/CD job을 실행하는 슬래시 명령은 프로젝트에 설정된 슬래시 명령 통합에 따라 달라져요.

  • GitLab for Slack 앱에서는 /gitlab <project-name> run <job name> <arguments>를 사용합니다.
  • Slack 또는 Mattermost 슬래시 명령에서는 /<trigger-name> run <job name> <arguments>를 사용합니다.

여기서 <job name>은 실행할 CI/CD job 이름, <arguments>는 CI/CD job에 전달할 인자, <trigger-name>은 Slack 또는 Mattermost 통합에 설정된 트리거 이름이에요. ChatOps는 지정한 job만 포함하는 파이프라인을 예약(schedule)합니다.

더 알아보기

ChatOps는 채팅 화면에서 CI/CD job을 바로 실행해 팀 협업을 이어간다는 점이 핵심이에요. 기본 브랜치의 .gitlab-ci.yml에 job을 정의하고 rules에서 $CI_PIPELINE_SOURCE == "chat"을 잡아주면 표준 파이프라인과 분리할 수 있습니다. 응답을 chat_reply 섹션으로 골라내는 방법을 익혀두면 채팅이 훨씬 깔끔해져요.