아마존 AWS로 안드로이드를 자동 빌드하고 테스트 하는 CI 설치해보자


아래 3개의 문서를 참조하고 엄청난 실험으로….(거의 10시간 투자) 마침내 성공합니다. 생각보다 Android emulator 를 리눅스에 올리는 것이 쉽지 않네요.


기본 설치

0. AWS Instance

우선 하나의 Instance를 만들어야하는데 하드디스크는 반드시 30G를 선택 (Android SDK만 20G이상 필요).

(AWS를 잘 모르시면 제가 적은 AWS 관련 글 http://www.se.or.kr/category/%EC%95%84%EB%A7%88%EC%A1%B4%20%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4%20%28AWS%29 참조)


급하신 분들을 위해 아래 설정이 모두된 AWS 이미지 (AMI)를 공개합니다.

https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Images:visibility=public-images;imageId=ami-859496b5;sort=name


1. 오라클 자바 - Java (Oracle-java)

http://askubuntu.com/questions/521145/how-to-install-oracle-java-on-ubuntu-14-04

다른 자바는 중간에 이해할수 없는 에러가 발생하니 가급적 오라클자바 7/8이상 설치.


2. Android SDK 설치

pcIhZZqjIHtMlL-cW2i3Z7LGhj8pAo387DHQBkBIH40gtslgpSXxsjyjQvCe0V_nGSAacSGZWOBfAoShy2bI8m5vh3xMp2tX2_qNSFvQYGtuFNjj2_6GFAqylaJLP-bUmNrQSaE


(설치는 https://www.digitalocean.com/community/tutorials/how-to-build-android-apps-with-jenkins 참조)


cd ~

wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz

tar xvfz android-sdk_r24.3.3-linux.tgz

cd android-sdk-linux/


Android를 위한 환경 설정


ubuntu@ip-172-31-19-3:~$ vi ~/.profile

다음줄 추가

export ANDROID_HOME="/home/ubuntu/android-sdk-linux"

export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

------

ubuntu@ip-172-31-19-3:~$ source ~/.profile

android 명령실행 가능한지 간략 테스트후 실제 SDK와 Platform 설치.


-- 전체 다 설치: 가급적 이거 권장

android update sdk --no-ui


-- 리스트 보고 원하는 번호를 선택하여 설치

android list sdk --all


Packages available for installation or update: 151

  1- Android SDK Tools, revision 24.3.3

  2- Android SDK Platform-tools, revision 22

  3- Android SDK Platform-tools, revision 23 rc4

  4- Android SDK Build-tools, revision 23 rc3

  5- Android SDK Build-tools, revision 22.0.1



android update sdk -u --all --filter <number>

-- 예제

android update sdk -u --all --filter 5


24-28 (SDK Platform) 설치

1-5 (SDK Platform-tools/build-tools) 정도?


그러나 공간이 있다면 다 받아서 다양한 버전의 엡을 빌드하고 테스트 해보면 좋습니다.

skcpu1:hunkim:271> android update sdk --no-ui   (20G 이상의 공간 필요)


여기서 본인이 Ubuntu를 사용한다면 한가지 추가 설치.

https://developer.android.com/sdk/installing/index.html?pkg=tools

qd_zSdsDnQjIZoJzmrlVCA05C4pEoGnq0VRXEIR2xOx8Fs-8gJX4Ds7ASqgK2Pc8VOMAT5KaYGixiuUfG0sty41YOttj2XKaVtZTkS40yWZS46n_FhBOwUPd3Gkf7aPTx35ar3w


sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386


3. Grandle: Android Studio에 기본 빌드프로그램


ubuntu@ip-172-31-19-3:~$ wget https://services.gradle.org/distributions/gradle-2.5-all.zip


[...] --- 설치


export PATH="/home/ubuntu/gradle-2.5/bin:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"git

ubuntu@ip-172-31-19-3:~$ gradle --version


------------------------------------------------------------

Gradle 2.5

------------------------------------------------------------


4. 나머지 git등 명령어 없다고 하는 것들 설치


잠시 쉬면서 중간 점검한번 해보고 가시겠습니다. 리눅스에서 내 안드로이드 코드 컴파일 될까요?

git clone …. --- 본인의 안드로이드 프로젝트

cd <project>

skcpu1:hunkim:271> gradle build


이때 문제 없이 컴파일 되어야 다음 단계로. 아님 이 문제를 해결하시고 다음 단계로… 이것 해보시고 안되면 android update sdk --no-ui 로 전 SDK설치.


Jenkins 로 넘어가자


1.  다운후 실행


buntu@ip-172-31-19-3:~$ cd ~

ubuntu@ip-172-31-19-3:~$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

ubuntu@ip-172-31-19-3:~$ java -jar -Xmx2g jenkins.war   -- 메모리는 2G정도



2. 브라우즈로 접속: 8080

대략 아래와 같이 보이면 일단 성공.

PUwFFxsDXyEZd7QQFG14pvyihCQvBaoJ4-1fiqwQcaKXNtZIDhgeemJQSxjnSbsJYOgLucnw6eXCYAp_JeY7XitEefGuqEfrKdeeQURFGIsjTzT9MseMk8STBri-ASDyG-OkwcE


3. 플러그인 설치


Manage Jenkins 를 설정한다음 아래 3개의 플러그인을  설치


[Android Emulator]2TMMNq6WlUQyfqI9-bubdhjam9MflHfwKK0tVxoWcC9z4wBv3f2kq-EKgZJzBGgJiwRiecu-Ag3kkNyKTM8eOKB51iKWm45spmKEmi8MHZG3sYGNpAi3MniQpgJXNg64zk7RcU8

[Gradle build]

7riaeugi15Q3-Edn38kEz_a7Dd6J073Jc6XwjAPFxZY0LEDaE4k9x5Exbt0qkoePdsEPzzDTH4nPlwQCgsQanQFVgBJM_CKnthvICC4CmuJVw8jwLDixdIIra6SyV2CWjzbLVsk

[Git]

h63V8UBtdmg8rgQyhTr2JjqTnm21kL4NxkoenwOKbJKeglYbrjoFHVIvjGTgHtEH3VufFU-SnWZNIZ3BHpqWVSxVTvE3QS43sOuVX2Y9gbE7XILE7b4mIM7DyG5j7kVC9iDkthc

설치한후 안전하게 Jenkins를 다시 시작


잡 추가하기


이름을 주고 자유형식의 프로젝트로 설정


Hk6BA-SflD1Sv1_4-QLQPEEXksemtxjvYYBviImFAZ9H1ON1rQwg11iqH8n8xrJNE7RreMydCBpI5M1YGNGThLsbB_UOs86R4-O81GbMWa4sBduLVnwMCrHIUDwpC8N0QziaWEg


깃 저장소 잡아주고

w6aSH0jL5mixLX39TdEIZmwD-M5xcyiCzzAwBGEn4GCEQ03-QGnVfTYd704Csjq3cU-96duuoZAICPl5c2-x_zJzw7zP8_AnnyatElmOsz_h_BzR-mfeWyRgQEArhCaE8kR4kuo


Android emulator 를 시작하기 선택한 다음 ABI는 반드시 ameabi-v7a 를 선택



JY09rkN-Mdsgal5zptC0wioX96mVzZTsB_CNU-OTcDo1Pz3EjsdatC2rMRhbdK4CHAujeBltJXfGGXCdLW0LBbFN68oFIwgEd5ShH-lrzEMAt1Ju844G1hBC_sPow4cr8ApbPyI


마지막으로 Gradle 설정. 본인 설정에 맞게. 이 예제에서는 clean build로


_elEG45mJSmOwO6g3CuWiuAkvwRsWO6O1DTgyxOxc7K9yaTir39dJdtHZQPtMAOTTDNUQrA8vmhYMsm6Czf4A41vfT78-5RIuvXTdvTanSjFBU2wJ570J9oo5y2lggolCNpKFgo


빌드하고 결과보기

아래 Build Now 를 선택.

KHMw62EN6d6DUwZWPYXT4Qz9DYF5EG1TKYysprBoQVLxlAYoH4rzWQg2NpHAbyLaq-ywwZqHuSZZBgTwhEIzje2w4_n_fQrL91lvJppbcYih36TwGEjfEYEG3Xp_mF6nojMUINU


그런다음 잽싸게 Console Output을 보면서… 잘안되면 여기서 힌트를 얻어 많이 얻을수 있으므로 유심히 보고 문제를 해결하다보면...


6ZNM44Pag6bk3E6TlAd-mN3WfHo5CvnLqbb66B3wiYO6hpxeaIg5nSRrbRFvdrQvuZBX2pc3vyzYC-1r7rYzewS3zndXBWo8kLz0ifXMMVlCBYuhWxeePHELKj6fX2u9iPQYqkw

아래와 같이 성공!




Lt4zJbQmGqx_WUwrbl7lpSkkR0EArW8NXhRPeueEgIUy_Vor_QhQ5fqWFWyOAbOjDu2phFsu_Ee7hc1KOjAQV2rBeZbyJZAE39JQw-V7yiWXTQOF1BEu7rK_N30fNUvdj6i5X34


Emulator로 테스트 돌리기

이 복잡한 Android SDK와 emulator를 설치한것은 바로 instrumentation base의 테스트를 하기 위함입니다. gradle의 자동 task인 connectedAndroidTest를 build에 넣어주면 됩니다.  즉 emulator랑 연결하여 시험하는 것입니다. 멋지죠? (테스트 하나가 실패해도 다른 테스및 작업을 계속하기 위해 --continue를 반드시 넣어 줍니다.) Wrapper를 사용하고 check 박스 클릭한거 참고 하세요.


Tld07-HWQN-LDsKXMticijpmEMIC28t-J8sdxd7LmxYBf76e99XBhhMAfUhFnvObqQEm7JqClGEX3VzsVP3GkA7a-K8fyLobsiZTcb5sojiDBKjJvLUjRU66kPdT1Y-9XW8mB_c

그런후 다시 빌드해보면 아래와 같이 여러개의 테스트가 실패했다는 요약하여 보여 줍니다.

ELrp7gBsRoRCK1AtNRo0xhi5BNHN08P2dB0JCAlcKT6L3xOMXnxS8kgl8jmSdX1o3A44JZqtWA3l6XunCknAk63XfykNirQmsm0sWCz09nhM1zBfqI1EjODYFAOxwhYhMtHM3lE


Jenkins Android 플러그인은 아쉽게도 테스트 결과 html을 보여주진 않네요. (플러그인 업그레이드 필요).  이렇게 되면 계속적인 빌드 실패로 날씨가 비가 오게 됩니다.

cde8EuKIQslDqu5oItzM11zZca3xorQnBdNqDhf9IM3RM_-RKYou7SyRbqyD8tGUnNSJ9jglLuQMGr9tCFlDYq30DiXuoHOwmMXyIXysCBz9kHGPTYR0PuMrUILs3twbZuJOGY4

빨리 테스트를 수정하고 다시 push 해서 해뜨게 합시다! 몇번 빌드 성공하니 이제 날씨가 좋아 집니다.

wnGp_aP_WymIbQ7d3YoQM22EV4LkerjKiCPEiwdIDcej8AQGG2JmZaA1qji6rOX61y-ixsi1MwcgyExvP04w8VfwS00cJu0HLnKLys0dikRXT0GZRm3_pNPsh9Nyg0ZQs6KClwU


하드 이미지 공유?

AWS 의 AMI로 다음의 이름으로 공유됩니다.


https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Images:visibility=public-images;imageId=ami-859496b5;sort=name


받아서 instance를 만드신 다음 jenkins만 돌리고 해당 호스트 8080으로 접속하면 끝!

문제해결


파일을 못찾음? 이상하게 파일이 있는데 파일이 없다는 에러

hudson_en-AU_160_QVGA_android-16_x86 -t android-16 --abi x86

$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server

FATAL: Cannot run program "/var/lib/jenkins/tools/android-sdk/platform-tools/adb": error=2, No such file or directory

java.io.IOException: Cannot run program "/var/lib/jenkins/tools/android-sdk/platform-tools/adb": error=2, No such file or directory


…. 혹 유분투? 그럼 lib32설치?

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386




KVM?


android] Starting Android emulator

$ /var/lib/jenkins/tools/android-sdk/tools/emulator -ports 6410,6411 -prop persist.sys.language=en -prop persist.sys.country=AU -avd hudson_en-AU_160_QVGA_android-16 -no-snapshot-load -no-snapshot-save -no-window

emulator: ERROR: x86 emulation currently requires hardware acceleration!

Please ensure KVM is properly installed and usable.

CPU acceleration status: KVM is not installed on this machine (/dev/kvm is missing).



AVI를 설정하지 않거나 x86계열로 주면 KVM필요. 본인 서버면 설치가능하지만 아쉽게도 AWS는 이미 가상화가 되어 있어 KVM을 설치해도 활성화 되지 않는다.

http://askubuntu.com/questions/564910/kvm-is-not-installed-on-this-machine-dev-kvm-is-missing


ubuntu@ip-172-31-47-206:~$ sudo kvm-ok

INFO: Your CPU does not support KVM extensions

KVM acceleration can NOT be used


KVM is not possible on EC2!

http://stackoverflow.com/questions/14193821/run-kvm-on-top-of-amazon-ec2-possible


그럼 어떻게? ARM EABI v7a 로 지정!


/tmp/and---/xxxxxx File exists: 파일이 분명히 없는데 있다고하거나 파일을 만들수 없다고 할때. 이것은 공간 부족으로 생기는 일. /tmp에 최소 1G정도의 공간이 필요.


$ /homes/hunkim/jenkins/android-sdk-linux/tools/emulator -ports 6415,6416 -prop persist.sys.language=en -prop persist.sys.country=AU -avd hudson_en-AU_160_WQVGA_android-19_armeabi-v7a -no-snapshot-load -no-snapshot-save -no-window
NAND: could not write file /tmp/android-hunkim/emulator-OlrGzz, Connection refused


abi 타입: 필자가 가장 많이 본 에러… Android OS version을 바꿔가며 맞는 조합을 찾아봄. commend라인에서 미리 테스트 해보면 좋음

[android] /homes/hunkim/jenkins/android-sdk-linux/tools/android create avd -f -a -s WQVGA400 -n hudson_en-AU_160_WQVGA_android-19_armeabi -t android-19 --abi armeabi
Error: Invalid --abi armeabi for the selected target.



오래된 라이버러리: 업데이트. AWS 를 사용하면 최신으로 업되어 있어 이런문제 없슴

$ /homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb kill-server
/homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb)
Finished: NOT_BUILT