Tag Archives: trac

Trac report #2 사용자별 최근변경사항

사용자별 최근 변경 사항 보는데 Trac report 만드는게 쉽지 않더군요. 더 쉬운 방법이 있는지 잘 모르겠지만… SQL 잘 하시는 분의 도움을 받아 만든 쿼리입니다. 저는 SQL을 잘게 짤라서 만드는 편인데, SQL 조금 복잡해지면 어렵고, 최적화도 어려워지죠.. 사용자 아이디와 출력되는 갯수가 하드코딩 되어야 해서 좀 그렇긴 하지만… 그래도 원하는대로 출력은 잘 해줍니다.

[code]
select
  p.value AS __color__,
  owner AS __group__,
  id AS ticket,
  (CASE status WHEN ‘assigned’ THEN owner||’ *’ ELSE owner END) AS owner,
  summary,
  component,
  priority,
  t.type AS type,
  status,
  time AS _created,
  changetime AS modified,
  description AS _description,
  reporter AS _reporter

from (

  select * from (SELECT * FROM ticket WHERE owner=’mix1009′ ORDER by changetime desc limit 0,5) u1

union

  select * from (SELECT * FROM ticket WHERE owner=’user2′ ORDER by changetime desc limit 0,5) u2

union

  select * from (SELECT * FROM ticket WHERE owner=’user3′ ORDER by changetime desc limit 0,5) u3

union

  select * from (SELECT * FROM ticket WHERE owner=’user4′ ORDER by changetime desc limit 0,5) u4

union

  select * from (SELECT * FROM ticket WHERE owner=’user5′ ORDER by changetime desc limit 0,5) u5

) t, enum p

where p.name = t.priority AND p.type = ‘priority’
order by owner, changetime desc
[/code]

Trac report

2008년 들어서 회사 개발팀에서 모든 일을 Trac의 티켓으로 관리하기로 했습니다.

Trac이 한글화 되어있지 않은거 같아서 몇가지 간단한거는 한글로 바꿨습니다.

현재 0.10.4 버전을 사용중인데, 설정 변경은 TracWebAdmin 플러그인을 통해서 했습니다. 새버전에는 Admin 기능이 Trac에 통합된다고 하는데, 정말 없으면 안되는 필수 기능입니다.

Priority를 영어에서 1,2,3,4,5로 바꾸고,
Type은 버그수정, 기능개선, 새로운기능으로 변경했습니다.

개발팀 밖에서 티켓 등록 및 모니터링을 할수 있도록, Permission을 바꿨습니다.
먼저 개발자(developers) 그룹을 생성하고, TIMELINE_VIEW와 BROWSER_VIEW 액션을 anonymous에서 developers로 옮겼습니다. (삭제하고 다시 등록)

Trac의 사용자 인증은 htpasswd를 사용하며, 웹서버는 lighttpd를 사용하고 있습니다.

View Tickets 페이지 보면 report를 편집할수 있는데,  편집해서 TODO와 최근변경사항을 만들었습니다. TODO는 아직 완료되지 않은 일(티켓)을 내거와 다른사람거로 나누어 보여주며, 우선도에 따라 정렬해 보여줍니다. 바탕색도 우선도에 따라서 보여줍니다. 아래는 report를 위한 SQL Query입니다.

[CODE]
SELECT p.value AS __color__,
  (CASE owner
    WHEN ‘$USER’ THEN ‘My Tickets’
    ELSE ‘Active Tickets’
   END) AS __group__,
  id AS ticket,
  (CASE status WHEN ‘assigned’ THEN owner||’ *’ ELSE owner END) AS owner,
  summary, component, priority, t.type AS type,
  time AS created,
  changetime AS _changetime, description AS _description,
  reporter AS _reporter
  FROM ticket t, enum p
  WHERE status IN (‘new’, ‘assigned’, ‘reopened’)
AND p.name = t.priority AND p.type = ‘priority’
  ORDER BY (owner = ‘$USER’) DESC, p.value, milestone, t.type, time
[/CODE]

최근변경사항은 티켓에 일어난 최근 변경 사항을 20개 보여줍니다. 물론 Timeline에서도 볼수 있지만, Timeline을 개발자만 볼수 있고, 소스 커밋과는 별도로 볼수 있도록 하는게 편리할것 같아서 따로 report를 생성했습니다.

[CODE]
SELECT
  id AS ticket,
  summary,
  changetime AS modified,
  status,
  component,
  t.type AS type,
  (CASE status WHEN ‘assigned’ THEN owner||’ *’ ELSE owner END) AS owner,
  time AS created,
  description AS description,
  reporter AS _reporter
  FROM ticket t
  ORDER BY changetime desc limit 0,20
