최초 작성일 : 2012/06/13 14:31 



Jenkins를 이용한 Android 및 iOS 앱 자동 빌드 시스탬 구축


예전부터 개발의 생산성과 품질을 높이기 위한 모든 방법에 관심이 많았다.

다만 기회가 많지 않아 사용해 본 것이라고는 CVS + CruiseControl의 CI나

Trac + SVN의 이슈 트래커 정도가 다였다.


그러다가 스마트폰의 중흥기에 발맞춰보고자 아이폰 앱 개발을 시작하게 되었고

어찌어찌하다보니 운영 업무로 안드로이드와 아이폰을 모두 관리해야 하는 입장에

처하게 되었다.


더구나 하이브리드 형태다보니 모바일 웹 개발자들이 개발을 하고나서

테스트를 하려면 내가 항상 새로 앱을 빌드해주어야 하는 상황이 되어버렸다.

(원래 하이브리드 형태로 웹 리소스들을 웹서버쪽에 두었더랬는데 성능상의 이슈로

웹 리소스를 아예 단말의 앱쪽에 밀어넣는 우스운 형태가 되어버렸다.)


결국 이러한 상황을 타개하고자 jenkins를 이용한 CI 환경을 구축하게 되었다.

아래 내용은 그 과정에 대한 정리이다.


*** 이 작업에 영감을 주신 맥부기의 '뱅리'님께 감사드립니다 ***


1. 환경


서버 : 맥미니 서버

OS : MAC OSX Lion Server (10.7.3)

소프트웨어 : Jenkins(iOS 앱 빌드를 위해서 Xcode plugin 사용), android_sdk, Xcode(4.2.1)


2. 프로세스 설명


현재 자동으로 빌드하고자 하는 앱은 하이브리드 형태로 대다수의 기능적인 부분은 js, css, html로 구성되어있다.

다만 네트워크의 부하와 성능적인 문제로 인해 불가피하게 리소스들을 웹서버에 두지 못하고 앱 내에

포함을 하게 되었다. 따라서 다음 프로세스에 따라 최종 앱을 빌드하게 된다.


1) SVN 서버로부터 웹 리소스(js, css, html 등)을 checkout(update)하여 jenkins의 workspace에 저장

   * 이 부분은 jenkins를 설치한 후 job을 생성하고 빌드를 수행하면 기본적으로 이루어지는 프로세스이다.


2) 역시 SVN으로부터 단말쪽 앱 소스를 checkout(update)하여 jenkins의 workspace에 저장


3) 1)에서 받은 웹 리소스를 2)쪽에 있는 단말 소스의 적당한 위치에 복사


4) 앱 빌드


5) 빌드된 패키지를 웹페이지에서 다운로드 받을 수 있도록 SVN의 다른 위치에서 commit


이후 단계는 배포서버에 설치된 Hudson (jenkins의 이전 버전)에서 자동으로 빌드된 앱 패키지 파일을 불러와

웹페이의 다운로드 링크 위치에 저장을 한다.


이러한 프로세스를 위해 1), 3)의 프로세스를 수행하기 위한 job(Project)을 하나 만들고

다음으로 안드로이드 앱 빌드를 위한 job과 아이폰 앱 빌드를 위한 job 이렇게 총 3개의 job을 생성하게된다.


잡을 생성한 후에는 웹 리소스를 받아와 앱 소스쪽으로 복사해주는 job을 상위에 놓고

단말 앱을 빌드하는 2개의 job을 서브 프로젝트로 놓아 상위 프로젝트의 빌드를 수행하면 자동으로

하위 프로젝트까지 수행되도록하면 한번의 빌드로 전 과정이 수행되게 된다.


3. 상세 설명


3-1 소프트웨어 설치


우선 이 내용은 아이폰 앱 빌드를 포함하고 있기 때문에 MAC을 기반으로 설명을 한다.

jenkins는 맥용으로 다운로드받아 설치할 수도 있다.(jenkins 홈페이지에 가면 각 OS별 네이티브 바이너리를

다운로드 받을 수 있다.)

