Docker 와 Jenkins 를 사용한 안드로이드 CI — 1

Nova Woo
Nova Woo
Feb 19, 2017 · 30 min read

이번 Docker 와 Jenkins 를 사용한 안드로이드 CI — 1 포스트에서는
1. 넓고 얕게 훑고 넘어가는 Docker 에 대한 언급과
2. Dockerfile 수정, docker build, docker run 을 다룹니다.
2. 간단한 jenkins 에 대한 설정까지 다루고 있습니다.
안드로이드 빌드에 관련된 이야기는 2번 글에서 다룰 예정입니다.
언젠가 여력이 된다면 docker 의 기본적인 내용과 docker-compose,
local repository, commit and push, pull 같은 부분을 다뤄보도록 하겠습니다.


프로젝트 오픈 후, 나름 이것저것 그동안 못본 것들을 볼 마음의 여유가 생겨(시간적 여유가 생긴건 분명 아니지만) Jenkins 로 이루어진 CI 서버를 살펴보기로 했습니다.

Jenkins 로 CI 서버를 구동하고 있는 곳은 이미 많이 있고, 예시들도 많이 있기때문에 ‘안드로이드 개발자도 1시간이면 따라 할 수 있는 Jenkins CI 서버 구동’을 목표로 글을 작성해 볼까 합니다.

Docker 를 사용하게 된건 여러가지 이유가 있지만 가 장 큰건 ‘기본적인 설정 작업에 대한 시간 소모’를 줄여줄 수 있는 방안이다라고 생각 되었기 때문입니다. 굳이 Docker 를 사용하지 않고도 Jenkins 를 설치하고 구동할 수 있으므로 그렇게 사용하셔도 좋습니다만, Docker 가 가진 컨테이너(Container), 이미지(Image), 격리(Isolatation) 같은 개념들을 이용하면 생각했던것 보다 빠르고 깔끔하게 원하는 OS, Library, Program 등을 구축했다가 다른 컴퓨터로 옮기거나 지우는 것이 가능하기 때문에 Docker 를 사용해 보는걸 추천드립니다.

Docker 설치

예시는 기본적으로 Mac OS 에서 실행할테지만, CentOS 7, Ubuntu 16.04 이상에서 구동되므로 docker package 가 설치만 잘 되어있다면 같은 방식으로 실행할 수 있습니다.

Docker for Mac OS — https://docs.docker.com/docker-for-mac/install/
Docker for Ubuntu — https://docs.docker.com/engine/installation/linux/ubuntu/
Docker for CentOS — https://docs.docker.com/engine/installation/linux/centos/

설치 링크에 들어가면 Stable 버전과 Beta 버전이 있는데 현재로서는 크게 차이는 없는듯하니 원하는 버전을 설치 합니다.

Mac OS에서는 앱을 Application 폴더로 옮겨주기만 하면 되네요. 옮겨줍니다.

앱을 실행하고 Status 에서 확인해 보면 Docker is running 을 출력하며 잘 실행되고 있는걸 확인할 수 있습니다. 이제 Docker 를 사용할 준비를 마쳤습니다.

Jenkins CI Dockerfile 가져오기

Docker 는 docker hub 이라는 자체적인 repository 를 가지고 있습니다. github 과 비슷하다고 생각하면 됩니다.
여기서는 자세히 설명하지 않지만, Docker 는 Dockerfile 을 통해 빌드해서, Image 를 만들고, Image 를 통해 Container 를 실행하고, Container 의 변경 부분을 Image 에 commit 하고 이 이미지의 변경사항들을 repository 로 push 할 수 있습니다. 이렇게 함으로써 굉장히 손쉽게 여러 환경들을 여러 컴퓨터로 옮겨다니거나 공통적으로 적용할 수 있게되죠. 다른 컴퓨터에서는 repository 에 올려둔 image 를 새롭게 pull 하는것만으로 변경사항을 가지고 올 수 있게됩니다. 굳굳///

일단 여기서는 간단하게 Jenkins official dockerfile 을 이용한다고만 생각하면 될 것 같습니다.

https://hub.docker.com 에 접속해서 jenkins 를 검색합니다. Official repository 는 하나뿐이네요.