[/CODE]

trac report 만드는데 참고할 문서가 별로 없어서 좀 헤맸는데… 위에서 reporter as _reporter식으로 “as _*”로 하면 테이블에서 항목이 표시가 안됩니다. 기본 예제들을 자세히 보면 항목이 뭐가 있는지 볼수 있으므로 기본 예제들을 참고하시고 조금씩 바꾸면 원하는 출력을 얻을수 있습니다.

TODO와 최근변경사항 링크를 메뉴로 쉽게 접근할 수 있도록, http://trac-hacks.org/wiki/NavAddPlugin를 설치했습니다.

trac 업그레이드 & plugin

trac 사용하면서 꼭 알아야할 사이트인 trac-hacks.org 에 대해서는 오래전부터 알고 있었지만 크게 필요가 없어서 플러그인은 사용하지 않았었습니다. 티켓에서 예상완료일자를 설정하려고 하니 달력에서 보고 설정할수 있으면 좋겠다는 생각이 들었습니다. 그래서 trac-hacks를 찾아보니 역시 플러그인 있네요 ^^. 물론 trac 자체에서도 custom field를 지원하지만, 달력에서 날짜를 고를수 있는 플러그인인 TracDatePlugin은 꼭 설치하고 싶더군요. 그런데 플러그인을 설치하려고 보니 0.9.X에서는 동작을 안한다고 하더군요. 그래서 업그레이드를 했습니다. 물론 일단 백업받고 시작했죠.

전에 사용하던 버전이 0.9.6이 였는데 FreeBSD ports를 통해서 0.10.4 버전으로 업그레이드했습니다.

# cd /usr/ports/www/trac
# make deinstall
# make install
# trac-admin /TRAC/PATH upgrade
# /usr/local/etc/rc.d/lighttpd restart

trac-admin 실행해주고 웹서버 재시작하니 업그레이드가 정상적으로 완료되었습니다.

trac plugin은 egg라고 zip 파일 형태의 패키지를 이용하도록 되어있습니다. python은 오래전부터 사용했지만, egg 패키지는 처음 사용해보는데 java의 jar 정도 되는거 같네요. 패키지의 종속성등의 메타 정보를 넣을수 있다고 합니다. 하지만, 소스에서 뭘 바꾸려해도 zip 안에 들어있어서 바로 편집하기 어려울듯하네요. Egg에 대한 자세한 내용은 여기를 참고하세요.

egg 파일은 단순히 py, pyc 파일등과 메타 정보를 압축한 zip 파일입니다. egg 파일을 만들기 위해서는 setuptools가 필요하다고 합니다. 역시 FreeBSD ports를 이용해 설치했습니다.

# cd /usr/ports/devel/py-setuptools
# make install

그리고 trac plugin 설명 페이지에서 설명한 대로 ez_setup을 설치했습니다.

# wget http://peak.telecommunity.com/dist/ez_setup.py
# python ez_setup.py

이렇게 하고 필요한 플러그인을 받고 egg 파일을 아래와 같이 만들면 됩니다.

$ unzip datefieldplugin.zip
$ cd datefieldplugin/0.10
$ python setup.py bdist_egg
$ cd dist
$ cp TracDateField-1.0.1-py2.4.egg /TRAC/PATH/plugins

플러그인 소스 받은후 압축풀고, setup.py를 찾아서 위처럼 실행해주면 dist 디렉토리 밑에 egg 파일이 만들어지고, 이 파일을 trac plugin 디렉토리에 옮겨주고 웹서버를 재시작하면 됩니다.

플러그인 중에 제가 사용중인 것 2개만 소개합니다.

TracWebAdmin 0.1.2dev-r4240 : trac-admin을 웹페이지를 통해서 할수 있도록 해주는 플러그인으로 trac을 개발한 edgewall에서 개발한 거고, trac 0.11에서부터는 기본으로 포함된다고 합니다. trac-admin 사용하면 이 정도 기능은 웹에서 가능해야한다고 생각했었는데, 꼭 설치해야할 필수 플러그인이네요.

TracDateField 1.0.1 : custom field에 날짜를 설정할수 있게 해줍니다. 아래와 같이 티켓 만들때 custom field로 date로 설정하면 달력을 보고 날짜를 설정할수 있습니다.


CVS to Subversion migration

오늘 1년 가까이 미루어왔던 일을 저질렀습니다. 회사의 CVS 저장소 전체를 Subversion으로 마이그레이션 했습니다. 5년간 작업한 CVS를 옮기면서 몇가지 문제가 발생하긴 했지만 그래도 성공적으로 옮겼습니다.

