본문 바로가기

OS/Linux

리눅스에서 지속적인 통합(CI) 툴 Jenkins 설치

요즘 내가 투입되어 있는 프로젝트에서 사용하는 Jenkins에 대해 알아보고자 한다. 

 

 

*. Jenkins를 뭐하는데 사용하는가? 
여러가지 있지만, 여기에 작업으로 등록해두면 주기적으로 알아서 최신 소스 코드를 형상 관리 툴에게서 checkout하여 컴파일 하고, 단순히 컴파일 하는 것 뿐만이 아닌, 산출물에 라벨링을 하여 보관하고, 결과를 로그로 남겨둔다.

게다가 이 모든 작업을 웹 인터페이스로 제공하여 무척 쉽게 사용할 수 있다.

여러가지 상황에 대응할 수 있지만, 간단히 jenkins가 사용되는 예를 들어보면
누군가가 svn에 새로운 코드를 커밋하여 리비전을 업데이트 하였지만, 사실 여기에는 버그가 있다. 주기적으로 컴파일을 하는 Jenkins는 이를 컴파일 하고 실패했을 시 출력되는 에러 코드를 로그로 남겨둔다. 이 로그에는 에러 코드 뿐만 아니라 컴파일한 소스의 리비전 정보와 이전 리비전과의 차이인 diff 정보, 그리고 누가 업데이트 했는지에 대한 정보도 포함된다. 이로 인해 만일 누가 프로그램을 무너트린 범인인지 찾아낼 수도 있다.

또한 프로그램을 수정 및 컴파일 하다보면 어떤 버젼에서는 되었는데 수정 후 안되는 경우도 있다.
이럴 경우 svn의 복구 기능을 이용할 수도 있지만, 단순히 바이너리 파일만 필요로 하는 경우라면 이전 컴파일에 성공한 바이너리 파일만을 다운로드 받을 수도 있다.

언제 어디서 왜 컴파일이 성공하고 실패하였으며, 성공한 컴파일 산출물들(바이너리 파일들)을 보관 관리하며 이 모든 것을 웹 인터페이스로 쉽게 접근할 수 있는 프로그램이라고 할 수 있다.


1. Jenkins 설치
- 자동 설치 및 업그레이드를 위한 package repository 등록
# vi /etc/apt/sources.list

다음 코드 추가


- 설치
# apt-get update
# apt-get install jenkins

- 아파치 설치 
# aptitude install apache2

- 아파치2를 포트 80에서 8080으로 프록시 하기 위한 설정
# a2enmod proxy
# a2enmod proxy_http
# a2enmod vhost_alias

만약 이미 가상 호스팅이 설정되어 있다면 다음 커맨드를 수행하지 않는다.
# a2enmod default
# vi /etc/apache2/sites-available/jenkins

<VirtualHost*:80>

ServerAdmin webmaster@localhost

ServerName ci.company.com

ServerAlias ci

ProxyRequests Off

<Proxy *>

Order deny,allow

Allow from all

</Proxy>

ProxyPreserveHost on

ProxyPass / http://localhost:8080/

</VirtualHost>


# a2ensite jenkins

# apache2ctl restart



설치가 완료되었다. 

이후 인터넷 브라우져로 http://[자신의 서버 주소]:8080 으로 jenkins에 접속할 수 있다.



2. Jenkins 설정

우선 사용에 앞서 설정을 좀 해두도록 하겠다.

http://[자신의 서버주소]:8080 으로 접속하시면 jenkins 페이지가 나타난다.


- Jenkins 접속 권한 설정

좌측의 'Jenkins 관리'를 클릭 -> 'Configure Global Security'를 선택


지금 상태로는 서버가 Jenkins 서비스를 제공한다는 사실만 안다면 누구나 접속해서 사용할 수 있다. 나는 인증되지 않은 사용자가 함부로 소스를 컴파일하거나 설정을 변경하기 원치 않으므로 접속 권한을 제한하도록 할 것이다.


