아마존 AWS로 안드로이드를 자동 빌드하고 테스트 하는 CI 설치해보자
아래 3개의 문서를 참조하고 엄청난 실험으로….(거의 10시간 투자) 마침내 성공합니다. 생각보다 Android emulator 를 리눅스에 올리는 것이 쉽지 않네요.
https://www.digitalocean.com/community/tutorials/how-to-build-android-apps-with-jenkins
https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin
기본 설치
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)를 공개합니다.
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 |
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
------------------------------------------------------------
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
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정도
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로 다음의 이름으로 공유됩니다.
받아서 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
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 |
sudo dpkg --add-architecture i386 |
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). |
ubuntu@ip-172-31-47-206:~$ sudo kvm-ok INFO: Your CPU does not support KVM extensions KVM acceleration can NOT be used |
$ /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 |
[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 |
$ /homes/hunkim/jenkins/android-sdk-linux/platform-tools/adb kill-server |