티스토리 뷰

1. 개요


Phabricator와 같은 software development platform을 사용할 때 가장 중요한 것 중 하나가 알림 기능이다. 하루에 수십개 이상 업데이트 되는 경우 이를 해당 사람들에게 적절하게 알려주지 못한다면 활용성은 떨어질 수 밖에 없다.


일반적인 방법은 author(task 생성한 사람)과 assignee(task 작업 담당자) 이외에 알림이 필요한 사람을 subscribers에 추가하거나 사용자가 등록된 project를 추가하면 된다(Phabricator를 처음 사용할 때 project개념이 조금 혼동이 될 수 있는데, 권한 설정, 사용자 그룹, 라벨 기능 등을 하나로 합친 개념이다).

Phabricator를 사용하는 팀이 작다면 mailinglist처럼 모든 issue에 대해서 모두에게 알림을 받도록 설정할 수도 있다.


Phabricator에서 알림을 받는 방법은 다음과 같다. 

- E-mail

Phbricator Notification

Phabricator Dashboard를 이용한 최근 변경 내용 표시

- Web browser의 Desktop Notification 연동


Desktop Notification 설정해 놓으면 task가 업데이트 될 때 마다 바로바로 desktop의 알림 기능으로 알려주어 좋긴하나 잦은 알림은 업무에 방해가 되고, e-mail은 웹 메일러로 보는 경우 일일이 보기가 번거롭다. Phabricator Dashboard가 그나마 업무를 방해하지 않고, 해당 내용의 일부도 main page에서 바로 볼 수 있어 가장 무난한 방식인 것 같다.


요즘 많은 업체들이 Slack을 사용하고 있는데 slack 채널에 연동하여 알림을 하는 것도 좋은 방법이다. 구글링을 해보면 phabulousph-slackphabricator-slack-feed 등 몇몇 관련 프로젝트가 있다. 이들의 기능은 기본적으로 slack의 특정 채널에 Fabricator Notification 과 유사한 방식으로 알림을 하는 것이다.


2. Phabricator2Slack


이들을 팀 업무에 적용하기에는 무언가 부족한 것 같아 node.js 를 이용하여 직접 만들어서 사용하였다. 

Phabricator2slack in github


기본적인 구현은 다음과 같다. 

- Maniphest(issue task)는 아래와 같은 형식으로 지정된 slack 채널에 개시된다. 

  * 작성자 구분이 편하도록 slack 계정의 icon과 name을 찾아 아래 예처럼 ‘xxx bot’처럼 이름을 붙이고, icon 붙여주기(phabricator ID와 slack 이름이 동일하여야 함)

  * 해당 phabricator 링크와 제목을 표시

  * 제목 아래에는 author, assignee, subscriber로 추가된 ID와 project 참가자를 모두 나열 (이렇게 하면 채널에 자신과 관련된 issue가 있으면 채널에 아이콘으로 개수를 보여주어 좋음)

  * 본문을 아래에 표시

  * 또한 본문에 @alan 처럼 표기를 하면 slackbot을 통하여 해당 사용자에게 DM으로 전송. 답변이 필요한 코멘트 구분. 


- Phriction(wiki)은 작성 버전을 추가로 표시

  * diff만을 보여주면 좋을 텐데 이 부분을 깔끔하게 보이기 힘들어 전문을 첨부



- Git도 유사한 방식으로 git link와 comment를 표시 


이렇게 설정하여 운영을 해보니 기존에 e-mail이나 desktop notification에 비하여 여러모로 편리하다. 

특히 slack의 똘똘한 알림 기능으로 업무에 집중할 때는 방해받지 않고, DM과 채널 알림을 통하여 밀린 이슈들에 대해서 놓칠 가능성도 줄이고, 무엇보다도 쉽고 빠르게 알림을 받을 수 있다는 것이다. 



3. Phabricator http-hook, conduit and Slack


위 기능은 Phabricator의 http-hook과 conduit HTTP API를 이용하여 구현한 것이다. 다른 slack 연동 프로젝트도 모두 동일한 방식을 이용한다. 

