이틀간의 삽질을 정리했다.
회사에서는 이클립스를 개인적으로는 안드로이드 스튜디오를 사용할 계획...
git client 설치
- http://git-scm.com/downloads
- 윈도우 환경변수에 PATH에 추가
-
- c:\Program Files (x86)\Git\bin\
- git bash 콘솔을 실행하여 설정
-
- git config --global user.name "내 이름"
- git config --global user.email "내 이메일"
JDK설치
- 1.7버전설치, 1.8은 proguard에서 지원하지 않음
소스트리 설치
안드로이드 스튜디오
- c:\Android-Studio\에 설치하기
- ANDROID_HOME 환경변수로 추가 (gradle 빌드 스크립트에서 사용됨)
c:\android-studio\sdk\
기존 이클립스 프로젝트 안드로이드 스튜디오로 import
- gradle 빌드 스크립트 생성
http://tools.android.com/tech-docs/new-build-system/migrating-from-eclipse-projects 참고하여
- 콘솔을 열여서 gradlew.bat tasks 를 실행해봄
- 릴리스 빌드 테스트
-
- gradlew.bat clean
gradlew.bat assembleRelease
를 차례로 실행해 본다. - d:\Android\LearningHabit\LearningHabit\build\outputs\apk\ 에 apk파일이 생성된다.
- gradlew.bat clean
- 메인 프로젝트의 build.gradle에 proguard설정을 추가
-
- http://developer.android.com/sdk/installing/studio-build.html 참고
- buildTypes {
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), \
'proguard-project.txt'
signingConfig signingConfigs.release
}
}
- 안드로이드 스튜이도에서 코드사인 키 생성, app_key.jks로 저장
- 메인 프로젝트의 build.gradle에 릴리스 빌드시 자동으로 코드사인하기 설정 추가
-
- // code sign
signingConfigs {
release {
storeFile file("../app_key.jks")
storePassword "<storePassword>"
keyAlias "<projectAlias>"
keyPassword "<keyPassword>"
}
}
- // code sign
빌드 자동화 스크립트
- 이클립스에서 디버그 apk 생성 (수동)
- 안드로이드에서 디버그 apk 생성(수동)
- 소스 처음내려받고, autobuild.cmd으로 한 방에 코드사인된 proguard 적용된 릴리스 apk 생성(자동), 로컬개발자 PC에서 개발중인 소스로 릴리스 apk 생성 가능
-
- autobuild.cmd
프로젝트를 clean하고, 빌드넘버를 증가시킨후, 릴리스 apk를 생성한다,
apk와 proguard dump 파일을 <프로젝트>_<버전명>_release_<날짜>_<시간>.apk, .7z 파일로 압축후 deploy폴더로 복사한다. CI서버에서 매 빌드를 보관용
-----------------
call gradlew.bat clean
cd win-tools
call incre_buildnumber.cmd
cd ..
call gradlew.bat assembleRelease
if not "%ERRORLEVEL%" == "0" goto ERROR
cd win-tools
call copy_apk.cmd
cd ..
if not "%ERRORLEVEL%" == "0" goto ERROR
echo "All Success!"
exit /b 0
:ERROR
echo autobuild.cmd failed..
exit /b 1
------------------
- incre_buildnumber.cmd
CI서버에서나 로컬에서 빌드를 할 경우 AndroidManifest.xml를 매번 수정하는 것 보다는 빌드넘버를 사용하는 것이 좋을 것 같다.
메니페스트의 versionName은 "1.0.1"이라면 빌드넘버는 빌드를 할 때마다 1씩 증가하고 단지 빌드를 구별하기위한 용도이지 마켓에서 버전 체크용으로는 사용되지 않는다.
스크립트를 호출할 때마다 build_numerber.xml 파일을 자동으로 생성하여 resource/value 폴더로 복사한다. 사용은 R.string.bumild_number로 인식된다.
젠킨스에서 베타나 릴리스 프로젝트 구성에 따라 빌드넘버가 다르게 부여되고, 빌드넘버는 저장소에 저장되지 않는다.
------------------
set BUILDNUM=0
if exist _buildnumber.bat call _buildnumber.bat
set /A BUILDNUM=BUILDNUM+1
echo new Build number is %BUILDNUM%
echo ^<?xml version="1.0" encoding="utf-8"?^>^<resources^>^<string name="build_number"^>%BUILDNUM%^</string^>^</resources^> > "..\LearningHabit\res\values\build_number.xml"
echo set BUILDNUM=%BUILDNUM% > _buildnumber.bat
REM build_number.xml
REM <?xml version="1.0" encoding="utf-8"?><resources><string name="build_number">23</string></resources>
-------------------- -
- build.gradle에 lint 옵션 추가
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
- build.gradle에 lint 옵션 추가
- copy_apk.cmd
- --------------------
call _version.bat
SET APP_VERSION=%APP_VERSION:.=_%
REM ':' '-' '.' 문자는 제거하고, 공백문자 ' '는 0으로 대체
set TIMESTAMP=%DATE%_%TIME%
SET TIMESTAMP=%TIMESTAMP::=%
SET TIMESTAMP=%TIMESTAMP:-=%
SET TIMESTAMP=%TIMESTAMP:.=%
SET TIMESTAMP=%TIMESTAMP: =0%
set filename=LearningHabit_%APP_VERSION%_release_%TIMESTAMP%.7z
set apk_filename=LearningHabit_%APP_VERSION%_release_%TIMESTAMP%.apk
mkdir ..\deploy
.\7z.exe a ..\deploy\%filename% ..\LearningHabit\build\outputs
copy ..\LearningHabit\build\outputs\apk\LearningHabit-release.apk ..\deploy\%apk_filename% /Y
if not "%ERRORLEVEL%" == "0" goto ERROR
exit /b 0
:ERROR
echo copy_apk.cmd failed..
exit /b 1
-------------------- - _version.bat
AndroidManifest.cml에서 버전을 가져온다.
--------------------
BuildUtil.exe /get ..\LearningHabit\AndroidManifest.xml manifest/@android:versionName APP_VERSION > %temp%\__temp.bat
call %temp%\__temp.bat
echo %APP_VERSION%
del %temp%\__temp.bat
-------------------- - 빌드가 성공하면 .\deploy폴더에
LearningHabit_1_0_release_20141001_12515744.7z
LearningHabit_1_0_release_20141001_12515744.apk
두 파일이 생성된다.
- autobuild.cmd
- 젠킨스에서 베타, 릴리스 빌드 생성(자동)
Jenkins
설치 URL
관리 > 플러그인에서 > 설치가능 탭 > 검색(git으로 검색)
젠킨스 시작하고 바로 접속하면 목록에 없지만 한 5분정도 지나 새로고침 하면 목록이 노출된다.
GIT plugin 설치하면 필요한 플러그인은 자동으로 설치가 됨
GIT client plugin 설치
SCM API Plugin 설치
등등 설치됨
관리 > 환경설정에서
JDK 에서
JAVA_HOME 경로설정
c:\Program Files\Java\jdk1.7.0_67\
Git 에서 git.exe 경로설정
c:\Program Files (x86)\Git\bin\git.exe
Home 디렉토리 > 고급 버튼> 워크스페이스 폴더 변경
d:/workspace/${ITEM_FULLNAME}
test 프로젝트 추가
- git 저장소, 인증추가하기
무슨 이유인지 모르겠지만 bitbucket.org의 경우 소스트리의 puttyAgent에서 사용하는 ppk파일을 private key file로 지정하여야 인증이 된다. id_rsa파일이 원래 ssh private key파일인데 왜 안 되는지 모르겠음. 이것 때문에 몇 시간 삽질했다. 프로젝트 clone은 성공했지만 결국 CI에서 빌드는 실패했다. 프로젝트에서 sub module을 사용하고 있는데 젠킨스에서는 sub module을 clone하지 않는다. 이걸 할려면 Git 설정 하위에 Additional Behaviours 쪽에 sub-moulde관련을 추가해야 하는데, 로그를 보면 sub-module을 clone하면서 public key인증 오류가 난다. "ssh agent" 플러그인으로 해결해야 할 것 같은데 여기서 막혔다. 윈도즈 환경이라서 발생하는 문제일 수 있는데 해결책을 못 찼음. 나만 발생하는 것일 수 있고. CI의 워크스페이스 폴더에서 cmd로 콘솔을 열어서 sub-module을 수동으로 업데이트하고 CI서버에서 빌드하면 빌드가 성공한다.
- Add Build step > execute window batch command
autobuild.cmd
- 빌드후 바이네리 배포, (ftp 등으로 다른 웹서버나 릴시스 서버에 배포) -> 이건 나중에.
참고