Skip to content

ohyecloudy/slab

Repository files navigation

slab

https://travis-ci.org/ohyecloudy/slab.svg?branch=master

slack + gitlab.

gitlab API를 사용해 귀찮은 일을 덜어주는 slack 봇. 외부에서 접근이 불가능한 gitlab 서버를 운영하고 있을 때, 필요한 기능을 구현했다. 봇은 외부 내부 둘 다 접근 가능한 곳에서 실행해야 한다.

시작하기

준비

$ git clone https://github.com/ohyecloudy/slab.git ~/slab

git clone.

$ cp config/_config.exs config/config.exs
$ emacs config/config.exs

config.exs 설정 파일 업데이트.

로컬 실행

$ script/server

docker로 실행

$ script/server-docker

인자가 없으면 timezone을 Asia/Seoul로 설정한다.

$ script/server-docker Europe/Oslo

인자는 List of tz database time zones를 참고한다.

prometheus, grafana와 같이 실행

$ script/server-with-metrics

실행 후 http://localhost:3000/ 주소를 방문하면 grafana를 확인할 수 있다.

vagrant로 실행

$ vagrant up

기능

@slab help

명령어가 궁금하면 입력.

조금 부족한 gitlab issue preview

docs/image/poor_unfurling.png

gitlab issue 링크일 경우 봇이 preview를 제공한다.

config :slab, enable_poor_gitlab_issue_purling: true

config/config.exs 설정 파일에서 사용 여부를 결정할 수 있다.

조금 부족한 이유

docs/image/slack_app_unfurling.png

slack은 gitlab issue URL을 감지해서 preview를 제공한다.

호스팅하는 gitlab을 외부 망에서 접근할 수 없다면 slack이 제공하는 gitlab issue preview는 사용 못한다. 대신 bot이 gitlab issue preview를 메시지로 뿌려준다.

Slack app unfurling 기능을 사용하면 URL 밑에 깔끔한 preview를 붙일 수 있지만 events api에 응답할 수 있어야 한다. slab 봇과 통신할 수 있는 event 웹서버를 외부에 하나 더 구축해야 한다.

gitlab issue 조회

docs/image/issue_query.png

elixir map을 List project issues Gitlab API의 query string으로 변환한다.

labels=foo,bar&state=opened

이런 query string을 사용하고 싶다면

@slab issues %{"labels" => "foo,bar", "state" => "opened"}

slack 채널에서 이렇게 입력하면 된다.

pagination 지원

docs/image/pagination_1.png

docs/image/pagination_2.png

20개씩 표시. 다음 페이지를 조회할 수 있는 옵션을 안내한다.

Attachment limits

Please limit your messages to contain no more than 20 attachments to provide the best user experience.

- Attaching content and links to messages

slack attachments 개수 제한이 20개.

merge request가 없는 commit 조회

docs/image/commits_without_mr_1.png

@slab commits-without-mr --date -1
@slab commits-without-mr --date 2018-06-27

해당 날짜에 master 브랜치에 머지한 커밋 중 연관된 merge request가 없는 commit을 출력한다. 오늘을 기준으로 한 delta days 입력도 가능하다. -1은 어제.

docs/image/commits_without_mr_2.png

@slab commits-without-mr 오종빈 ohyecloudy --date 2018-06-27

조회할 유저를 지정할 수 있다.

self merge 조회

docs/image/self_merge_1.png

@slab self-merge --date -1
@slab self-merge --date 2018-06-27

해당 날짜에 업데이트된 merge request 중 self merge를 한 merge request를 조회한다. 생성한 사람과 머지한 사람이 같으면 self merge로 판단한다. 오늘을 기준으로 한 delta days 입력도 가능하다. -1은 어제.

@slab self-merge 오종빈 ohyecloudy --date 2018-06-27

조회할 유저를 지정할 수 있다.

복잡한 명령어를 대체하는 alias

docs/image/alias.png

config :slab, :aliases,
  열린이슈!: "issues %{\"state\" => \"opened\"}",
  닫힌이슈!: "issues %{\"state\" => \"closed\"}"