하지만 여기서는 jenkins.war를 다운로드 받아 설치하였다.


다운로드 위치 : http://jenkins-ci.org/

jenkins 실행 : 가단하게 standalone으로 실행하였으며 실행 방법은 다음과 갘다.

java -jar jenkins.war --httpPort=[port번호]


이렇게 설치하게 되면 jenkins의 root 디렉토리는 /Users/[사용자 계정]/.jenkins가 되며

SVN으로 부터 checkout한 소스들은 /Users/[사용자 계정]/.jenkins/workspace 아래 jenkins에서 생성한

프로젝트명으로 디렉토리를 생성한 후 그 아래 저장된다.


3-2 웹 리소스를 SVN으로부터 checkout(update)하여 앱 소스쪽으로 복사하는 job 생성


- jenkins의 메인 화면에서 '새로운 job' 선택

- job 이름 입력 (이 곳에 입력된 이름으로 workspace아래 디렉토리가 생성되므로 가급적 영문으로 입력)

- 프로젝트 형태는 기존 job 복사를 제외하면 4가지가 있는데 무난하게 첫번째 free-style로 선택한 후 OK 버튼 클릭





- OK 버튼을 누르면 바로 새로 생성된 job의 설정 화면으로 이동한다. 이 job은 SVN에서 소스를 가져와 다른 위치로 복사하는 프로세스를 수행하므로

   관련된 설정만 정리한다.


소스 코드 관리 항목

* Subversion 선택

* Repositary URL에 SVN repositary 주소 입력

Local module directory (optional) 항목은 소스를 저장할 위치인데 디폴트인 .으로 놔두면 위에서 언급한대로jenkins 설치 위치의 workspace아래 job이름의

  디렉토리 아래로 소스들이 저장된다.


Build 항목

* Add build step 선택. 선택할 수 있는 항목은 아래와 같은데 웹 리소스를 카피하기 위한 build.xml 파일이 기존 소스에 포함되어 있었기 때문에

  여기서는 Invoke Ant를 선택하였다. 단순 카피만 수행한다면 Execute shell을 선택하여 shell script로 처리해도 될 것이다.





* Ant의 빌드 파일(build.xml)에서 수행할 Target의 이름을 적어준다. Target이 여러개일 경우 공백으로 구분하여 적어준다.


* Invoke Ant를 선택하면 jenkins는 기본적으로 현재 job 경로의 root에서 build.xml 파일을 찾는다. 즉 TEST라는 프로젝트라면

  /Users/[사용자 계정]/.jenkins/workspace/TEST/build.xml을 수행하게 되는 것이다. 만일 build.xml이 다른 경로에 있거나 빌드 파일이

  다른 이름이라면 '고급…'버튼을 클릭 후 Build File 항목에 빌드파일의 경로와 이름을 적어준다.





Post-build Action 항목

* 앞서 프로세스에서 설명한 바와 같이 소스 카피 후 바로 앱을 빌드하는 job을 수행해야 하므로 Add post-build action에서 'Build other project'를 선택한다.

* Project to build에 앞으로 추가할 앱을 빌드하는 job의 이름을 입력한다. 2개 이상의 job을 수행하려면 ,로 구분하여 적어준다.





마지막으로 저장 버튼 클릭 후 프로젝트 메인 화면으로 돌아오면 최초로 Build Now를 수행하여 SVN으로부터 소스를 Checkout한다.

물론 설정에서 등록한 모든 작업들이 진행된다.


3-3 안드로이드 앱 빌드 job 생성


job 생성에서부터 소스 코드 관리 항목까지의 작업은 3-2와 동일하다.


빌드 트리거 항목

* 3-2의 job 수행 후 바로 수행되도록 설정하기 위해 '다른 프로젝트가 빌드된 후 빌드함' 항목에 체크

* Project names에 선행할 프로젝트 이름을 입력한다. 2개이상의 프로젝트 이름은 ,로 구분하여 입력한다.





Build 항목