subversion은 CVS와 가능하면 비슷한 기능과 인터페이스를 제공하면서 부족한 점들을 보완한 버전 관리 도구로, 요즘 오픈 소스 진영에서 많이 사용하고 있습니다. CVS와의 차이점을 살펴보면

1. commit 단위로 버전이 관리됩니다. CVS에서는 파일별로 관리되기 때문에 한번 commit할때 같이 바뀐 파일을 조회하기가 번거롭습니다.

2. repository가 디비로 관리됩니다. 장점도 되고 단점도 됩니다.

3. CVS에 없는 rename, symbolic link등이 지원됩니다.

4. 웹과의 연동이 잘 되어 있습니다. (trac)

5. Client에 공간을 많이 차지합니다. 대신 네트워크는 덜 사용합니다.

자세한것은 subversion 홈페이지 참조하세요.

그리고 trac은 웹기반 통합 개발 관리툴 정도 되는데, 개발할때 부하를 줄 정도로 복잡하지 않고 간단한 기능만 편한 인터페이스로 모아둔 느낌입니다. wiki로 문서를 쉽게 작성할수 있고, 버그 리포팅과 svn 버전 관리와 연동하여 관리가 가능합니다. 역시 자세한 건 trac 홈페이지 참조하시면 되겠습니다.

몇달전에도 cvs2svn 을 이용하여 컨버전하다가 문제가 생겨서 그만둔적인 적이 있었습니다.

사용하는 서버는 FreeBSD고 subversion과 trac을 ports를 이용하여 설치했습니다.

# cd /usr/ports/devel/subversion
# make install
# cd /usr/ports/www/trac
# make install

컨버전 툴인 cvs2svn도 ports를 이용하여 설치하였었지만, 버전이 낮아서 http://cvs2svn.tigris.org에서 받아서 다시 설치했습니다.

시스템에 svn 그룹을 만들고, 사용자들을 svn 그룹에 추가해줬습니다.
그리고 다음처럼 svn repository와 trac 환경을 만들어줬습니다. (편의상 SVNROOT와 TRACROOT 디렉토리로 설명합니다.)

# svnadmin create /SVNROOT
# chgrp -R svn /SVNROOT  (svn 그룹은 만들었다고 가정)
# chmod -R g+w /SVNROOT/db

# trac-admin /TRACROOT initenv
# chown -R www /TRACROOT

이렇게 하고 웹서버에 fast-cgi모듈로 연결해주고, https와 인증을 추가해줬습니다. trac쪽 fastcgi 스크립트는 /usr/local/share/trac/cgi-bin/trac.fcgi 에 있습니다.

여기까지는 큰 어려움 없이 됐고, 웹에서도 잘 접속이됐습니다.

cvs2svn 마이그레이션 하면서 몇가지 문제점이 발생했었는데, cvs2svn을 최신 버전으로 업그레이드하고 cvs2svn 실행할때 몇가지 옵션을 줘서 해결했습니다. 정확한 이유는 모르겠지만 branch 인식을 제대로 못해서 문제가 발생했던거 같습니다. (프로젝트에는 전혀 없는 branch에 대해서 오류가 납니다 –)

# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –trunk=Library -s /SVNROOT /CVSROOT/Library
# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –trunk=Project1 -s /SVNROOT /CVSROOT/Project1
# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –symbol-default=branch –trunk=Project2 -s /SVNROOT /CVSROOT/Project2

CVS의 기존 디렉토리 구조를 유지하고, 다른 프로젝트간에 디렉토리 복사등을 쉽게 하려고 SVN repository를 하나로 잡았습니다. Project2에서 branch 오류가 계속 나서 –symbol-default=branch 옵션을 주어서 해결했습니다. 어차피 branch 했던 코드가 많지 않아서 –trunk-only 옵션으로 메인 branch만 가져왔습니다.

이렇게해서 대충 설정은 끝났고, 네트워크 svn 접속은 ssh를 통하여 접속하도록 하여 별도로 서버(svnserve)를 돌리지는 않았습니다.

따라서 SVN 주소는:

svn+ssh://userid@svn.company.com/SVNROOT

다른 FreeBSD에서 문제없이 checkout 되는거 확인했는데, LANG 환경변수에 따라서 경고가 뜨는데 이건 아직 왜그런지 모르겠습니다.

윈도우즈 클라이언트로는 TortoiseCVS 썼었는데 TortoiseSVN으로 바꿨습니다. http://tortoisesvn.tigris.org 에서 받을수 있습니다. 윈도우즈에서도 위 svn 주소로 접속이 이상없이 됐고, tortoiseCVS와 거의 동일하게 사용할수 있기 때문에 개발자들이 큰 어려움 없이 사용할수 있을것 같네요.