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
$ script/server-docker
인자가 없으면 timezone을 Asia/Seoul로 설정한다.
$ script/server-docker Europe/Oslo
인자는 List of tz database time zones를 참고한다.
$ script/server-with-metrics
실행 후 http://localhost:3000/ 주소를 방문하면 grafana를 확인할 수 있다.
$ vagrant up
@slab help
명령어가 궁금하면 입력.
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 웹서버를 외부에 하나 더 구축해야 한다.
elixir map을 List project issues Gitlab API의 query string으로 변환한다.
labels=foo,bar&state=opened
이런 query string을 사용하고 싶다면
@slab issues %{"labels" => "foo,bar", "state" => "opened"}
slack 채널에서 이렇게 입력하면 된다.
20개씩 표시. 다음 페이지를 조회할 수 있는 옵션을 안내한다.
Attachment limits
Please limit your messages to contain no more than 20 attachments to provide the best user experience.
slack attachments 개수 제한이 20개.
@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
조회할 유저를 지정할 수 있다.
@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
조회할 유저를 지정할 수 있다.
config :slab, :aliases,
열린이슈!: "issues %{\"state\" => \"opened\"}",
닫힌이슈!: "issues %{\"state\" => \"closed\"}"
config.exs
파일에 alias를 등록할 수 있다.
config :slab, masters: ["ohyecloudy"]
config.exs
파일에 master 권한을 추가할 수 있다. master 권한을 가진 유저만 실행할 수 있는 명령어가 존재한다. 명령어마다 권한 설정은 지원하지 않는다.
masters
설정이 없으면 모든 유저가 master 권한이 필요한 명령어를 실행할 수 있다.
@slab branch-access --branch master --level no
protected branches 접근 레벨을 변경할 수 있다. 레벨 값으로 no
, developer
, maintainer
, admin
문자를 사용할 수 있다.
master 권한을 가진 유저만 실행할 수 있다.
@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
파일에서 커스텀 필터를 정의할 수 있다. 커스텀 필터를 통과한 파이프라인에서 성공, 실패, 실행 중 파이프라인을 골라낸다.
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
파이프라인 상태 변경 감시를 수동으로 켜고 끌 수 있다.
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
설정으로 변경된 파일에 대한 설명을 넣을 수 있다.
채널에는 멤버를 멘션하지 않고 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를 설정 안 한 이슈