config.exs 파일에 alias를 등록할 수 있다.

master 권한 설정

config :slab, masters: ["ohyecloudy"]

config.exs 파일에 master 권한을 추가할 수 있다. master 권한을 가진 유저만 실행할 수 있는 명령어가 존재한다. 명령어마다 권한 설정은 지원하지 않는다.

masters 설정이 없으면 모든 유저가 master 권한이 필요한 명령어를 실행할 수 있다.

protected branches 접근 레벨 변경

docs/image/protected_branches_1.png

@slab branch-access --branch master --level no

protected branches 접근 레벨을 변경할 수 있다. 레벨 값으로 no, developer, maintainer, admin 문자를 사용할 수 있다.

master 권한을 가진 유저만 실행할 수 있다.

pipeline 상태 조회

docs/image/pipelines_1.png

@slab pipelines --branch master

pipeline 상태를 조회할 수 있다.

docs/image/pipelines_2.png

pipeline이 실패한 경우 마지막으로 성공한 파이프라인과 마지막으로 실패한 파이프라인 정보를 출력한다.

# config.exs
config :slab,
  pipeline_custom_filter: fn %{"duration" => duration, "status" => status} ->
    cond do
      status == "failed" ->
        true

      status == "running" ->
        true

      # 5분 이상 걸린 pipeline
      duration && duration > 300 ->
        true

      true ->
        false
    end
  end

config.exs 파일에서 커스텀 필터를 정의할 수 있다. 커스텀 필터를 통과한 파이프라인에서 성공, 실패, 실행 중 파이프라인을 골라낸다.

pipeline 상태 변경을 slack 채널에 통보

docs/image/pipeline_watcher_1.png

config에 설정한 시간 간격으로 파이프라인 상태 변경을 감지해서 통보한다.

# :pipeline_watcher 설정이 없으면 파이프라인 감시 기능이 꺼진다
config :slab, :pipeline_watcher,
  # 파이프라인 상태를 감시할 브랜치 이름 리스트
  target_branch_list: ["master", "dev"],
  # polling 주기
  poll_changes_interval_ms: 1000 * 60 * 10,
  # 결과를 통보할 slack 채널 이름
  notify_stack_channel_name: "#general"

config.exs 파일에서 파이프라인 감시 관련 설정을 한다.

@slab pipeline-watcher start
@slab pipeline-watcher stop

파이프라인 상태 변경 감시를 수동으로 켜고 끌 수 있다.

관련 issue 정보를 같이 출력하는 merge request preview

docs/image/merge_request.png

gitlab merge request 링크일 경우 봇이 preview를 제공한다.

config :slab, enable_poor_gitlab_mr_purling: true

config/config.exs 설정 파일에서 사용 여부를 결정할 수 있다.

config :slab,
  merge_request_filename_descriptor: fn path ->
    case Path.basename(path) do
      "Dockerfile" -> ":whale:"
      _ -> nil
    end
  end

config/config.exs 설정으로 변경된 파일에 대한 설명을 넣을 수 있다.

due date 이슈 정보를 DM(direct Message)으로 멤버들에게 알림

docs/image/due_date_1.png

채널에는 멤버를 멘션하지 않고 gitlab id와 due date 이슈를 출력한다.

docs/image/due_date_2.png

DM으로 멤버에게 상세하게 due date 이슈를 알려준다.

@slab due-date 명령을 입력하면 gitlab_slack_ids 설정에 있는 모든 gitlab username에 대해 due date 이슈 정보를 출력한다.

config :slab, gitlab_slack_ids: [{"ohyecloudy", "UAWVA837B"}, ...]

config/config.exs 설정 파일에서 gitlab username과 slack member id를 정의해야 한다. 이 정보로 해당 slack member를 멘션해서 due date 이슈 정보를 알려준다.

출력 정보

  • due date가 지난 이슈
  • due date가 오늘인 이슈
  • due date가 앞으로 일주일 내인 이슈
  • 시작한 마일스톤 이슈인데, due date를 설정 안 한 이슈

참고