CI with jekins and node.js

Jenkins 설치하기

Yum 으로 설치

yum 에서 jenkins 패키지를 인식 못할 수 있다. 이 경우에는 아래와 같이 패키지를 검색할 저장소를 추가해주면 된다.

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
$ sudo rpm –import http://pkg.jenkins-ci.org/redhat-stable/jenkins-ci.org.key

그리고 다시 yum 으로 설치를 시도한다.

$ sudo yum install jenkins.noarch

아래 명령으로 jenkins 의 jetty 웹 서버를 실행할 수 있다. 기본 설정으로 8080 포트로 사이트가 열리게 되므로 http://servername:8080 으로 접속해 볼 수 있다.

$ sudo service jekins start

jenkins_1

보안 설정

가장 적은 노력으로 jenkin 의 보안 설정하는 방법은 자체 사용자 데이터를 사용하는 것이다. 다음과 같은 단계로 설정한다.

  1. 왼쪽 jenkins 관리 메뉴 선택, Configure Global Security 클릭한다.
  2. Enable Security 클릭, Access Control 항목이 펼쳐진다.
  3. Jenkins’ own user database 를 선택한다.
  4. 사용자 가입 허용을 체크한다.

주의사항 페이지 하단에 저장 버튼을 클릭해야 적용이 된다.

기업 환경에서 구축하는 경우에는 상당수 기업이 윈도우 환경이기 때문에 active directory 기반의 사용자 관리를 하고 있을 것이다. 윈도우 서버에 jenkins 라면 Active Directory plugin을 사용하면 되고 리눅스 서버라면 추가로 LDAP 기반 인증 을 사용할 수 있다. 그외의 설정들은 jenkins wiki 를 참고한다.

권한 설정은 서버에 인증된 사용자가 할 수 있는 작업을 설정하는 것이다. 사용자별로 세밀한 작업 권한을 주기 위해서는 Matrix-based 보안을 설정해야 하는데 소수의 인원이 사용하는 경우라면 인증된 사용자에게 모든 권한을 주는 것이 좋겠다. ‘Logged-in users can do anything’ 을 선택하자. 하단의 저장 버튼을 클릭해서 저장한다.

jenkins 자체 사용자 기반이라면 사용자 계정은 본인이 스스로 계정을 생성해야 한다. 첫 화면의 상단에 ‘가입’을 클릭해서 사용자 정보를 등록하고 계정을 만든다. 생성된 계정으로 로그인 하지 않으면 왼쪽 메뉴에서 작업할 항목이 보이지 않는다.

주의사항 필요한 기간 사용자 가입을 받고 그 이후에는 사용자 가입 허용항목을 해제했다. 처음부터 가입 허용을 하지 않기 위해서는 관리자가 jenkins 관리 에서 manage users 항목으로 들어가서 사용자 생성 메뉴를 이용하면 된다.

Node 설치

NVM 을 이용해서 node 을 설치한 경우, 다양한 설치 경로 때문에 문제가 많다. 패키지 관리자를 이용해서 node를 정해진 경로 /usr/local/bin 에 설치하자.

jenkins 는 기본적으로 자바, 메이븐, 앤트와 동작한다. node 프로젝트에 대해서 test 과정을 담는 시도가 많은데 이런 노력이 아깝기도 하고 모카(자바의 다른 커피종류?)를 이용한 XUnit 이 기존 JUnit 과 거의 유사해서 이를 이용하여 jenkins 로 ci (continuous integration build)를 구성 해보자.

아래와 같이 package.json 설정을 해서 npm 으로 하여금 테스트를 수행하게 하고 XUnit이 그 결과를 xml 형태로 출력하게 하면 jenkins 에서 결과를 읽어볼 수 있도록 한다.

'scripts': {
  'test': 'XUNIT_FILE=test-report.xml ./node_modules/.bin/mocha --recursive -R xunit-file test'
}

mocha 가 프로젝트의 배포에 같이 포함되어야 하므로 –save-dev 옵션으로 설치되어야 node_modules 폴더에 들어가게 된다. 위의 설정으로 npm test 를 수행하게 되면 mocha를 이용해서 test 폴더의 모드 하위 폴더에 대해서 테스트 코드를 수행하게 된다. XUnit 보고서를 사용하므로 “test-reports.xml” 이란 이름의 파일이 결과로 생성된다.

Jenkins 에 Node project 추가

모카 설정이 끝나면 jenkins 에 프로젝트를 등록할 수 있다. Node.js를 위한 jenkins plugin 도 있지만 빌드 하는 동안 node 코드를 실행하는 것에 필요한 것이지 테스트를 위해서는 아무 도움이 되지 못한다. 그래서 freestyle 프로젝트로 진행하기로 한다.

