본문 바로가기

Better SW Development

[번역] 허드슨을 이용한 지속적인 통합(Continuous integration with Hudson) #1

번역통합본을 확인하세요. :)
-----------------------------

자바월드(http://www.javaworld.com/)에 기고된 허드슨(Hudson) 글을 번역해서 올려 봅니다. 매우 상세하게 설명되어 있어서 CI 서버가 생소한 사람들도 어렵지 않게 따라갈 수 있도록 되어있습니다.

내용이 긴 관계로 3~4회로 나누어서 올리고, 나중에 합친 형태도 제공하는 식으로 하겠습니다.

이번회는 허드슨 개요에서 설치까지 입니다.

음.. 요즘엔 저작권 문제가 상당히 날카로와져서 조금 망설였지만, 비 영리의 외국 기사 번역은 상식적인 선에서 저작권에 훼손을 가하지 않는다면 문제 되지 않는다는 글을 어디선가 보고서는 마음대로 올려봅니다. (-,-) 그리고, 번역시에 큰 고민하지 않고 진행한 관계로 다소 어색할 수 있습니다만, 이해가 곤란한 수준이 되진 않도록 노력하였습니다.

원문은 http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html 에서 살펴보실 수 있습니다.

-------------- Started Here ------------

허드슨을 이용한 지속적인 통합(Continuous integration with Hudson)

쉬운 설치와 설정을 제공하는 오픈소스 CI 서버

지속적인 통합(CI)은 소프트웨어 개발 생명주기에 걸쳐서 코드 품질 보증에 대해 초점을 맞추고 있는 팀들에겐 흔한 실천방법이 되었다. 이 글에서, 니콜라스 화이트헤드(Nicholas Whitehead ) 는 인기있는 오픈 소스 CI 서버인 허드슨(Hudson)을 소개한다. 당신의 어플리케이션 개발 환경에 허드슨 서버를 구축하는 방법을 배워보고, 허드슨이 제공하는 많은 설정 옵션들의 전체적인 개념을 얻어보자. (예제는 윈도우 XP에 톰캣6 혹은 우분투 리눅스에 JBoss AS 로 되어있다.) 그리고 자동화된 빌드, 테스트, 그리고 예제 프로젝트용 레포팅 프로세스를 구현하는 방법을 보기로 한다. 레벨은: 초급!

지속적인 통합(CI)는 소프트웨어 빌드를 만들어내는 절차를 쉽게 하고 안정화 하기 위한 실천방법들의 세트이다. CI는 아래와 같은 난관이 있는 개발팀을 도와준다

  • 소프트웨어 빌드 자동화: CI를 이용해서 당신은 버튼을 하나 누른다던가, 혹은 미리 일정을 정해놓고, 아니면 특정한 이벤트에 대한 반응같은 식으로 어떤 소프트웨어 구조물(이하 아티펙트, Artifact)의 빌드 프로세스를 실행시킬 수 있다. 만일 당신이 소스로 부터 소프트웨어 구조물을 빌드하고자 한다면, 당신의 빌드 프로세스는 특정 IDE나 컴퓨터, 혹은 특정인에 속박되지 않는다.(물론 그래서도 안되지만 말이다)
  • 지속적이고 자동화된 빌드 검증: CI 시스템은 새로운 소스코드나 수정된 소스코드가 체크인 될때마다 끊임없이 빌드를 실행하도록 설정될 수 있다. 이건 어떤 소프트웨어 개발팀이 주기적으로 신규 코드나 수정된 코드를 체크인 하는 사이에, CI 시스템은 새로운 코드에 의해 빌드가 깨지는지의 여부를 지속적으로 검증할수 있다는 것을 의미한다. 이것은 개발자들이 상호의존적인 컴포넌트들의 변경에 대해 각각 점검해야 하는 것에 대한 필요성을 줄여준다.
  • 지속적이고 자동화된 빌드 테스트: 빌드 검증의 확장에 해당하는 이 프로세스는, 신규 코드나 수정된 코드가 빌드 아티팩트에 대해 미리 정의된 테스트 슈트가 실패하도록 만들지 않는다는 것을 보증해 준다. 빌드 검증과 테스트 둘 다에 있어, 실패(Failures)는 빌드나 테스트가 실패했다는 것을 나타내는 '통지(notification)'를 관련 부서들에게 보내는 방아쇠(...trigger)가 된다.
  • 빌드 후속 절차 자동화: 한 소프트웨어 아티팩트의 빌드 생명주기에서는 빌드 검증과 테스트가 완료된 다음에도 문서 생성, 소프트웨어 패키징, 그리고 해당 아티팩트들을 실행환경이나 소프트웨어 저장소로 전개(deploy)하는 것 같은 자동화될 수 있는 추가적인 작업이 필요할 수 도 있다. 이런 형태로 아티팩트들이 사용자들이 사용할 수 있도록 신속히 만들어 질 수 있다.

CI 서버를 구현하기 위해, 당신은 최소한 하나의 접근가능한 소스코드 저장소(그리고 그 안에 들어있는 소스코드), 빌드 스크립트 한 세트와 절차들, 그리고 빌드된 아티팩트용 테스트 슈트 하나가 필요하다. 그림1은 CI시스템의 기본 구조의 개략도(outline)이다.

그림 1. CI시스템의 기본 구조 (클릭하면 크게 보임)

시스템 컴포넌트들은 아래와 같은 순서로 동작한다.

  1. 개발자들은 소스코드 저장소 안으로 새로운 코드나 수정된 코드를 체크인 한다.
  2. CI 서버는 각각의 프로젝트를 위한 전용 작업공간을 만든다. 하나의 새로운 빌드가 요청되거나 예정되면, 소스는 저장소로부터 빌드가 수행될 이 작업공간으로 불려온다.
  3. CI서버는 새로이 만들어진, 혹은 새롭게 갱신된 작업공간에서 빌드 프로세스를 수행한다.
  4. 일단 빌드가 완료되면, CI서버는 추가적으로 새로운 아티팩트에 대해 정의된 테스트 슈트를 수행할 수 있다. 만일 빌드가 실패하면, 등록된 개개인들은 이메일, 인스턴스 메시징, 혹은 어떤 다른 방식으로, 통지받게 된다.
  5. 만일 빌드가 성공적이면, 해당 아티팩트들은 패키지되어서 (이를테면 어플리케이션 서버 같은)배포처로 전송되거나 아니면 소프트웨어 저장소에 새로 버전붙여진 아티팩트로 저장되기도 한다. 이 저장소는 CI서버의 일부가 될수도 있고, 혹은 파일서버나 Java.net, SourceForge같은 소프트웨어 배포 사이트 식의 외부 저장소가 될 수도 있다. 소스코드 저장소와 아티팩트 저장소는 분리될 수 있고, 몇몇 CI서버들을 사용하면 공식적인 소스관리 시스템을 전혀 갖고 있지 않아도 실제로 그렇게 하는 것이 가능하다.
  6. CI서버는 보통 어떤 형태든 프로젝트를 설정하고 디버그할 수 있는, 그리고 경우에 따라 특별하게 즉시 빌드를 만들어 내게 하거나 보고서 생성, 혹은 빌드된 아티팩트들을 검색하는 식의 동작들을 요청할 수 있는 콘솔을 갖는다.

허드슨: 지속적인 통합 서버

지속적인 통합은 지난 몇년에 걸쳐 인기리에 성장해 왔고, 상업용/공개용 둘 다 포함해서 오늘날 당신이 선택할 수 있는 꽤 많은 수의 CI 서버들이 있다. 나는 동료가 허드슨(Hudson)을 추천하기 이전에 개인적으로 4개의 CI 서버들을 사용하고 있었다. 나는 곧바로 감명받았다. 초기에 내가 허드슨은 잘 알려져 있지 않다고 추측하고 있는 동안에, 자바 파워 툴즈 사이트의 설문은 응답자들 사이에서 허드슨이 가장 폭넓게 사용되는 CI서버라는 걸 보여줬다. (이글이 쓰여지는 시점에서) 투표 중 37.8퍼센트를 차지하고 있다.

지원하는 SCM들 Supported SCMs

허드슨은 서브버전에 대한 지원은 곧 바로 사용할 수 있는 수준으로 내장 되어있고, CVS와 통합하기 위해서는 약간의 설정만 필요하며, CVS클라이언트가 허드슨 호스트에 인스톨 되어 있다고 가정하고 있다. 몇몇 다른 소스 코드 관리(SCM) 솔류선들은 허드슨 플러그인 형태로 지원되고 있다. 이 글을 쓰는 시점에서 아래오 같은 SCM들이 지원된다.

  • Accurev
  • BitKeeper
  • ClearCase
  • Git
  • Mercurial
  • Perforce
  • StartTeam
  • Team Foundation Server
  • Visual SourceSafe
  • URL SCM (SCM에 URL 을 사용할 수 있게 해주는 특별한 SCM 플러그인)

이 글에서, 나는 서브버전과 Java.net의 소스 저장소를 사용할 것이다. 따라서 당신은 위에 있는 어떠한 플러그인들도 설치할 필요가 없다. (여담으로, MKS 소스통합 허드슨 플러그인을 만들고 있는 사람을 알고 있는데, 혹시 관심있으면 메일(email) 주길 바란다)

허드슨은 공짜이고 오픈소스 제품으로 Java.net에 자리잡고 있다. 허드슨은 썬 마이크로 시스템의 엔지니어인 코수케 카와구치(Kohsuke Kawaguchi)에 의해 최초로 작성되었으며, 2005년 2월에 그의 블로그에서 릴리즈가 발표되었다. 허드슨은 그 이후 거의 154번의 릴리즈가 있었다.

왜 내가 허드슨을 좋아하는 지, 그리고 왜 내가 (몇몇 특별한 요구사항이 필요한 경우를 제외하고) 허드슨을 당신에게 추천하는 지에 대한 이유는 아래와 같다.

  • 내가 사용했던 모든 CI 제품중에서, 인스톨하고 설정하기가 가장 쉬웠다.
  • 웹 기반 유저 인터페이스는 매우 친숙하고, 직관적이며, 빠르게 반응했고, 많은 경우에 있어 개별적인 설정 필드에 대해 Ajax를 이용한 즉각적인 피드팩을 제공하였다.
  • 허드슨은 (만약 당신이 자바 개발자라면 유용할 수 있는)자바 기반이지만 자바 기반의 소프트웨어를 빌드하는데에 한정되어 있지는 않다.
  • 허드슨은 깔끔하게 컴포넌트화 되어 있고 잘 정의되고 문서화되어있는 확장가능한 API를 허드슨 플러그인 형태로 제공한다. 그로인해 서버의 기능을 확장하는 커다란 허드슨 플러그인 라이브러리를 갖게 하였다. 이 라이브러리들은 허드슨 콘솔에서 자유롭게 사용가능하고 설치 가능하다.

허드슨 인스톨 하기: Windows XP 혹은 우분투 리눅스

허드슨을 사용하기 위해서, 당신은 접속가능하고 허드슨이 지원되는 소스 관리 시스템과 아티팩트로 빌드될 수 있는 소스, 그리고 동작하는 빌드 스크립트가 필요하다. 그 외에, 동작하는 허드슨 서버를 인스톨하고 설정하기 위해 당신이 정말 필요한 것은 자바 1.5 이상과 허드슨 인스톨 파일을 설치하는 것이다.

C:\hudson> java -jar hudson.war

하지만, 서블릿2.4와 JSP 2.0스젝에 기반한, GlassFish, Tomcat, JBoss, 혹은 Jetty 같은 자바 서블릿 컨테이너에 허드슨을 디플로이 하는것이 좀더 일반적일 수 있다. 다음 섹션에서, 두개의 허드슨 인스톨 시나리오로 진행하려고 한다. 하나는 윈도우즈XP에 Tomcat 6을 이용하는 것이고 다른 하나는 우분투(Ubuntu) 리눅스에 JBoss 4.2.3 를 이용하는 것이다. (JBoss AS 5.0 는 이 글의 제출일 이후에 릴리즈 되었다)

허드슨 인스톨 하기: 톰캣6와 윈도우즈 XP

나는 당신의 윈도우즈XP 머신위에 JAVA 버전 1.5 이상이 설치되어 있다고 가정할 것이다. 아래에 이어지는 단계는 윈도우즈 서비스 인스톨러를 이용해서 톰캣 6.0.18을 설치할 것이다. 그래서 윈도우즈 XP 가 부팅되면 곧바로 허드슨이 시작되게 할 것이며, 로그인 하지 않더라도 백그라운드로 동작하도록 할 것이다. 다운로드해서 설치할 톰캣 파일은 apache-tomcat-6.0.18.exe이다.

톰캣 설치는 인스톨 옵션을 선택하게 할 것이다. Custom 옵션을 선택해서 그림 2에 보이는 것처럼 Service를 반드시 선택하자. 그래서 톰캣이 서비스로 동작한다.

Tomcat installation options

그림 2. 톰캣 설치 옵션

다음으로, 톰캣을 설치할 디렉터리를 그림 3에 보이는 것처럼 선택하자. 디렉터리를 정할 때 빈 공백이 없는 디렉터리를 고르는 걸 추천한다. 나중에 나한테 감사 할거다.

그림3. 인스톨 디렉터리 고르기

이제 인스톨러는 응답대기할 포트를 선택하라고 물을 것이다. 기본값은 포트 8080인데, 적당하다. 해당 포트를 사용하는 다른 어플리케이션이 없는지만 유의하자. 만일, 해당 포트를 사용하는 어플리케이션이 있으면, 톰캣은 적절히 뜨지 않을 것이다. (뭐. 당연하잖아!!) 톰캣 관리자 유저이름과 패스워드도 물어볼거다. 그림 4에 모두 나와 있다.

그림4. 리스닝포트와 관리자 유저 이름과 패스워드 고르기

그리고나면 인스톨러는 자바 JRE가 설치된 위치를 물어볼 것이다. 그림 5에 보이는 것처럼, 나는 Sun Java 1.6.0_07을 사용했다.

그림5. 톰캣을 띄울 Java JRE 고르기

Install 을 클릭하고 나면, 인스톨이 실행&완료 되고 서비스가 시작될 것이다. 웹 브라우저에 http://localhost:8080 을 입력해서 톰캣이 제대로 동작하는지 확인할 수 있다. (톰캣이 인스톨 된 컴퓨터에서 웹 브라우저를 띄우는 것이 아니라면 localhost 대신에 IP 주소나 적절한 이름으로 치환한다) 그림 6에 보이는 스크린샷 처럼 웹 페이지가 표시될 것이다.

Verifying Tomcat installation and operation

그림6. 톰캣 인스톨과 동작 검증

이제, 허드슨을 인스톨하기 위해, hudson.war 파일을 톰캣이 설치된 디렉터리의 webapps 하위 디렉터리로 복사한다. 만일 당신이 그림3에 보이는 것과 동일한 인스톨 디렉터리를 사용했다면 webapps 는 C:\Tomcat6\webapps가 될 것이다. 톰캣은 핫-디플로이(뜨거운 배포...-_- sorry)를 할텐데, 지금 할 수 있는 쉬운 방법은 톰캣을 재시작하는 것이다. 재시작 하는데는 두가지 방법이 있는데, 첫 번째는 DOS 쉘을 열여서 아래와 같은 명령어를 입력하는 것이다.

 C:\Tomcat6>net stop Tomcat6
 C:\Tomcat6>net start Tomcat6

두 번째 옵션은 서비스 애플릿을 여는 것이다. 제어판(Control Panel)의 관리자 툴에서 해당 애플릿을 찾을 수 있다. 제어판은 시작버튼에 있는 윈도우 툴바에서 설정를 선택해서 제어판을 고르면 된다. 서비스 애플릿에서, Apache Tomcat 이라고 이름 붙은 서비스를 찾아서 재시작 버튼을 누른다. 그림 7에 설명되어 있다.

그림7. Services 애플릿Figure 7. The Services applet

이제 허드슨이 설치되었다. 웹 브라우저에 http://localhost:8080/hudson 이라고 지정해서 확인할 수 있다. 메인 허드슨 스크린은 그림 8과 같다.

The Hudson start page

그림8. 허드슨 시작 페이지

당장 필요한 것은 이게 전부다! 만일 당신이 Windows XP 와 Tomcat 기반의 어플리케이션 개발 환경에 친숙하다면, 세팅은 다 끝났다. 만약 당신이 우분투 리눅스에 JBoss 를 실행하는 시스템을 선호한다면, 계속 읽기 바란다.

허드슨 인스톨 하기: JBoss 4.2.3 on Ubuntu Linux 8.04 (Hardy Heron)

우분투에 썬 자바 1.6을 설치하려면, 쉘을 열어서 아래와 같은 커맨드를 실행하여라.

 sudo apt-get install sun-java6-jdk

sudo 커맨드를 실행하면, 패스워드를 물어볼 것이다.

JBoss를 인스톨 하는데는 몇 가지 방법이 있다. 여기에선 jboss 전용 유저를 만들것이다. 이 방식이 최고의 선택이고, 유저를 만들어서 당신의 home 디렉터리에 JBoss를 인스톨하는 것이 나은 방법으로 여겨지고 있다. 여기에 요약된 절차는 우분투 포럼에 있는 a useful description 을 응축한 것이다.

첫째로, the JBoss 4.2.3.GA package 를 다운로드 한다. jboss-4.2.3.GA.zip 이라고 이름붙은 파일을 찾아라.

다음으로, jboss로 이름지어진 group 과 home 디렉터리, 유저를 만들어야 한다. group 은 편리하지만, 이글에서 자세히 다루진 않는다. 우분투 서버에 있는 다른 유저들에게 JBoss권한을 확장할 수 있게 해준다.

리스트1 은 jboss home 디렉터리, 유저, 그룹을 생성하는 명령어들과 JBoss서버를 설치하는 것을 코멘트로 보여준고 있다.

리스트1. jboss 계정 생성과 서버 인스톨

echo Create the jboss group
sudo groupadd jboss
echo Create the jboss user, define bash as the user's default shell and /home/jboss as the home directory
echo and make the user jboss part of the group jboss
sudo useradd -s /bin/bash -d /home/jboss -m -g jboss jboss
echo Copy the jboss-4.2.3.GA file to /home/jboss or download directly into that directory
sudo mv jboss-4.2.3.GA /home/jboss
echo Change the owner of the file to jboss
sudo chown jboss:jboss /home/jboss/jboss-4.2.3.GA
echo Log into the jboss account
sudo su jboss
echo Go to the jboss home directory
cd
echo Unzip the file jboss-4.2.3.GA
unzip jboss-4.2.3.GA
echo Create a symbolic link "jboss" for "jboss-4.2.3.GA".
echo This allows you to change JBoss versions with minimal changes
ln -s jboss-4.2.3.GA jboss

unzip 이 설치 되어 있지 않으면, (sudo 명령이 실행가능한 유저로 로그인해서) 아래와 같은 명령어를 입력해서 인스톨하여라.

Sudo apt-get install unzip

JBoss 서버는 이제 기본적으로 인스톨 되었다. 다음과 같은 명령어를 사용해서 띄울 수 있다.

/home/jboss/jboss/bin/run.sh

그러나 명령어로 띄우는 것이 아니라, 이 예제에서는 장비가 시작될때 서비스가 자동적으로 시작되도록 자동 시작 스크립트를 설치할 것이다. JBoss 를 내려받을 때 세 개의 서로 다른 init.d 스크립트도 함께 다운로드 되었지만, 손 본 필요가 있다. 자동으로 기동과 정지를 가능하게 해줄 jboss-init.sh 스크립트를 다운로드 할 수도 있다. 그런다음, 리스트2에 있는 명령어들을 실행하여라.

리스트2. JBoss를 위한 자동 시작 스크립트 인스톨 하기

echo Move the jboss-init.sh file to /etc/init.d/ and rename it to jboss
sudo mv jboss-init.sh /etc/init.d/jboss
echo Change the owner of the /etc/init.d/jboss file to root
sudo chown root:root /etc/init.d/jboss
echo Make the /etc/init.d/jboss file executable
sudo chmod ug+x /etc/init.d/jboss
echo Activate the /etc/init.d/jboss file in the rc.d lifecycle process.
sudo update-rc.d jboss defaults

자 이제 아래와 같은 명령어를 이용해서 백그라운드 프로세스로 JBoss 서버를 시작할 수 있다. (로그아웃 해도 프로세스는 종료되지 않을 것이다)

sudo /etc/init.d/jboss start

JBoss가 동작하는 것을 확인하기 위해 브라우저에 http://localhost:8080/jmx-console 라고 지정해보자. (뜨는데 몇 분쯤 걸릴수 있다) 그림9는 나와야 하는 JBoss JMX 콘솔을 보여준다.

The JBoss JMX console

그림 9. The JBoss JMX console

허드슨을 디플로이 하는 것은 간단하다. hudson.war 파일을 /home/jboss/jboss/server/default/deploy 에 복사하면 끝난다. jboss 유저를 이용해서 JBoss서버가 해당 파일을 읽을 수 있는 권한을 갖도록 하는 것이 최선이다. 허드슨이 몇 초 이내에 디플로이 될 것이다. 그러면 웹 브라우저에 http://localhost:8080/hudson 이라고 지정해서 디플로이가 잘 되었는지를 확인할 수 있다. 그림 8에 보이는 것과 같은 페이지가 보여질 것이다.

Setting up a build in Hudson

부터는 다음에 이어서 계속하겠습니다...