slab
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
gitlab issue 링크일 경우 봇이 preview를 제공한다.
config :slab, enable_poor_gitlab_issue_purling: true
config/config.exs
설정 파일에서 사용 여부를 결정할 수 있다.
조금 부족한 이유
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 조회
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 지원
20개씩 표시. 다음 페이지를 조회할 수 있는 옵션을 안내한다.
Attachment limits
Please limit your messages to contain no more than 20 attachments to provide the best user experience.
slack attachments 개수 제한이 20개.
merge request가 없는 commit 조회
@slab commits-without-mr --date -1 @slab commits-without-mr --date 2018-06-27
해당 날짜에 master 브랜치에 머지한 커밋 중 연관된 merge request가 없는 commit을 출력한다. 오늘을 기준으로 한 delta days 입력도 가능하다. -1은 어제.
@slab commits-without-mr 오종빈 ohyecloudy --date 2018-06-27
조회할 유저를 지정할 수 있다.
self merge 조회
@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
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 접근 레벨 변경
@slab branch-access --branch master --level no
protected branches 접근 레벨을 변경할 수 있다. 레벨 값으로 no
, developer
, maintainer
, admin
문자를 사용할 수 있다.
master 권한을 가진 유저만 실행할 수 있다.
pipeline 상태 조회
@slab pipelines --branch master
pipeline 상태를 조회할 수 있다.
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 채널에 통보
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
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)으로 멤버들에게 알림
채널에는 멤버를 멘션하지 않고 gitlab id와 due date 이슈를 출력한다.
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를 설정 안 한 이슈