*** 사전 준비 ***

먼저 로컬에서 안드로이드 프로젝트의 빌드를 수행하는 Ant 빌드파일을 생성하고 이 빌드 파일을 함께 SVN에 커밋한다.

빌드 파일 생성은 [android sdk]/tools로 이동하여 다음 명령어를 수행하면 된다.


 ./android update project -p [안드로이드 프로젝트 경로] -n [프로젝트 이름]


이 명령을 수행하면 프로젝트 root 아래에 다음 2개의 파일이 생성된다.


build.xml

local.properties


이 중 build.xml은 수정할 것이 없고 local.properties에 android sdk 경로가 기록되는데 jenkins를 통해 자동 빌드를 해야 하므로

이 경로를 jenkins 서버의 환경에 맞춰 수정해주어야 한다.


이렇게 생성된 2개의 파일을 모두 SVN에 commit한다.


* 3-2와 마찬가지로 Invoke Ant를 선택하고 수행할 Target을 적어주는데 'clean debug' 이렇게 적어주면 된다(따옴표 없이 적음)

* 여기까지 하면 Build Now를 수행했을 때 .apk 파일이 생성되어 프로젝트 root 밑에 bin 디렉토리에 저장된다.

* 나는 여기서 배포용 서버까지 올리는 작업을 추가로 진행하였기 때문에  Add build step을 추가하고 (Execute shell) shell script를 통해

생성된 .apk 파일을 또 다른 SVN의 working copy(SVN 서버에서 checkout한 위치)로 복사를 한 후 그 위치로 이동하여 commit을 수행하는 내용을 추가하였다.

참고로 아래와 같은 코드이다.


# 기존 .apk 파일 삭제

rm [svn working copy]/[앱 패키지명].apk


# jenkins 프로젝트에 생성된 앱 패키지를 svn working copy로 복사

cp [jenkins 프로젝트 root]/bin/[앱 패키지명].apk [svn working copy]/[앱 패키지명].apk


# svn working copy로 이동

cd [svn working copy]


# 빌드번호 부여를 위해 날짜값을 구함

buildDate=`date +%Y%m%d%H%M%s`


# SVN 서버로 commit

svn commit -m "앱 이름 Android build$buildDate" [앱 패키지명].apk


마지막으로 '저장'버튼 클릭 후 3-2와 마찬가지로 Build Now를 클릭하여 최초 빌드를 수행해준다.



3-4 iOS 앱 빌드 job 생성


사전 준비로 jenkins에 Xcode plugin을 설치해야 한다.

다운로드 위치 : https://updates.jenkins-ci.org/download/plugins/xcode-plugin/ 1.3.1 버전 다운로드


jenkins 메인 화면의 'jenkins 관리'->'플러그인 관리'로 이동한다.

상단 탭 버튼 중 '고급'으로 이동하여 중간 부분에 있는 '플러그인 올리기'에서 다운로드 받은 xcode-plugin.hpi 파일을 선택하고

'올리기' 버튼을 클릭하면 설치된다.


아니면 '설치 가능' 탭에서 바로 플러그인을 선택하고 설치해도 된다.


빌드 트리거 항목까지는 3-3과 동일하게 진행한다.


Build 항목

* Add build step에서 Xcode를 선택합니다. 상당히 많은 입력항목이 나오는데 대부분 디폴트로 둔다.(비어있는 항목도 그대로)

  직접 설정해야 할 것은 'Clean before build?'와 Build IPA?', 'Keychain password'정도만 입력해주면 된다.


* 3-3과 마찬가지로 배포용 서버로 업로드 해야 하므로 Add build step에서 Execute shell을 선택하고 shell스크립트를 작성하는데

  내용은 경로와 앱 이름을 제외하고는 3-3과 동일하다.


'저장'버튼을 눌러 저장하고 최초로 Build Now를 눌러준다.

기존에 Xcode에서 정상적으로 빌드되는 프로젝트라면 jenkins의 설정만으로도 정상적으로 빌드가 된다.




블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^