여기있는 Official 의 이미지 그대로 jenkins 를 구축하면 편하겠지만, 안드로이드 SDK 툴들을 설치하는 작업들이 이후 이루어져야 되므로 공개된 Dockerfile 을 받아와서 조금 고쳐서 써보도록 합니다. 아래 git repository 를 clone 해 오도록 합니다.

디렉토리에 Dockerfile 이 보입니다. 이 파일을 편집해서 원하는 라이브러리를 추가할수도 있고, 여러 패키지들을 설치하도록 할 수 있습니다.

vi 를 통해 파일을 편집해 봅시다.

Dockerfile 의 구성을 간단하게 설명하자면 FROM 으로 base 가 되는 image 를 설정할 수 있습니다. RUN 을 통해 커맨드라인에서 명령을 실행할 수 있고, 다른 커맨드 들이 설치되지 않은 상황에서도 ADD(wget 같은..) COPY(cp), ENV, VOLUME 등을 통해 환경변수를 설정하거나 볼륨을 지정하거나 복사하거나 하는 명령들을 실행할 수 있습니다.여기서는 간단하게 FROM 과 RUN 정도만 알아도 될듯 합니다.

FROM ubuntu:16.04

jenkins-ci 의 Dockerfile 은 OpenJDK 8 을 기반으로 만들어져 있습니다. 나중에 여러가지 설정이나 이것저것 설치할때 좀 더 익숙한 환경을 만들기 위해 FROM 을 ubuntu 로 변경해 봅니다.

Add openjdk

base 는 ubuntu 로 잘 바뀌었지만, 문제가 있습니다. 이렇게 되면 java 설치가 되지 않죠.
jenkins 는 기본적으로 java 를 사용하므로 java 를 설치할 수 있도록 아래의 RUN 라인을 추가해줍니다.
(명령을 한줄에 많이 넣은건, commit 을 줄이기 위해서지만 중요한건 아니므로 따로 실행해주어도 됩니다. wget, unzip, vim 등은 이후 필요한 상황에서 따로 설치해도 됩니다.)

Add Gradle

Jenkins 내부적으로는 gradle 을 가지고 있겠지만, ubuntu 에서 사용할 gradle 을 설치해줍니다. command line 에서 작업을 따로 안할 것 같으면 지나칩니다.

안드로이드 build tool, SDK 도 Dockerfile 에 추가해서 설치할 수 있습니다만 여기서는 참고 정도로만 적어두고 Docker 로 실행한 컨테이너에서 직접 설치해보도록 하죠.

수정한 Dockerfile 은 아래와 같을 겁니다.

완성된 Dockerfile 이 필요할까 생각되어, fork 해서 작업한 repository 를 추가해둡니다. https://github.com/croute/ubuntu-jenkins-docker
위의 내용들을 따라하기 귀찮다면, 이 repo 를 clone 하기만 해도 됩니다.

Build Dockerfile

Dockerfile 의 수정이 완료 되었으면, 해당 디렉토리에서 빌드를 실행해줍니다. -t 옵션 뒤에 지정된 ubuntu-jenkins 는 빌드로 만들어지는 이미지의 이름이 됩니다.

빌드가 성공적으로 실행이 되면 Successfully built [commit name] 가 출력이 됩니다.
만들어진 이미지를 확인해봅니다. docker images 로 현재 로컬에 받아둔(또는 빌드해서 생성한, 컨테이너 실행 후 커밋한) 이미지들을 확인할 수 있습니다.

ubuntu:16.04 를 기반으로 만들어져서 해당 이미지를 받아온 걸 확인할 수 있고, 위에서 빌드하면서 지정한 이름인 ubuntu-jenkins 이미지가 성공적으로 생성된걸 확인할 수 있습니다.

Run Docker Image

이제 만들어진 이미지를 실행시켜볼 차례입니다. 실제로 개발과정에서의 테스트라면 docker-compose 를 사용해도 되겠지만, 여기서는 docker run 명령을 통해 실행해봅니다.

