기존에 개인 업무용 iMac에 jenkins와 SVN 서버를 구축하고 사용을 하고 있었다.

그런데 개발용으로 사용하는 iMac에 서버를 구축해놓으니 리소스가 너무 후달려 아무래도

제대로 사용하기가 어려웠다.


마침 이번에 철수하는 인력이 사용하던 iMac을 그대로 사용할 수 있게 되어 서버로 사용하기로 했다.

그래서 개발용 iMac에 있던 각종 서버들을 서버용 iMac으로 옮기기로 했다.

(사실 iOS만 개발할 것 같으면 OSX Server를 사용했을텐데 안드로이드도 함께 개발하다보니

 역시 jenkins가 가장 나은 선택인 것같다.)


안드로이드 설정이야 별 어려움 없이 진행했다. 추가로 N’SIQ Collector 플러그인까지 설치하고,

(추후 PMD까지 설치 예정)


문제는 iOS였다...

개발 PC에 구축만 해놓고 한동안 사용을 안했는데 그 사이에 관리해야 할 앱이 하나 추가된 것이다.

문제가 되는 상황은 기존 앱은 하이브리드 앱으로 외부 라이브러리 문제로 Xcode 5.1.1에 SDK를

6.0밖에 사용 못한다는 것이다. 그리고 후에 추가된 앱은 네이티브로 개발된 앱으로 최신 버전의

SDK를 사용 가능하다.


결국 각각 빌드 시 해당 프로젝트에 맞는 SDK를 이용해서 빌드해야 하는데 이 방법을 몰랐던 것이다.


우선 Xcode를 2개 이상 설치한 상황에서 디폴트 Xcode를 선택하는 명령어가 다음과 같다는 것은 알았다.


sudo xcode-select -s /Applications/Xcode.app

sudo xcode-select -s /Users/khiin/Applications/Xcode5.1.1.app 


jenkins 위키 페이지에도 이 내용은 언급되어있다.


https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin


이 곳에 보면 Xcode를 멀티로 설치하는 방법과 디폴트로 사용할 Xcode를 선택하는 방법

그리고 런타임 시 Xcode 버전을 선택하는 방법이라는 내용이 있다.


처음에는 런타임 시 Xcode 버전을 선택하는 방법만 사용하면 될 줄 알았다.

천만의 말씀 만만의 콩떡이었다...ㅠ.ㅠ


결과적으로는 위의 2가지 내용을 조합하는 것이 방법이었다.


잡설이 길어졌으니 이만 줄이고 본론으로 가자


jenkins에서 2개 이상의 Xcode 버전을 런타임시 선택적으로 사용하여 빌드하는 방법


*** 기본적으로 jenkins에서 Xcode 빌드 설정은 완료된 것으로 생각하고 설명한다. 기본적인 jenkins에서의 Xcode 플러그인 설정

방법이 필요하신 분은 아래 주소로...


http://mazdah.tistory.com/519


1. 당연히 2개 이상의 서로 다른 버전의 Xcode가 설치된 것을 전제로 한다.


2. jenkins에서 빌드 전에 환경을 설정해주기 위해 Environment Injector Plugin라는 플러그인을 설치해준다. 



3. 각각의 iOS 프로젝트로 이동하여 구성(설정 또는 config) 화면으로 이동한다.


4. 이름과 설명 밑에 나오는 가장 위에있는 선택 옵션을 보면  Prepare an environment for the run이라는 옵션이 추가되어있다. 체크하자


5. 디폴트 상태에서 Script Content에 다음과 같이 입력한다. (파일에 등록한 후 Script File Path를 지정해도 될 것으로 믿어 의심치 않는다...-.-)



6. 일단 jenkins 설정은 끝이다. 그런데 여기서 또하나의 문제가 발생한다. 바로 sudo 명령어...현재 나는 jenkins를 standalone 형태로

    사용 중인데 이렇게 해놓고 빌드하면 위의 스크립트 실행 후 jenkins 콘솔에 패스워드 입력 프롬프트가 떡하니 나타나서 멈춘 상태로

    있다.


7. 그래서 sudo를 패스워드 입력 없이 수행할 방법을 구글링...역시 없는 게 없는 구글...매우 위험한 방법이지만 내부에서만 사용하는 

   서버이니 한 번 사용해보기로 했다. 바로 sudores 파일 편집


    /etc/sudoers 파일을 편집한다. 강력하게 접근 권한 및 소유권이 지정되어있어 잘 편집이 안된다.

   우선 Finder로 파일을 찾아가서 사용 가능한 계정으로 읽기 쓰기 권한을 준 후 편집하였다. 물론 편집 후 권한은 원위치


   대략 다음과 같은 내용이 나오는 위치로 이동하여


   # Same thing without a password

 # %wheel        ALL=(ALL) NOPASSWD: ALL


  다음과 같은 내용을 추가해주었다.


  jenkins         ALL=(ALL) NOPASSWD: ALL


  의미는 jenkins 계정으로 모든 콘솔에서 모든 명령에 대해 sudo를 이용하여 처리할 때 패스워드를 입력받지 않아도 되는

  권한을 주는 것이다. 매우 위험해보인다...-.-


8. 여기까지 하면 5번 단계의 설정에 따라 런타임 시 각기 다른 Xcode 버전과 SDK 버전을 사용하여 빌드할 수 있게 된다.


요고하느라 하루 그냥 보냈다...ㅠ.ㅠ

'IT 이야기' 카테고리의 다른 글

[jenkins] jenkins에서 멀티 Xcode 사용 설정하기  (0) 2016.01.06
블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

한국시간으로 지난 10월 23일 새벽 2시에 애플의 새 OS인 Mavericks(OS X 10.9, 이하 매버릭스)가 정식 출시되었다.

다양한 기능 개선과 추가로 맥 사용자들은 오래전부터 매버릭스가 출시되기를 고대하고 있었다.


*자세한 기능은 … http://www.apple.com/kr/osx/whats-new/


그 기다림의 끝에서 아주 반가운 소식과 함께 매버릭스가 출시되었는데…

바로 '무료 배포'라는 것이다.


그런데 애플 개발자 사이트에 등록한 개발자들에게는 또 하나의 선물이 있었으니…

OS X Server가 그것이다.


원래 OS X Server는 라이언 버전까지는 OS에 통합되어 일반 데스크탑용 Lion과는 달리

OS X Lion Server라는 별도의 OS로 판매가 되었다. 마치 윈도우 Server와 같은 개념이다.

그러던 것이 Mountain Lion으로 오면서 아예 OS X Server라는 서버 모듈만을 별도로 분리하여

판매를 하게 되었다. 즉, Mountain Lion을 데스크탑에 쓰다가 별도로 OS X Server를 구매하여

설치하면 바로 서버 버전의 OS가 되는 것이다. 기존 OS X Server의 가격은 $19.99이다.





이 OS X Server를 개발자들에게 무료 배포한 것이다.


그런데 이상한 점이 있다.

일반적인 개발자들이라면, 특히 애플 기반의 개발자들이라면 특별히 서버 모듈같은 것은 사용할 일이

없을텐데…


어쨌든 공짜니까! 양잿물보단 훨씬 좋으니까! 일단 다운로드 받아 설치를 해보았다.

그리고 서버 관리 콘솔을 실행시켜 찬찬히 보다보니….그 전에 보지 못했던 것들 중 유독 하나가

눈에 띈다.


Xcode…




상세한 도움말도 지원한다.




그렇다! 이번 업그레이드를 통해 OS X Server에 맥 OS 기반의 개발 IDE인 Xcode가 통합된 것이다.

용도는 CI(Continuous Integration)이다.


프로세스는 이렇다.


서버 콘솔의 Xcode 항목에서 Repositary(SVN과  Git 지원)를 등록한다.

사용할 이름과 URL 그리고 인증 방식을 선택하여 입력하면 된다.







Xcode IDE에서 등록된 Repositary와 연동되는 BOT을 다음과 같이 생성한다.


1. Scheme(빌드 대상)과 이름 및 서버 선택



2. 빌드 스케쥴과 빌드시 수행할 액션 그리고 빌드 전에 clean 수행 여부를 설정



3. 빌드 성공 혹은 실패시 메일을 전달 받을 메일 주소 설정




이렇게 설정해 놓으면 BOT 생성시 등록한 스케쥴에 맞춰 프로젝트 환경에 따라 빌드, 분석, 테스트, Archive 및

최종 커밋까지 자동으로 수행이 된다.


이렇게 진행된 작업은 Xcode IDE 내에서나 웹을 통해 그 결과를 확인할 수 있다.


Xcode 화면





web 화면





사실 CI는 소스코드 무결성 유지와 테스트 및 빌드 그리고 최종 생산품 제출에 이르기까지

그야말로  개발 전과정에 대한 통합이 이루어지는 시스템이다.  이러한 과정에서 개발자들은 보다 신속하게

빌드를 진행할 수 있고 보다 빨리 소스 상의 오류를 감지할 수 있게 된다.


이러한 막강한 기능과 역할에 비해 다른 개발 시스템에 비해 관심도가 그리 높지 않은 형편이다.

꽤 역사가 오래된 Cruise Control부터 최근의 Travis까지 다양한 Tool들도 존재한다.

자세한 내용은 위키피디아 참조 : http://en.wikipedia.org/wiki/Continuous_integration


현재 일하고 있는 곳에서는 Jenkins(구 Hudson)를 사용하고 있는데 Jenkins도 MAC 환경하에서

Xcode 빌드를 지원하여 iOS 개발자로서는 매우 유용하게 사용을 하고 있다.

그런데 새로운 OS X Server와 Xcode5에 이러한 기능이 통합되어 MAC/iOS 개발자들은 최적화된 환경을

제공 받을 수 있게 된 것이다.

(다만 나는 아쉽게도 안드로이드도 함께 관리를 해야 하는 입장이어서 jenkins를 버릴 수는 없다)




(맥 OS X 상에서의 jenkins를 이용한 CI 시스템 구축은 다음 링크를 참조 : http://mazdah.tistory.com/519)


애플은 가장 앞서서 개발자-벤더-사용자가 통합되는 IT 생태계를 만들어왔다. 이 생태계를 통해 이익을 얻는

사람들이 많겠으나 그중 가장 이익을 얻고 있는 것은 개발자가 아닌가 한다. 그리고 그걸 증명이라도 하듯이

애플은 개발자들에게 더 나은 환경을 제공해주고 있다.


비록 국내에서 아이폰의 점유율이 높지 않아 OS X 기반의 개발자들의 입지가 좁아지고 있는 것은 사실이지만

이런 개선들이 지속적으로 이루어진다면 앞으로의 전망은 밝을 것으로 기대된다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 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의 설정만으로도 정상적으로 빌드가 된다.




블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^