S/W 개발 기반 시스템 구성 – 6. CI 서버 설치
이 글은 S/W 개발에 가장 기본이 되는 이슈 추적(Issue Tracker), 버전 관리(Version Control), 빌드(Build), 지속적인 통합(CI) 시스템을 구성하는 방법에 대한 일련의 글 중 여섯 번째이다. 지난글에서 빌드 스크립트를 구성했으므로 이를 활용할 CI 서버를 설치하고 구성해 본다.
1. 미리 준비해야 하는 것들
- CI 시스템은 Jenkins(젠킨스)를 사용한다. 여기에서 윈도용 설치 파일을 받을 수 있다.
- Jenkins를 실행하려면 Java(자바) 런타임이 필요하다. SE 버전으로 설치하면 되며 여기에서 받는다.
2. 설치
Java 런타임을 먼저 설치하고 환경 변수에 다음 내용을 추가한다.
1 2 3 |
JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_26 CLASSPATH=. Path=%JAVA_HOME%\bin |
Jenkins를 설치하면 자동으로 서비스까지 등록한다. 기본 포트는 8080이므로 http://plab.net:8080
으로 접속해 첫 화면이 뜨면 정상이다. 정상적으로 접속할 수 있으면 Apache 웹 서버를 통해 접속하도록 변경한다.
Apache 웹 서버 httpd.conf
파일에 다음 내용을 추가한다.
1 2 3 4 5 6 7 8 9 10 |
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so ProxyRequests Off <Proxy http://127.0.0.1:8080/jenkins*> Order deny,allow Allow from all </Proxy> ProxyPass /jenkins http://127.0.0.1:8080/jenkins ProxyPassReverse /jenkins http://127.0.0.1:8080/jenkins |
Jenkins 설치 디렉터리에 있는 jenkins.xml
파일 내용 중 <arguments>
항목에 다음과 같이 --prefix=/jenkins
를 추가한다.
1 |
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --prefix=/jenkins</arguments> |
Jenkins와 Apache 웹 서버를 모두 중지 후 새로 시작한 다음 http://plab.net:8080
대신 http://plab.net/jenkins
로 접속하면 된다.
3. 설정
먼저 메일 전송 설정은 Manage Jenkins – Configure System 선택 후 E-mail Notification 항목을 채운다. 인증이 필요하면 Advanced 버튼을 누르면 된다.
설정을 계속하기 전에 플러그인을 설치한다. Manage Jenkins – Manage Plugins를 선택한 후, ‘Available’ 탭에서 필요한 것을 선택하면 된다. 우선 NAnt, Mercurial 플러그인을 선택하고 그 외 필요에 따라 추가 선택하면 되겠다. 선택 후에는 화면 가장 아래에 있는 Install 버튼을 누르면 된다. 만약 인터넷에 연결할 수 없다면 여기에서 확장자가 hpi인 플러그인 파일을 받은 후, Manage Plugins 메뉴에서 ‘Advanced’ 탭을 선택하고 Upload Plugin에서 직접 선택해 설치할 수도 있다. 플러그인을 설치한 후에는 재시작해야 한다.
이제 Manage Jenkins – Configure System을 선택하면 Mercurial과 Nant Builder 항목을 볼 수 있다. 먼저 NAnt부터 설정한다.
Nant Builder 항목에서 Add 버튼을 누른다. 이름은 적당히 주면 되고 NANT_HOME에는 NAnt 설치 경로를 입력한 후 가장 아래에 있는 Save 버튼을 눌러 저장한다. 여기서 지정한 이름은 빌드 프로젝트 설정에서 사용한다.
Mercurial은 다음처럼 설정한다. Manage Jenkins – Configure System을 선택하고 Mercurial 항목에서 Add Mercurial 버튼을 누른다. 이름은 적당히 지정하면 되는데 여기서 지정한 이름은 빌드 프로젝트 설정에서 사용한다. 이전 글에 따라 설치했으면 python 패키지를 설치했을 것이므로 설치 위치를 따로 지정하지 않고 실행 파일만 지정하면 된다. 설정 후 가장 아래에 있는 Save 버튼을 눌러 저장한다.
권한 설정은 Manage Jenkins – Configure System – Enable security 항목을 선택한다. OpenLDAP을 사용하므로 Access Control 항목에서 Security Realm은 LDAP을 선택하고 Advanced 버튼을 누른다. 각 항목은 다음과 같이 설정한다.
Access Control 항목에서 Authrization은 Project-based Matrix Authrization Strategy 또는 Matrix-based security를 선택한다. Project-based는 Matrix-based에 추가로 프로젝트별로 접근 권한을 설정할 수 있다. 저장하기 전에 모든 권한을 가진 관리자 계정을 입력 후 Add 버튼을 눌러 추가하고 권한을 설정한다. 그러지 않으면 로그인 할 수 없으니 주의한다. 또한 인증으로 OpenLDAP을 사용하므로 추가하는 계정은 OpenLDAP에 추가한 계정이어야 한다.
또는 OpenLDAP에 Jenkins 관리자 그룹을 만들고 이를 사용할 수도 있다. DN이 cn=jenkinsadmins, ou=Groups, dc=plab, dc=net
인 jenkinsadmins
그룹을 만들고 멤버를 추가한다. 이 그룹 정보를 Jenkins에서 사용할 때는 cn(common name)을 대문자로 쓰고 ROLE_
을 접두어로 붙인다. 즉 ROLE_JENKINSADMINS
가 된다. 이를 추가하고 권한을 설정한다. 필요에 따라 다른 그룹도 이처럼 설정한다.
설정 후 저장하면 자동으로 로그오프 되는데, 혹시 권한 설정을 제대로 못한 상태에서 로그인 할 수 없게 되면 Jenkinsconfig.xml
파일 내용에서 다음 내용을 찾아 false로 바꾼 후 Jenkins 서비스를 재시작한다. 이후에 권한 설정을 새로 하면 된다.
1 |
<useSecurity>true</useSecurity> |
3. 작업 만들기
빌드를 하려면 작업(job)을 만들어야 한다. New Job을 선택하고 Job name에 이름을 지정한 후 Build a free-style software project를 선택한다. 지정 후 OK 버튼을 선택하면 작업을 만든다.
해당 job에 대한 빌드 설정을 한다.
Advanced Project Options 항목에서 Advanced 버튼을 누르면 상세 내용을 볼 수 있다. 저장소에서 파일을 받아 빌드할 위치를 지정하려면 Use custom workspace를 선택하고 Directory를 지정하면 된다. 경로는 서버 내 위치이다.
빌드에 사용할 파일을 저장소에서 받기 위해 Source Code Management 항목을 설정한다. Mercurial Version 항목은 이전에 Configure System 메뉴에서 설정한 Mercurial 항목 이름이다.
Build 항목에서 Add build step 버튼을 누르면 빌드 단계를 추가할 수 있다. 여러 단계를 거쳐야 하면 차례로 추가해 설정하면 된다. 이전 글에서 빌드 스크립트를 배치 파일로 구성했으므로 Execute Windows batch command를 선택한다. 경로는 workspace를 루트로 한 상대 경로로 지정했다.
1 |
.buildvc6_build.bat /f:.buildvc6.build.xml clean build -D:server=yes -D:product_major=1 -D:product_minor=1 -D:product_patch=1 |
빌드를 마친 후 처리할 내용은 Post-build Actions 항목에서 설정한다. 여기서는 E-mail Notification을 선택한다. 메일 주소는 Recipients에 빈칸으로 구분해 적으면 된다.
설정을 마쳤으면 화면 가장 아래에 있는 Save 버튼을 눌러 저장한다.
빌드가 정상적으로 되는지 확인한다. 첫 화면 또는 해당 프로젝트 화면에서 Build Now 아이콘을 선택하면 즉시 빌드를 할 수 있다. 빌드 상태는 날씨 아이콘으로 쉽게 파악할 수 있는데 실패 정도가 많을수록 날씨는 더 나빠진다.
빌드를 실패했을 때는 진행 상황을 확인해야 한다. 첫 화면의 dashboard에서 날씨 아이콘을 선택하면 가장 최근 빌드 내용을 볼 수 있는데 여기서 Console Output을 선택하면 된다. 또는 해당 프로젝트에서 Build History – Console Output을 선택해도 된다.
참고: 빌드 스크립트에는 Visual Studio 환경 변수를 사용해 호출하는 부분이 있다. 명령 행에서 빌드할 때는 문제 없으나 Jenkins에서는 이 환경 변수를 인식하지 못해 실패한다. 이 때는 Jenkins 서비스를 관리자 계정으로 실행하도록 바꾸면 된다. 빌드 도중 Visual Studio 컴파일러나 링커 등에서 실패할 때도 이렇게 해결할 수 있다. 실행 계정을 바꾼 후에는 서비스를 정지 후 다시 실행하면 된다.
빌드가 정상적으로 되는 것을 확인했으면 이제 자동으로 빌드하도록 설정한다. Build Triggers 항목에서 Build periodically나 Poll SCM을 선택한다. Build periodically는 지정 주기가 되면 빌드하는 것이고 Poll SCM은 일정 주기로 저장소에 변경 내용이 있는지 확인 후 있으면 빌드한다. 모두 Schedule에 주기를 지정하는데 프로젝트 성격에 따라 적절히 조절한다. 아래는 매 30분마다 확인 후 변경 내용이 있으면 빌드하는 예이다. 실제 적용은 10분마다 확인하도록 했으며 프로젝트별 설정 – Mercurial Polling Log에서 기록을 확인할 수 있다.
기본적인 설정은 모두 마쳤으나 추가로 이메일 발송 기능을 확장해 보자.
Email-ext 플러그인을 설치하고 Manage Jenkins – Configure System을 선택하면 Extented E-mail Notification 항목을 볼 수 있으며 모든 프로젝트에 적용한다. Override Global Settings를 선택하고 이전에 E-mail Notification에 적은 내용을 여기로 옮긴다.
프로젝트별 설정 화면에서도 Post-build Actions에서 Editable Email Notification 항목이 생기며 프로젝트별로 적용한다. 이 항목을 선택하고 이전에 선택한 E-mail Notification은 선택 해제한다. OpenLDAP 계정에 mail 정보를 추가하면 로그인할 때 자동으로 메일 정보를 가져와 사용한다. 필요에 따라 메일 수신 목록을 Recipient List에 직접 추가해도 된다. 또한 프로젝트저장소에 커밋하면 해당 계정 정보를 자동으로 가져 온다. 또한 Email-ext 플러그인을 설치하면 Jelly script를 사용할 수 있으며 Default Content 내용을 꾸밀 수 있다. 자세한 내용은 플러그인 설명을 참고한다.