실행(run) 하면서 jenkins_home 을 volume 으로 지정하려고 합니다. volume 으로 지정하면 컨테이너 내부에서 변경된 사항들이 외부의 volume 으로 지정된 디렉토리에 그대로 유지하게 됩니다.
먼저 jenkins_home 의 volume 으로 지정할 디렉토리를 만들고 소유권을 1000 으로 바꿔줍니다.
1000으로 지정해 주는 이유는, jenkins ci official 의 Dockerfile 이 jenkins 유저의 uid 로 1000을 사용하기 때문이지만 mac os 에서는 chown 을 1000 으로 지정하는 작업을 생략해줍니다. volume 에 대한 소유권을 지정하는 작업인데 운영체제 환경이나 권한 상 필요한 경우에만 진행해주면 됩니다.

volume 으로 지정할 디렉토리가 준비되었으므로 이제 run 을 해볼 차례입니다.

처음의 name 옵션 뒤에 나온 ubuntu-jenkins 는 컨테이너의 이름이 됩니다.
맨 뒤에 나온 ubuntu-jenkins 는 위에서 만든 이미지의 이름입니다. 이미지에 커밋이 여러번 되었다면 태그까지 써줍니다.

옵션들을 다 없애고 생각한다면 docker run ubuntu-jenkins 입니다. run 과 이미지 사이에 옵션들을 써 넣어준것 뿐이죠.
-p 옵션으로는 외부 OS(여기서는 Mac)의 8080 포트와 docker 로 실행될 container 의 8080 포트를 연결해주는 작업입니다. 8080, 50000 두가지 포트를 연결해주었습니다. -v 옵션은 volume 을 지정해주는 옵션입니다.

실행된 결과가 출력되는걸 지켜봅니다. 실행이 완료되면 Ctrl+C 로 종료해줍니다.

컨테이너는 한번 실행되면 docker rm 명령으로 지우기 전까지는 남아있게됩니다.
현재 어떤 컨테이너들이 실행되는지 확인할때는 docker ps 명령을 사용합니다.
종료된 컨테이너까지 확인할때는 -a(all) 옵션을 붙여서 확인할 수 있습니다.

방금 종료시키고 나온 컨테이너를 확인해봅니다. 종료된 컨테이너 이므로 docker ps -a 로 확인해줍니다.

종료된 컨테이너 하나만 존재하는걸 확인할 수 있습니다. restart 명령으로 컨테이너를 다시 시작해줍니다. 컨테이너의 이름이나 ID로 restart, stop, rm(remove)를 실행할 수 있습니다.

jenkins 웹은 8080 포트로 바인딩 되어서 연결되어있습니다.
확인은 http://localhost:8080/ 에서 할 수 있습니다.

Jenkins settings

최초 사이트 접속시 아래와 같은 화면이 출력됩니다.

세팅을 하기 위해 initialAdminPassword 를 입력해주어야 합니다. 처음 run 할때 출력되긴 하지만 못보고 지나칠 수 있으므로 직접 찍어봅니다.

여러가지 방법이 있지만 컨테이너 터미널로 접속해서 한번 둘러보고 password 도 출력해보도록 합니다.

docker 의 exec 를 통해 bash 를 실행시키면서 옵션으로 i, t 를 주고 접속해봅니다. 이렇게 실행하면 jenkins 유저로 접속할 수 있습니다.
자세한 내용은 docker exec -h 를 통해 확인해 볼 수 있습니다.

출력된 password 를 복사해서 jenkins 웹에 입력해줍니다.

기본 설정에 맞는 플러그인을 설치하거나, 직접 선택할 수 있습니다. 추천 플러그인을 설치해봅니다. 클릭해주면 플러그인들이 설치되는 화면을 확인할 수 있습니다.

플러그인 설치가 완료되고, 어드민 계정을 추가해서 실행하면 아래와 같이 jenkins 가 실행 준비된 상태로 기다리는 화면을 맞이할 수 있게됩니다.


글이 길어졌지만, 여기까지 실행하고 확인하는데 10~20분 정도 소요되었을 것으로 생각됩니다. 이후 40~50분정도의 시간동안 안드로이드 SDK 를 다운로드 받고 안드로이드 프로젝트를 생성하고, github 에 업로드 하고, jenkins job 을 생성하고 빌드를 실행하는 작업들이 기다리고 있습니다.

뒤에 기다리고 있는 내용들은 Docker 와 Jenkins 를 사용한 안드로이드 CI — 2 에서 다뤄보도록 하겠습니다.

Nova Woo

Written by

Nova Woo

30대 백수를 꿈꾸는 소프트웨어 개발자

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade