SVN을 쓰다가 GitHub로 넘어왔을 때 가장 혼란스러울만한 것이 바로 Commit과 Push가 아닐까 

한다.


SVN의 경우 원격 Repository만 있기 때문에 commit 하면 바로 SVN 서버의 repositary에 변경 사항이 반영된다. 이 것만 생각하고 Git에서 commit만 날려놓고 멍때리고 있다가는 나중에 원격 repository에 골동품 소스만

존재하는 것을 목격하게 될 것이다.


Git은 로컬 repositary 개념을 가지고 있고 commit은 실제로는 이 로컬 repositary에 올리는 작업이다.

이 로컬 repositary는 네트워크가 끊기거나 했을 때는 상당히 유용하지만 처음 접하게 되면 이렇게 혼란스러운 것도 

사실이다.


어쨌든 Git에서는 이렇게 commit을 한 후 push를 해줘야 최종적으로 원격 repositary에 반영이 된다.

어떻게 보면 불편하게 보일 수도 있으나 대부분의 툴에서 commit & push 기능을 지원하니 이 옵션을

사용하면 될 것이다. 

저작자 표시
신고

최초 작성일 : 2012/08/30 16:50 


현재 맥에서 안드로이드 개발을 진행하기 위해 맥용 이클립스를 설치하고

작업을 진행 중이다.

최근 OSX 마운틴 라이언을 클린 설치하느라 이클립스도 버전 업을 해서
JUNO 버전을 설치했는데...왠걸...안드로이드 빌드만 하면 제목과 같이
'Unabled execute dex:java heap space'라는 에러가 난다.

검색 결과는 대부분 라이브러리 설정 문제에 관한 이야기들이고
간혹 용량이 큰 리소스 문제라는 사람들도 있었는데...

나의 경우는 진짜로 힙 메모리가 부족해서 난 것이었다.
세상이 어느 때인데 Xms 40m, Xmx 512m가 왠말이냐...-.-

암튼 힙 사이즈 늘려서 해결 봤다...
살짝 허무함...

저작자 표시
신고

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




저작자 표시
신고

최초 작성일 : 2012/04/24 11:35


트위터 사용자의 프로필을 가져와서 앱 화면에 뿌려 줄 일이 생겼다.

당근 Twitter의 개발자 페이지로 들어가 API를 검색해보았다.
제일 먼저 눈에 띈 것은

GET users/profile_image/:screen_name

그런데 아무리 이 API를 사용을 해봐도 response값이 계속 null만 나온다.
구글링을 통해 몇가지 변형을 사용해봐도 여전히 응답은 null...
URL을 브라우저에 직접 치면 이미지가 잘만 뜨는데...ㅠ.ㅠ

한참 삽질을 하다가 다시 살펴본 트위터 문서...

This resource does not return JSON or XML, but instead returns a 302 redirect to the actual image resource.

This method should only be used by application developers to lookup or check the profile image URL for a user. This method must not be used as the image source URL presented to users of your application.

이 API는 json이나 xml타입의 응답을 돌려주는 것이 아니란다.
실제 이미지로의 리다이렉션을 리턴한다네. 그리고 그 아래 내용은 이 API는 그냥
사용자에게 프로필 이미지가 있는지 확인하는 차원에서 사용하고 앱에 이미지를
출력하는 용도로는 사용하지 말란다...제길쓴!

결국 아래 API로 처리했다. 그리고 이 것이 맞는 방법인 듯싶다.

GET users/lookup


저작자 표시
신고

최초 작성일 : 2012/04/13 15:48 


SVN 서버 물리적 저장소 용량 부족해서 commit이 안된다고 TA한테 공간

확보좀 해달라고 했더니 서버에서 파일을 덜렁 지워버렸다...-.-

갑자기 리비전 정보가 사라지니 클라이언트에서 서버에 붙을 때
제목과 같은 오류가 발생을 하였다.

결국 temp쪽에 있던 리비전 파일들을 repository로 옮겨놓고나서야
정상 작동하게 되었다.

제목과 같은 오류에서는 repository가 정상적으로 링크되어있는지,
리비전 파일을 임의 삭제한 적은 없는지 확인이 필요하다.

저작자 표시
신고

최초 작성일 : 2012/01/04 19:05 


자세한 설명을 기대하신 분들껜 죄송...-.-


일단 Lion 서버에는 기본적으로 아파치와 svn이 설치되어있으므로
아파치와 svn 연동은 기존 리눅스에서 하던 것과 동일하게 처리함.

다음은 trac 설치 및 아파치, svn과의 연동이었는데 이 것은 맥에서 설치한
케이스를 검색하기가 쉽지 않고 몇군데 찾아본 곳에서 적힌대로 시도한 것은
모두 실패함

구글에서 검색한 결과 중 가장 깔끔한게 정리된 곳이 아래 링크


한방에 깔끔하게 trac을 설치하고 아파치 연동까지 완료.

마지막으로 trac과 svn 연동은 단지 trac.ini에서 repository 경로를 적어주고
몇가지 중요해보이지 않는 설정을 해주면 끝~

대략 3일간의 삽질 끝에 아파치 + svn + trac 설치를 완료하였다.
SSL까지 적용하려고 했으나 내부망에서 혼자 쓰는 것이기에 깔끔하게 생략~^^;;;

아름다운 나의 trac...@.@




저작자 표시
신고

+ Recent posts

티스토리 툴바