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

이번 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 해 오도록 합니다.

$ git clone https://github.com/jenkinsci/docker.git
$ cd docker
$ ls -al
total 144
drwxr-xr-x 18 nova staff 612 Feb 20 00:15 .
drwxr-xr-x 8 nova staff 272 Feb 20 00:12 ..
drwxr-xr-x 13 nova staff 442 Feb 20 00:12 .git
drwxr-xr-x 3 nova staff 102 Feb 20 00:12 .github
-rw-r--r-- 1 nova staff 259 Feb 20 00:12 .gitmodules
-rw-r--r-- 1 nova staff 829 Feb 20 00:12 CONTRIBUTING.md
-rw-r--r-- 1 nova staff 2715 Feb 20 00:12 Dockerfile
-rw-r--r-- 1 nova staff 940 Feb 20 00:12 Jenkinsfile
-rw-r--r-- 1 nova staff 9271 Feb 20 00:12 README.md
-rw-r--r-- 1 nova staff 158 Feb 20 00:12 docker-compose.yml
-rw-r--r-- 1 nova staff 328 Feb 20 00:12 init.groovy
-rwxr-xr-x 1 nova staff 5960 Feb 20 00:12 install-plugins.sh
-rwxr-xr-x 1 nova staff 5000 Feb 20 00:12 jenkins-support
-rwxr-xr-x 1 nova staff 1210 Feb 20 00:12 jenkins.sh
-rwxr-xr-x 1 nova staff 3917 Feb 20 00:12 plugins.sh
-rwxr-xr-x 1 nova staff 4128 Feb 20 00:12 publish.sh
drwxr-xr-x 10 nova staff 340 Feb 20 00:12 tests
-rwxr-xr-x 1 nova staff 1121 Feb 20 00:12 update-official-library.sh

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

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

$ vi Dockerfile
FROM openjdk:8-jdk
RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*
ENV JENKINS_HOME /var/jenkins_home
ENV JENKINS_SLAVE_AGENT_PORT 50000
ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000
# Jenkins is run with user `jenkins`, uid = 1000
# If you bind mount a volume from the host or a data container,
# ensure you use the same uid
RUN groupadd -g ${gid} ${group} \
&& useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user}
# Jenkins home directory is a volume, so configuration and build history 
# can be persisted and survive image upgrades
VOLUME /var/jenkins_home
# `/usr/share/jenkins/ref/` contains all reference configuration we want 
# to set on a fresh new installation. Use it to bundle additional plugins
# or config file with your custom jenkins Docker image.
RUN mkdir -p /usr/share/jenkins/ref/init.groovy.d
ENV TINI_VERSION 0.13.2
ENV TINI_SHA afbf8de8a63ce8e4f18cb3f34dfdbbd354af68a1
# Use tini as subreaper in Docker container to adopt zombie processes 
RUN curl -fsSL https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-static-amd64 -o /bin/tini && chmod +x /bin/tini \
&& echo "$TINI_SHA /bin/tini" | sha1sum -c -
COPY init.groovy /usr/share/jenkins/ref/init.groovy.d/tcp-slave-agent-port.groovy
# jenkins version being bundled in this docker image
ARG JENKINS_VERSION
ENV JENKINS_VERSION ${JENKINS_VERSION:-2.32.2}
# jenkins.war checksum, download will be validated using it
ARG JENKINS_SHA=f495a08733f69b1845fd2d9b3a46482adb6e6cee
# Can be used to customize where jenkins.war get downloaded from
ARG JENKINS_URL=https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-war/${JENKINS_VERSION}/jenkins-war-${JENKINS_VERSION}.war
# could use ADD but this one does not check Last-Modified header neither does it allow to control checksum 
# see https://github.com/docker/docker/issues/8331
RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war \
&& echo "${JENKINS_SHA} /usr/share/jenkins/jenkins.war" | sha1sum -c -
ENV JENKINS_UC https://updates.jenkins.io
RUN chown -R ${user} "$JENKINS_HOME" /usr/share/jenkins/ref
# for main web interface:
EXPOSE 8080
# will be used by attached slave agents:
EXPOSE 50000
ENV COPY_REFERENCE_FILE_LOG $JENKINS_HOME/copy_reference_file.log
USER ${user}
COPY jenkins-support /usr/local/bin/jenkins-support
COPY jenkins.sh /usr/local/bin/jenkins.sh
ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]
# from a derived Dockerfile, can use `RUN plugins.sh active.txt` to setup /usr/share/jenkins/ref/plugins from a support bundle
COPY plugins.sh /usr/local/bin/plugins.sh
COPY install-plugins.sh /usr/local/bin/install-plugins.sh

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

