아마존 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 설치


(설치는 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


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

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


3. 플러그인 설치


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


[Android Emulator]

[Gradle build]

[Git]

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


잡 추가하기


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



깃 저장소 잡아주고


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




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



빌드하고 결과보기

아래 Build Now 를 선택.


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


아래와 같이 성공!





Emulator로 테스트 돌리기

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


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


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

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


하드 이미지 공유?

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