천복만복 프로그래밍/천복만복 안드로이드

안드로이드 젠킨스 빌드 환경 구축

U&MeBlue 2021. 8. 19. 22:49

이 글은 제가 안드로이드를 공부하면서 학습한 내용을 정리한 내용입니다. 틀린 내용이 있을 수 있습니다.

Jenkins 란?

젠킨스 홈페이지에 나와있는 설명처럼 각종 자동화 작업을 수행해주는 서버 프로그램이다. 앱을 빌드, 배포하거나, 테스트 코드를 실행하는 등의 작업을 자동으로 처리해준다. 비슷한 프로그램으로는 Travis CI, Circle CI 등이 있다. 오픈소스이고 무료로 사용 가능하다. 추가적으로 궁금한 사항은 여기를 참조(https://www.jenkins.io/doc/)

안드로이드 개발에서 Jenkins 를 사용하는 이유

안드로이드 앱을 개발하고 나서 각종 앱 마켓에 판매하기 위해서는 앱을 빌드(Build) 한 뒤 생성된 결과물(apk 파일 또는 aab 파일)을 앱 마켓에 올려야 한다. 이 과정을 개발자의 컴퓨터에 설치되어 있는 안드로이드 스튜디오나 그래들 빌드 툴을 이용해서 빌드 과정을 진행할 수도 있다. 또는 앱의 정상 동작을 검증하기 위해 테스트 코드를 실행하고 테스트를 진행해야 하는 상황이 있을 수 있다.

 

그러나 개발자가 직접 로컬 컴퓨터에서 앱을 빌드하거나 테스트 코드를 실행시키는 것은 생산성을 많이 떨어뜨린다. 안드로이드 스튜디오로 앱을 빌드하거나 테스트 코드를 실행하는 경우에는 해당 과정이 진행되는 동안 프로그래밍을 진행하지 못하게 된다. 간단한 프로젝트라면 짧은 시간 내에 이루어지지만, 네이버나 카카오와 같은 앱은 빌드 과정이 몇 십분이 될 수도 있다. 또한 앱 빌드를 통해 생성된 apk 또는 aab 파일을 직접 관리하거나, QA 팀에 직접 전달하는 일 역시 지루하고, 생산성을 떨어뜨릴 수 있다.

 

Jenkins 는 위에서 언급한 문제를 해결해줄 수 있다. 아마존 EC2 와 같은 분리된 서버 컴퓨터를 도입하고, 여기에 Jenkins 를 설치한다. 그리고 Jenkins 가 설치된 컴퓨터에 프로젝트 코드를 옮기고, 이곳에서 앱을 빌드하거나, 테스트 코드를 실행하면 개발자의 컴퓨터를 Block 시키지 않기 때문에 개발자는 계속해서 다른 작업을 수행할 수 있다.

 

Jenkins 는 또한 많은 플러그인을 제공하여 앱 빌드나 배포 과정을 쉽게 해준다. 플러그인을 통해 GitHub 에 올라간 코드를 받아와서 관리할 수 있고, 특정 브랜치에 푸쉬나 풀 리퀘스트가 발생한 경우 해당 변경사항을 Jenkins 에 불러온 뒤 자동으로 빌드 과정이 진행되게 할 수 있다.

안드로이드 Jenkins 환경 구성 실습

1. Jenkins 프로그램이 설치될 서버 환경 구성 - AWS EC2

이 글은 AWS EC2 를 설명하는 글이 아니기 때문에 서버 환경을 구성 방법에 대한 설명은 생활 코딩 아마존 웹 서비스 강의를 참고하거나, 아마존 웹 서비스를 다루는 기술(http://pyrasis.com/book/TheArtOfAmazonWebServices) 도서 및 웹 사이트 링크로 대체한다.

이 글에서는 몇가지 특이점만 기록한다.

 

인스턴스 유형, 메모리, 볼륨, 인바운드 규칙

  • 인스턴스 유형은 최신형 우분투를 사용했다.
  • 메모리는 4GB 이상으로 선택하여 Jenkins 가 원활히 실행되도록 했다. (이 옵션은 AWS 프리티어에서 사용할 수 있는 옵션이 아니기 때문에 과금에 주의해야 한다.)
  • 볼륨은 30GB 로 설정했다.
  • 추후에 로컬에 설치된 웹 브라우저를 통해 EC2 서버에 설치된 Jenkins 서버로 http 연결을 진행하고, Github Webhook 기능도 연동하기 위해서 보안 그룹 설정시 인바운드 규칙을 다음과 같이 설정했다. (경고에서도 알 수 있듯이 이런 설정은 외부의 모든 곳에서 접속을 허용하기 때문에 보안 문제가 있을 수 있다. 또한 과금의 문제도 있기 때문에 주의하자.)
  • 추가적으로 탄력적 IP 까지 할당받아 설정할 수도 있으나 실습을 위해서 한번 정도만 사용하는 서버이기 때문에 탄력적 IP 는 설정하지 않았다.

이제 Window Putty 나, 맥 또는 리눅스에서는 쉘에 내장된 ssh 를 통해 EC2 인스턴스에 접속해보자.

여기서 말하고 싶은건 이 후에 EC2 서버를 재시작 하는 경우가 있는데 이때마다 EC2 서버의 퍼블릭 IP 가 바뀌기 때문에 재접속시 IP 주소를 항상 확인해봐야 한다는 것이다. 이같은 과정이 귀찮고, 자금의 여유가 있다면 탄력적 IP 주소를 할당받아 설정해볼 수 있다.

리눅스가 처음이라면 앞으로 제시할 리눅스 쉘 명령어들의 $ 앞 경로를 잘 확인하자. 이 경로는 Present Working Directory 라는 의미이며 각종 명령어들을 수행할 위치가 된다. 만약 파일을 다운로드하는 명령이라면 $ 기호 앞에 서술된 Present Working Directory 에 파일이 다운로드 된다. Present Working Directory 를 변경하는 방법등은 다른 리눅스 블로그 포스팅 참고.

자바 설치

EC2 에 Jenkins 를 설치하여 구동시키려면 EC2 에 자바가 설치되어 있어야 한다. 자바 설치 및 환경 변수 설정은 다음 링크로 대체한다.

https://lsjsj92.tistory.com/394#recentEntries

 

이수진의 블로그

안녕하세요. 이수진이라고 합니다. 이 블로그는 AI(인공지능), Data Science(데이터 사이언스), Machine Learning, Deep Learning 등의 IT를 주제로 운영하고 있는 블로그입니다.

lsjsj92.tistory.com

 

2. Jenkins 설치

https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

 

Linux

You can install Jenkins through yum on Red Hat Enterprise Linux, CentOS, and other Red Hat based distributions. You need to choose either the Jenkins Long Term Support release or the Jenkins weekly release. Long Term Support release sudo wget -O /etc/yum.r

www.jenkins.io

이 링크에서 안내한대로 Jenkins 를 설치한다.

~$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
~$ sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'
~$ sudo apt-get update
~$ sudo apt-get install jenkins

이제 로컬 컴퓨터의 웹 브라우저를 열고 EC2 퍼블릭 ip 주소:8080 을 입력하여 젠킨스 서버에 접속해보자.

이런 화면이 나타나는데 여기서 입력하라는 대로 입력하면 된다.

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
여기에 나타난 비밀번호 입력

다음 화면에서 권장 설치 옵션 클릭

깃헙 플러그인을 비롯한 각종 유용한 플러그인이 설치된다.

만약 이 과정에서 플러그인 몇 개가 설치 실패되면 여러면 Retry 해본다. 그런데 이 Retry 해도 잘 설치가 안되는 경우가 있었는데 깔끔하게 ec2 인스턴스 생성부터 다시 진행하던가 젠킨스를 삭제하고 다시 시도 해본다...

 

다음으로 넘어가면 관리자 계정 정보를 입력한다.

다음 화면에서 ip 주소 설정하라는 말이 나오는데, 탄력적 ip 를 할당받아 고정 ip 를 가지고 있는 경우 설정하고, 그렇지 않다면 넘어간다. 아래 화면이 나오면 젠킨스 설치 완료!

3. Android SDK 설치하기

이제 EC2 우분투 리눅스에 Android SDK 를 설치해야 한다. 안드로이드 젠킨스 빌드 환경 구축과 관련된 다른 블로그 글에서도 이 부분을 설명하고 있었는데, deprecated 된 android-sdk-linux 라는 것을 사용하고 있어서 삽질을 많이 했었다. 현재는 Android Studio 없이 Android SDK 를 설치하려면 command-line tools 을 사용해야 한다. 아래 링크의 포스트에서 command-line tools 설치 방법이 자세히 설명되어 있다.

https://proandroiddev.com/how-to-setup-android-sdk-without-android-studio-6d60d0f2812a

 

How to setup Android SDK without Android Studio.

Easily setup Android SDK using Android CLI for React Native, Flutter etc.

proandroiddev.com

이 글에서는 위 글에서 설명한 과정을 진행할때 헷갈리거나 어려운 부분만 추가 설명하기로 한다.

 

Step1 - Download the Command Line Tools

이 단락에서 리눅스에 command line tools 를 다운로드 하는 쉘 명령어를 다음과 같이 서술한다.

~$ wget <your zip link here>

일단 다운로드 경로를 홈 디렉토리인 (~) 가 아니라 (/var/lib/jenkins) 로 바꾸자. 이후에 진행하는 명령어들도 이 디렉토리를 pwd 로 설정한 뒤 작업하자. 또한 이 경로가 현재 사용자(ubuntu) 가 소유하고 있는 디렉토리가 아니기 때문에 모든 명령어에 sudo 를 붙여 관리자 권한으로 실행시켜줘야 한다.

~$ cd /var/lib/jenkins
/var/lib/jenkins$

그 다음 여기서 your zip link here 를 어디서 찾을 수 있는지 몰라 삽질을 많이 했다. https://developer.android.com/studio 이 링크의 Command Line Tools 부분에서 각 운영체제 별로 Command Line Tools 을 다운로드 할 수 있는 하이퍼링크가 달려있는데 여기를 클릭하면 로컬 컴퓨터에 다운로드만 되고 링크를 찾을 수는 없었다. 로컬 컴퓨터에 다운 받은 파일을 FTP을 이용해서 EC2 컴퓨터에 옮길 수도 있으나 귀찮다.

 

나는 다음과 같은 방법으로 zip link 를 찾았다. 각 설명의 숫자로 표현한 순서를 잘 확인하자.

귀찮다면 그냥 다음 명령어를 통해 다운 받자.

/var/lib/jenkins$ sudo wget https://dl.google.com/android/repository/commandlinetools-mac-7583922_latest.zip

 

Step2 - Setting up the Android Tools (CLI)

이 단락에서 unzip 명령어를 사용하는데 unzip 명령어가 아마 설치되어 있지 않았을 것이다. 다음 명령어를 통해 설치 가능하다.

$ sudo apt-get update
$ sudo apt-get install zip unzip

그 다음 android 디렉토리를 만들고 다운로드 받은 파일을 옮겨서 풀고, ... 각 종 작업이 있는데 아래와 같이 변경해서 적용하자.

/var/lib/jenkins$ sudo mkdir android
/var/lib/jenkins$ sudo mv ./commandlinetools-mac-7583922_latest.zip ./android
/var/lib/jenkins$ cd android
/var/lib/jenkins/android$ sudo unzip commandlinetools-mac-7583922_latest.zip
/var/lib/jenkins/android$ sudo rm commandlinetools-mac-7583922_latest.zip
/var/lib/jenkins/android$ cd cmdline-tools
/var/lib/jenkins/android$ sudo mkdir tools
/var/lib/jenkins/android$ sudo mv -i * tools

 

Step3 - Adding tools to $PATH

여기서는 terminal 종류에 따라 안드로이드 환경변수를 어떻게 설정할 수 있는지 설명한다.

$ grep [사용자 이름(현재는 ubuntu)] /etc/passwd

위 명령어를 통해 쉘 종류를 확인할 수 있다.

귀찮으면 그냥 /etc/profile 에 시스템 전역 변수로 설정해도 괜찮은것 같다.

그리고 ANDROID_HOME 경로는 방금전 설치한 경로로 변경한다.

~$ sudo vim /etc/profile

이후 편집화면이 나타나면 키보드 i 를 입력해 입력모드로 전환
맨 아랫줄로 이동
다음 4개 줄 입력

export ANDROID_HOME=/var/lib/jenkins/android
export PATH=$ANDROID_HOME/cmdline-tools/tools/bin/:$PATH
export PATH=$ANDROID_HOME/emulator/:$PATH
export PATH=$ANDROID_HOME/platform-tools/:$PATH

esc 키를 눌러 입력 모드 종료
:wq 입력 후 엔터

~$ source /etc/profile

다음 명령어를 통해 환경변수가 제대로 설정되어 있는지 확인
~$ echo $ANDROID_HOME

~$ sdkmanager

 

Step4 - Installing the Android SDK

여기서 설치할 패키지 종류는 자신의 안드로이드 프로젝트의 build.gradle 파일에 있는 설정에 따라 달라질 수 있다. 예를 들어 다음과 같은 설정의 경우

platform-tools, platforms;android-30 , build-tools;30.0.3, emulator 이 필요하다.

그리고 하나 하나씩 다운로드 해야 되더라.

~$ sdkmanager --list
설치할 패키지 리스트 확인

~$ sdkmanager --install "platform-tools"
~$ sdkmanager --install "platforms;android-30"
~$ sdkmanager --install "build-tools;30.0.3"
~$ sdkmanager --install "emulator"

이 부분에서 다음과 같은 에러로 설치가 안될 것이다.

Warning: Failed to read or create install properties file.

권한 문제인것 같은데 이 링크에 있는 권한 부여 방법으로 해결했다.

https://stackoverflow.com/questions/43042032/android-studio-fails-to-install-update-error-failed-to-read-or-create-install

 

Android Studio fails to install update (error : Failed to read or create install properties file.)

Screenshot of error I am running [ Android Studio 2.3 Build #AI-162.3764568, built on February 24, 2017 JRE: 1.8.0_112-release-b06 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o] on Ub...

stackoverflow.com

$ sudo chown $USER:$USER $ANDROID_HOME -R

 

4. Jenkins 에 안드로이드 프로젝트 설정하기

새로운 item 클릭

이 후 화면에서 Freestyle project 선택

이 글에서는 깃헙에 코드를 푸쉬 했을때 자동으로 빌드가 되도록 하는 것도 실습해보기 위해서 다음 과정을 진행한다. General 탭에서 깃헙 주소를 입력

소스코드 관리 탭 입력

Credentials 에서 깃헙 저장소 로그인 정보를 새로 추가한다. 이 정보는 나중에 계속해서 재사용할 수 있다. 요새는 깃헙 아이디, 비밀번호가 아니라 아이디, 엑세스 토큰으로 입력해야 한다. 엑세스 토큰 정보 발급 방법은 다음 링크로 대체한다. https://curryyou.tistory.com/344

 

GitHub 토큰 인증 로그인: Personal Access Token 생성 및 사용 방법

Git Hub에서 ID/PW기반의 Basic Authentication 인증을 금지하고, ID/Personal Access Token 방식의 Token Authentication 인증을 요구하고 있다. 앞으로는 소스코드를 push/clone하려고 하면, 아래와 같은 문구..

curryyou.tistory.com

Add 버튼 누른 후 Credentials 탭에서 -none- 으로 되어있던 것을 방금 입력한 정보로 바꿔준다.

깃헙에 코드를 푸쉬할때마다 젠킨스 빌드를 유발시키기 위해 빌드 유발 탭에서 아래와 같이 설정

Build 탭에서 다음과 같이 설정

Invoke Gradle Script 선택

Use Gradle Wrapper 선택 후 Tasks 에 clean test assemble 입력. 각각 프로젝트 정리, 테스트 코드 실행, apk 파일 생성 명령인듯하다.

빌드 후 조치

Archive the artifacts 입력

아래와 같이 입력!

저장 버튼을 누르면 다음과 같은 화면이 나타난다.

왼쪽 탭에서 Build now 를 클릭하여 빌드를 진행해보면....!

에러가 난다... 주륵

여기서 포기할 수 없다. 빌드 기록에서 에러를 클릭해본다.

여기서 console output 클릭

에러를 보면 Android-Sdk-Root 를 못찾겠다는데...

 

검색 결과 젠킨스 설정에서도 안드로이드 홈에 대한 환경 변수를 설정할 수 있었다. 이 부분이 누락된 것 같아서 다음 과정을 추가적으로 진행했다.

 

젠킨스 대시 보드로 이동한 뒤 젠킨스 관리 → 시스템 설정으로 진입

아래쪽에 Global Property 에서 다음 내용을 입력하고 저장을 누른다

다시 프로젝트로 돌아가서 Build now 를 해보면 정상적으로 빌드가 진행된다!!!

5. 깃헙에 코드를 푸쉬하고 젠킨스가 자동으로 새로운 빌드를 진행하는지 확인

로컬에서 소스코드를 약간 수정하고 커밋한뒤 원격으로 푸쉬 해보자. 그럼 깃헙에서 해당 푸쉬에 대한 이벤트를 Webhook 이라는 기술로 젠킨스에 전달한다. 젠킨스는 이를 감지하고 자동으로 원격에서 수정된 코드를 받아와 빌드를 진행한다.

 

만약 자동으로 빌드가 되지 않으면 다음을 확인해본다.

 

깃헙 프로젝트의 setting → Webhook 으로 진입

 

젠킨스 프로젝트 설정시 깃헙에 대한 설정을 토대로 젠킨스가 알아서 깃헙에 Webhook 세팅까지 해줬음을 알 수 있다!!

 

여기서 설정된 url 주소에서 ip 가 젠킨스가 설치된 ec2 서버의 ip로 적절히 설정되어 있는지 확인하고 아니라면 변경해보자. 탄력적 ip 를 할당받아 사용하지 않았다면 ip주소가 수시로 바뀌어 여기서 문제가 생길 수 있다.

Recent Deliveries 탭을 누른뒤 최근 실패한 딜리버리를 클릭한 후 Redelivery 를 눌러보자.

여기서 응답도 정상적으로 받고, 젠킨스 대쉬보드에서도 자동으로 빌드가 진행되면 깃헙과 젠킨스 연동도 성공이다!!!

728x90