git plug-in 설치

서두에 언급한 것처럼 jenkins 에서 Node 는 기본으로 지원하지는 않는다. 따라서, 별도의 plug-in 을 설치해야 한다. jenkins 관리플러그인 관리로 가서 설치가능 탭을 열어보고 검색을 이용해 git plugin 을 찾는다. 선택을 하고 설치 버튼을 클릭하면 필요 plugin 까지 (git client, scm api plugin 등) 같이 설치된다. 사이트를 재 시작해야 다음 작업을 진행할 수 있다.

git 설정

jenkins 에서 git 의 기능을 활용하는 것이므로 미리 git 를 설치해 두어야 한다. install git 참조. jenkins 관리에서 시스템 설정으로 들어가면 Git 항목이 볼 수 있다. 없다면 사이트를 재시작하고 다시 접속해 본다.

git 인증 정보

git 저장소가 원격 서버에 존재하고 접근 과정에 인증이 필요하다면 인증 정보를 등록해야 한다. 메인 화면 왼쪽에 Credentials 항목을 클릭해서 Add 버튼을 누르고 인증 정보를 추가한다. 인증 정보는 ssh 키를 이용하는데 jenkins 서버에 jenkins 가 어느 계정을 사용하는지 파악하여 동일 계정으로 터미널로 들어가야 한다. jenkins 사이트는 보통 jenkins 계정으로 실행되는데 /etc/sysconfig/jenkins파일에서 아래와 같이 설정되어 있다.

JENKINS_USER=”jenkins”

이제 jenkins 계정으로 접속해서 아래와 같이 키 파일을 만든다.

$ ssh-keygen -t rsa

키 파일 생성 후에 .ssh폴더 안에 id_rsa.pub 라는 파일이 생기는데 이 파일을 git 저장소가 있는 서버로 복사한다.

$ scp -i git-user-key.pem ~/.ssh/id_rsa.pub git-user@git-server:~/

아래 명령은 저장소 서버에 ssh 방식으로 jenkins 서버의 계정이 접속할 수 있도록 인증을 위한 키 내용을 등록하는 명령이다.

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

빌드 작업 추가

item 추가

메인 화면의 왼쪽의 새로운 item 메뉴를 클릭한다. item 이름에 프로젝트 이름을 등록하고 프로젝트 종류 중에 Freestyle 을 선택한다. OK 를 클릭하고 다음으로 넘어간다. 소스코드 관리 항목에 Git 를 선택한다. 저장소의 경로를 입력하는데 git clone 에 사용했던 저장소를 기록한다.

저장소 형태 사용 예
로컬 저장소 file:///var/lib/jenkins/git/project-1.git
원격 저장소 ssh://git-user@git-server/git/project-1.git

그러나 불행히도 git 저장소는 이미 다른 계정의 폴더에 생성이 되어있을 수 있다. 만일 /home/git-user/git/project-1.git과 같이 만들어져 있다면 jenkins가 접근할 수 없으므로 아래와 같이 오류가 발생한다. clone a repo from local machine. Error code 128

jenkins-2

이런 경우는 jenkins를 다른 계정(git-user)으로 실행하도록 변경해야 한다. 아래와 같이 따라하자. 원격 저장소를 이용하는 경우에는 아래 내용은 스킵해도 된다.

로컬 저장소 접근 권한 설정

jenkins 서비스를 실행하는 스크립트 /etc/init.d/jenkins 파일을 보면 $JENKINS 로 시작하는 변수가 몇 군데 발견된다. 이 변수 값은 앞 부분에 설명된 것과 같이 /etc/sysconfig/jenkins 설정 파일에 기록되어 있는데 이 값을 바꾸고자 한다.

jenkins를 중지 시키고 설정 파일을 바꾸기 전에 다른 이름으로 백업한다.

$ sudo /sbin/service jenkins stop
$ cp /etc/sysconfig/jenkins /etc/sysconfig/jenkins.bak

그런 다음 편집기를 이용해서 설정 파일에 jenkins 실행 계정을 git 저장소를 생성한 계정으로 바꿔준다.

JENKINS_USER=”git-user”

그리고 jenkins 가 사용하는 폴더의 권한도 변경된 계정이 접근할 수 있도록 권한을 변경해 주어야 한다. 아래와 같이 명령을 실행한다.

$ sudo chown -R git-user:git-user /var/lib/jenkins
$ sudo chown -R git-user:git-user /var/cache/jenkins
$ sudo chown -R git-user:git-user /var/log/jenkins

jenkins를 변경된 설정으로 다시 실행한다.

$ sudo /sbin/service jenkins start

빌드 설정

freestyle 로 생성 되었으므로 shell 을 직접 실행해서 빌드를 수행할 수 있다. Command 부분에 아래와 같이 입력하면 node_modules 에 필요한 패키지를 다운로드 받고 위에서 정의한 테스트 명령을 실행한다.

npm install
npm test

테스트에는 mocha 를 이용해서 수행되고 결과는 xunit 에 의해 xml 형태로 남게된다. 그 바로 아래 섹션에서 테스트 결과를 jenkins 에서 볼 수 있도록 설정할 수 있다.빌드 후 조치섹션에 아래와 같이 테스트 결과 파일명을 기록하면 된다.

Test report XMLs test-report.xml

화면 하단의 저장 버튼을 눌러서 등록한다.

빌드 수행

메인 화면에서 오른쪽에 등록된 프로젝트의 목록이 나타난다. 방금 등록한 프로젝트를 클릭해서 들어가 보면 왼쪽에 메뉴 중에 Build Now 항목을 클릭해서 테스트를 실행해 보자.

jenkins-3

테스트 결과를 그래프 형식으로 볼 수 있고 오류가 난 경우 해당 오류를 클릭하면 상세한 내용을 볼 수 있도록 화면이 이동될 것 이다. 이번 테스트 동안에 발생한 오류는 환경 변수 설정이 누락되어 데이터 접근에서 서버를 찾지 못하는 오류가 발생하였다. jenkins 플러그인 중에 Environment Injector Plugin 를 사용하면 빌드 수행 전에 필요한 변수 값을 설정할 수 있다.

커버리지 보고서

테스트의 결과는 전체 소스 코드 중, 어느만큼 테스트 된 것인지 확인하는 방법이 필요하다. 테스트 결과 100% 만족한다 하더라도 일부 코드에 대한 테스트만 실행되었다면 크게 의미가 없기 때문이다. 테스트를 수행하는 mocha 라는 패키지가 있듯이 테스트를 수행하는 동안 전체 코드 중 테스트에 점검된 범위를 측정하는 istanbul 이라는 패키지가 있다. jenkins 에서 cobertura plugin 을 통해서 istanbul 의 보고서를 볼 수 있도록 jenkins-mocha 라는 패키지를 설치 해보자. istanbul 의 설치 및 자세한 내용도 mocha – nodejs test framework 문서에서 확인할 수 있다.

$ npm install –save-dev jenkins-mocha

package.json 파일의 devDependencies 항목에 패키지와 버전 정보가 기록된다. 이제 npm test 명령으로 사용된 mocha 명령을 아래와 같이 변경하자.

{
  'scripts': {
    'test': 'jenkins-mocha test/*';
  }
}

이제 npm test 명령을 수행하게 되면 jenkins-mocha 패키지가 mocha 를 이용해 test를 진행하고 istanbul 을 이용해 커버리지 보고서를 만들게 된다. 산출물은 프로젝트 폴더 안에 artifacts 폴더가 생성되고 테스트 결과는 test폴더 안에 xunit.xml 파일로 생기고 커버리지 결과는 coverage 폴더에 cobertura-coverage.xml 파일로 생성된다. 다른 위치에 저장하기 원한다면 각각 $TEST_DIR, $COVERAGE_DIR 환경 변수 값을 설정하면 된다.

jenkins 에도 마찬가지로 cobertura 플러그인을 설치해야 한다. jenkins 관리 메뉴에서 플러그인 관리로 가서 이름으로 검색하면 쉽게 플러그인을 추가할 수 있다.

jenkins-4

플러그인이 추가되면 이제 이번에 추가된 프로젝트로 가서 빌드 후 조치 중에 cobertura 를 통해 커버리지 보고서를 보여 주도록 구성을 추가해야 한다. 프로젝트 “구성” 메뉴를 선택하여 화면 맨 하단에 빌드 후 조치 추가 버튼을 누르고 cobertura 섹션에 커버리지 결과 파일 경로명을 적어주고 이전에 입력한 테스트 결함 결과 보고서 위치도 변경된 위치로 수정해주어야 한다.

jenkins-5

설정이 끝났으면 다시 프로젝트를 빌드한다. 경로명의 철자가 틀리면 빌드의 결과가 실패로 보일 수 있으므로 실패됐다면 다시 한번 확인하자. 테스트 커버리지가 각 항목별로 정리되어 표시된다.

jenkins-6

참고 사이트