FROM ubuntu:16.04

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

FROM openjdk:8-jdk >>> FROM ubuntu:16.04

Add openjdk

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

RUN apt-get update && \    
apt-get install -y unzip && \
apt-get install -y wget && \
apt-get install -y vim && \
apt-get install -y openjdk-8-jdk

Add Gradle

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

# Add Gradle
ADD https://services.gradle.org/distributions/gradle-2.4-all.zip /opt/
RUN unzip /opt/gradle-2.4-all.zip -d /opt/gradle
ENV GRADLE_HOME /opt/gradle/gradle-2.4-all
ENV PATH $GRADLE_HOME/bin:$PATH

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

# Add Android SDK
## Source https://developer.android.com/studio/index.html
RUN wget --progress=dot:giga https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && \
mv android-sdk_r24.4.1-linux.tgz /opt/ && \
cd /opt && tar xzvf ./android-sdk_r24.4.1-linux.tgz && \
rm -rf /opt/android-sdk_r24.4.1-linux.tgz && \
apt-get install gcc-multilib -y && \
apt-get autoclean -y && \
apt-get autoremove -y
ENV ANDROID_HOME /opt/android-sdk-linux/
ENV PATH $ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH
RUN chmod -R 755 $ANDROID_HOME

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

FROM ubuntu:16.04
# install openjdk-8
RUN apt-get update && \
apt-get install -y unzip && \
apt-get install -y wget && \
apt-get install -y vim && \
apt-get install -y openjdk-8-jdk
# Add Gradle
ADD https://services.gradle.org/distributions/gradle-2.4-all.zip /opt/
RUN unzip /opt/gradle-2.4-all.zip -d /opt/gradle
ENV GRADLE_HOME /opt/gradle/gradle-2.4-all
ENV PATH $GRADLE_HOME/bin:$PATH
# jenkins dockerfile
RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*
ENV JENKINS_HOME /var/jenkins_home
ENV JENKINS_SLAVE_AGENT_PORT 50000
ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000
# Jenkins is run with user `jenkins`, uid = 1000
# If you bind mount a volume from the host or a data container,
# ensure you use the same uid
RUN groupadd -g ${gid} ${group} \
&& useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user}
# Jenkins home directory is a volume, so configuration and build history 
# can be persisted and survive image upgrades
VOLUME /var/jenkins_home
# `/usr/share/jenkins/ref/` contains all reference configuration we want 
# to set on a fresh new installation. Use it to bundle additional plugins
# or config file with your custom jenkins Docker image.
RUN mkdir -p /usr/share/jenkins/ref/init.groovy.d
ENV TINI_VERSION 0.13.2
ENV TINI_SHA afbf8de8a63ce8e4f18cb3f34dfdbbd354af68a1
# Use tini as subreaper in Docker container to adopt zombie processes 
RUN curl -fsSL https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-static-amd64 -o /bin/tini && chmod +x /bin/tini \
&& echo "$TINI_SHA /bin/tini" | sha1sum -c -
COPY init.groovy /usr/share/jenkins/ref/init.groovy.d/tcp-slave-agent-port.groovy
# jenkins version being bundled in this docker image
ARG JENKINS_VERSION
ENV JENKINS_VERSION ${JENKINS_VERSION:-2.32.2}
# jenkins.war checksum, download will be validated using it
ARG JENKINS_SHA=f495a08733f69b1845fd2d9b3a46482adb6e6cee
# Can be used to customize where jenkins.war get downloaded from
ARG JENKINS_URL=https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-war/${JENKINS_VERSION}/jenkins-war-${JENKINS_VERSION}.war
# could use ADD but this one does not check Last-Modified header neither does it allow to control checksum 
# see https://github.com/docker/docker/issues/8331
RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war \
&& echo "${JENKINS_SHA} /usr/share/jenkins/jenkins.war" | sha1sum -c -
ENV JENKINS_UC https://updates.jenkins.io
RUN chown -R ${user} "$JENKINS_HOME" /usr/share/jenkins/ref
# for main web interface:
EXPOSE 8080
# will be used by attached slave agents:
EXPOSE 50000
ENV COPY_REFERENCE_FILE_LOG $JENKINS_HOME/copy_reference_file.log
USER ${user}
COPY jenkins-support /usr/local/bin/jenkins-support
COPY jenkins.sh /usr/local/bin/jenkins.sh
ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]
# from a derived Dockerfile, can use `RUN plugins.sh active.txt` to setup /usr/share/jenkins/ref/plugins from a support bundle
COPY plugins.sh /usr/local/bin/plugins.sh
COPY install-plugins.sh /usr/local/bin/install-plugins.sh

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