Http-hook은 Phabricator에 상태 변화가 있을 때 마다 관련 정보를 HTTP POST request를 요청해준다. Node.js web server를 이용하여 이 hook message를 받아서 slack과 연동을 한 것이다. 


Http-hook으로 알림을 받았을 때 이를 Phabricator conduit HTTP API를 이용하여 상세한 정보를 요청할 수 있다. Conduit은 간단하게 JSON-RPC라고 할 수 있다. 이를 이용하면 관련 변동내역에 대해서 세부적인 정보를 얻어올 수 있다. API는 maniphest에 대해서는 잘 만들어져 있으나 phrication(wiki)과 같이 추가 기능에 대해서는 아직 API로 얻을 수 있는 정보가 제한적이다. 필요하면 직접 수정해서 phabricator프로젝트에 참여해 보는 것도 괜찮을 듯…


이렇게 해서 얻어온 정보는 Botkit 를 이용하여 원하는 slack 채널로 전송한다. 좀더 잘 만든다면 이를 이용하여 사용자와 interactive하게 갖추면 좋을 듯 하다. 예를 들면 바로 slack을 통하여 phabricator comment를 달거나 status를 변경하기… 


4. 설치 방법

- Phabricator에 conduit을 사용할 bot 계정을 생성한다 (People->Create New User->Create Bot User)


- 생성된 bot 계정의 Conduit 용 API token을 생성한다(Manage->Edit Settings->Conduit API Tokens->Generate API Token).

  * 일반 사용자 계정에 conduit API token을 만들어도 문제는 없다. API를 별도로 기록해 둔다. 


- Slack API를 참고하여 bot 계정을 만들고 API 키를 생성한다. 


github에서 소스를 다운로드 받는다. 

$ git clone git@github.com:aqwerf/phabricator2slack.git

$ cd phabricator2slack


- config.js.sample을 config.js로 복사한다. 


- config.js의 항목을 적절히 수정한다. 

  * phabricator.base: Phabricator의 URL 주소(예: https://phabricator.test.com/)

  * phabricator.token: conduit 접근을 위한 API token 

  * slack.token: slack API token

  * slack.maniphestDM: true면 본문에 @alan과 같이 명시하면 해당 slack계정에 direct message로도 전송하기 (true, false)

  * slack.maniphestChannel: maniphest issue를 올릴 slack 채널  (예: #phabricator)

  * slack.phrictionChannel: phriction(wiki)용 채널 (예: #phabricator)

  * slack.diffusionChannel: diffusion(git)용 채널  (예: #git)

  * slack.defaultChanne: 위 3개 이외의 event를 올릴 채널


- npm update를 하여 필요한 패키지를 모두 받는다. 

$ npm update


- 데몬용으로 죽어도 계속 돌리도록 하려면 forever 패키지를 이용한다. 

$ sudo npm install -g forever 


- nodejs index.js 를 실행하거나 데몬처럼 돌리려면 아래처럼 실행한다. 

$ forever start -l ./forever.log -o ./p2s.log -e ./log.err index.js


- 다시 phabricator로 가서 feed.http-hooks에 위 node.js 주소를 적는다 (Config->Feed->feed.http-hooks). 

  * phabricator와 같은 서버에서 돌리는 경우 "http://localhost:8085/v1/feed/receive" 처럼 적으면 된다.


이렇게 한 후 phabricator의 maniphest를 수정하고 관련 설정이 slack으로 가는지 확인해 본다.

물론 사용전에 해당 slack 채널은 생성되어 있어야 한다. 문제가 있는 경우 log을 확인하여 디버깅 하여야 한다. 



5. 정리


업무에 사용하기 위하여 간이로 만든것이라 깔끔하지는 않지만 이를 기반으로 수정해서 사용한다면 phabricator의 활용성을 높일 수 있을 것이다. 

이를 좀 더 보완하여 고객지원을 위한 사람들 전용으로 기능을 확장하려고 하는데, 언제 할 수 있을 지 잘 모르겠다. 방법은 특정 project의 maniphest 항목에 대해서는 별도의 채널을 통하여 알림을 하면 될 것 같은데…



댓글
댓글쓰기 폼