'Enable security'에 체크

'Security Realm'에서 'Unix user/group database'를 선택. 이를 통해 리눅스 계정의 아이디와 비밀번호로 접속할 수 있다.

'Authorization'에서 'Logged-in users can do anything'을 선택. 이를 통해 로그인한 사용자는 모든 것을 할 수 있게 되었다.

'Save' 버튼을 눌러 적용해준다.



- Jenkins 기본 설정

좌측의 'Jenkins 관리'를 클릭 -> '시스템 설정' 선택


작업 개수, 사용할 svn의 workspace version, email notify 등을 설정해준다.




3. Jenkins 작업 추가

첫 화면에서 '새로운 Job'을 선택한다.


'Job 이름'은 영문으로 띄어쓰기 없이 작성한다. 이후 리눅스 Jenkins workspace 폴더에 이 이름으로 폴더가 생성된다.

'Build a free-style software project'를 선택한다.


'소스 코드 관리'에서 'Subversion'을 선택한다. 우리는 앞서 설치한 svn을 이용할 것이다. 

'Repository URL'에 'svn://localhost/[저장소이름]/trunk'를 입력한다. (보다 구체적인 경로도 ok)

'Local module directory'에 svn에게서 checkout한 소스가 저장될 폴더를 지정한다. 기본 값은 '.'으로 이는 /home/jenkins/workspace/[작업이름]/ 을 의미한다.


'Execute shell'에서 'Add build step'을 클릭 후, 'Execute shell'을 선택. 빌드 시작 버튼을 클릭했을 시 수행할 쉘 스크립트를 작성한다. 보통 빌드를 위한 명령이 들어간다. 나는 arm linux kernel 빌드를 수행하였으므로 


make clean

make -j48 zImage


를 입력하였다. 쉘 스크립트 실행 위치는 /home/jenkins/workspace/[작업이름]/ 이다.


'Post-build Actions'에서 'Add post-build action'을 클릭하고 'Archive the artifacts'를 선택하여 아카이브할 파일 산출물이 들어있는 폴더/파일을 넣어둔다. 내 경우는


arch/arm/boot/zImage


이다. 이렇게 설정해두면 이후 빌드가 완료되면 zImage파일을 복사하여 /home/jenkins/jobs/[작업이름]/builds/[빌드날과 시간]/archive/ 에 저장된다. 이를 통해 산출물을 관리할 수 있게 된다.


'저장' 버튼을 눌러 적용.


 

그밖에 주기적으로 컴파일을 한다거나, Jenkins 플러그인을 통한 추가 설정은 입맛대로 수행하시면 된다.


 


이후 대쉬 보드에 추가한 작업이 나오고 우측의 아이콘을 클릭하여 빌드, 컴파일을 실행할 수 있다.

작업을 선택하면 작업 페이지에서 다음 작업 들을 할 수 있다.


  • 작업 설정

  • 작업 공간에서 svn에게서 checkout한 파일들을 다운로드 

  • 가장 최근에 빌드에 성공한 산출물 다운로드

  • '최근 변경 사항들'을 통해 빌드한 소스 코드들의 리비전이 이전 리비전과 어떻게 달라졌는지 확인 가능. (svn diff와 같음)

  • 빌드 수행에 의한 콘솔 출력 결과를 확인 가능.

  • 기타 빌드 상태를 확인 가능.



이제 웹 인터페이스를 통해서 버튼 한번으로 가장 최신의 소스 코드를 빌드하고, 그 산출물을 버튼 한번으로 다운로드 받을 수 있으며, 빌드 히스토리를 통해 이전 빌드 산출물을 다운로드 하거나, 빌드 에러 원인의 추적 등을 수행할 수 있다.

'OS > Linux' 카테고리의 다른 글

리눅스 시스템 설정과 자원 사용량 확인 명령어  (0) 2013.11.26
vi 스크립트 명령어  (0) 2013.07.30