Build Dockerfile

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

$ docker build -t ubuntu-jenkins .
Sending build context to Docker daemon 475.1 kB
Step 1/36 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
8aec416115fd: Pull complete
695f074e24e3: Pull complete
946d6c48c2a7: Pull complete
bc7277e579f0: Pull complete
2508cbcde94b: Pull complete
Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950
Status: Downloaded newer image for ubuntu:16.04
---> f49eec89601e
Step 2/36 : RUN apt-get update && apt-get install -y unzip && apt-get install -y wget && apt-get install -y vim && apt-get install -y openjdk-8-jdk
---> Running in 9cd0880d0ed1
...
...
Step 34/36 : ENTRYPOINT /bin/tini -- /usr/local/bin/jenkins.sh
---> Running in d6226e8eda9a
---> ec29ad6e9457
Removing intermediate container d6226e8eda9a
Step 35/36 : COPY plugins.sh /usr/local/bin/plugins.sh
---> 84b188644dd2
Removing intermediate container 62f74d127340
Step 36/36 : COPY install-plugins.sh /usr/local/bin/install-plugins.sh
---> 33c4b10c1c25
Removing intermediate container 938eda0e1334
Successfully built 33c4b10c1c25

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

$ docker images
ubuntu-jenkins latest 33c4b10c1c25 3 minutes ago 912 MB
ubuntu 16.04 f49eec89601e 4 weeks ago 129 MB

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 에 대한 소유권을 지정하는 작업인데 운영체제 환경이나 권한 상 필요한 경우에만 진행해주면 됩니다.

$ cd ~
$ mkdir jenkins_home
$ sudo chown 1000:1000 jenkins_home
$ ls -al
...
...
drwxr-xr-x 2 1000 1000 68 Feb 20 01:02 jenkins_home

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

$ docker run --name ubuntu-jenkins -p 8080:8080 -p 50000:50000 -v ~/jenkins_home:/var/jenkins_home ubuntu-jenkins

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

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

...
...
*************************************************************
*************************************************************
*************************************************************
Feb 19, 2017 4:33:46 PM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Feb 19, 2017 4:33:46 PM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Feb 19, 2017 4:33:46 PM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
Feb 19, 2017 4:33:47 PM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
--> setting agent port for jnlp
--> setting agent port for jnlp... done
Feb 19, 2017 4:33:50 PM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Feb 19, 2017 4:33:50 PM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 11,161 ms
...

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

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

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

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5494ee5c7e27        ubuntu-jenkins      "/bin/tini -- /usr..."   3 minutes ago       Exited (130) About a minute ago                       ubuntu-jenkins

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

$ docker restart ubuntu-jenkins
or 
$ docker restart 5494

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

Jenkins settings

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

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

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

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

...$ docker exec -i -t ubuntu-jenkins bash
jenkins@..:/$
jenkins@..:/$ cat /var/jenkins_home/secrets/initialAdminPassword
ac5565f4c6364428b2c50b2a0e6520d0
// root 권한으로 접속해보고 싶다면 -u 0 옵션을 추가해볼 수 있다.
...$ docker exec -i -t -u 0 ubuntu-jenkins bash

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

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

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


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

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

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.