이 글은 CI/CD를 안드로이드에 도입하게 되면서 정리한 내용입니다. 구축 및 운영하고자 하시는 분에게 경험을 공유하고자 합니다.

안녕하세요 라이더스 개발팀 장인수 입니다.

소개

우선 라이더스 개발팀이 하는 일을 소개 합니다. 저희 라이더스 개발팀은 배달되지 않는 음식점의 음식을 민트색 헬멧을 쓴 라이더 분들이 오토바이를 이용하여 음식을 픽업 후 고객님에게 배달하는 일정 과정들을 원활하고 효율적으로 운영이 될 수 있도록 개발하는 팀 입니다.

그중 모바일(app)은 라이더스 분들이 주문이 들어오면 주문을 확인 후 픽업 -> 배달까지 필요한 부분을 제공하고 빠르게 이용 할 수 있도록 개발하고 있습니다.

라이더스는 B2B앱으로써 일반사용자를 위한 앱은 아니고 오직 라이어스 분들만을 위한 앱이라고 할 수 있습니다.

CI / CD 란?

CI(Continuous Integration) 란?

Build , Test를 실시하는 프로세스를 말하며 이러한 통합 프로세스를 상시로 실시해 주는것을 CI라고 합니다.

즉, 통합을 지속적으로 수행하는 것이

CI

CD(Continuous Delivery or Continuous Deploy) 란?

짧은 주기로 소프트웨어를 개발하는 소프트웨어 공학적 접근의 하나로, 소프트웨어가 언제든지 신뢰 가능한 수준으로 출시될 수 있도록 보증하기 위한 것이다. 소프트웨어를 더 빠르게, 더 주기적으로 빌드하고 테스트하고 출시하는 것을 목표로 한다. 이러한 접근은 더 많은 증분 업데이트를 업무 애플리케이션에 적용할 수 있게 함으로써 변경사항의 배포에 대한 비용, 시간, 위험을 줄일 수 있게 한다.

즉,

지속적 배포다.

짦은 주기로 개발중인 소프트웨어를 배포하고 그 과정을 자동화 하겠다는 뜻이다.


CI/CD를 시작하게 된 계기

  • 라이더스는 한번 배포가 이루어 질 때 3개의 각기 다른 주소를 가진 5개의 apk 파일이 만들어지고 Github 및 베타와 운영 시스템에 배포가 이루어 지게 됩니다.

수동으로 개발자의 손을 통해서 배포가 이루어지다 보니 Human Error 의 발생의 소지가 있고 앱은 서버의 배포와 달리 한번 잘못 배포가 되어지면 다시 배포하는 과정의 어려움이 작지 않아서 최대한 자동화를 이루고자 하는 마음에서 도입하게 되었습니다.

실은 제가 .... Release로 빌드를 해야 하는데.. Debug로 build를 하는 실수로 식겁해서 우선순위를 높여 얼른 도입 했습니다..;;;;

Jenkins for Android Using Docker 도입배경

CI/CD를 하기위해서는 여러가지 선택이 있습니다. Travis CI, Circle CI, BITRISE, Jenkins 등이 있지만, 아래 같은 장점을 가진 Jenkins 를 선택하게 되었습니다.

Jenkins의 장점

- 무료 사용
- 사용자 정의 옵션
- 방대한 양의 플로그인
- 다양한 적용사례 및 풍부한 레퍼런스
- Remote access API 제공

그리고 도커를 선택한 이유는 젠킨스 서버를 띄우기 위해서는 여러가지의 서버 설정등과 설치등이 필요한데 이 모든 일련의 과정을 Dokerfile에 작성을 하고 손쉽게 띄울수 있는 도커를 선택에서 작업시간 및 운영에 오는 리소스를 줄이고자 선택하였습니다.

기대하는 이상적인 시스템

아래 그림과 같이 도입하려고 했습니다.

이상적인 시스템

저희는 Slack 등을 사용하고 있어서 apk 를 타겟 시스템 별로 아래 그림과 같이 배포하도록 만들었습니다. Slack에서는 slack bot api등을 지원을 해줘서 어렵지 않도록 Slack bot을 만들고 사용할 수 있습니다. 여기서는 자세한 설명은 생략하고 위의 https://api.slack.com 로 가시면 자세한 사항을 만들어 볼 수 있습니다.

저희는 Slack bot을 만들고 그것을 사용해서 아래 그림과 같이 배포하여서 사용하였습니다.

slack

Docker for Jenkins 이미지 만들기 위한 Dockerfile 작성

Docker 는 docker hub 라는 repository가 있습니다. 개발자들은 다들 알고 계신 github와 비슷하다고 보시면 됩니다. 간단하게 jenkins official dockerfile 을 이용하고 약간의 추가 사항을 통해서 어렵지 않도록 Jenkins를 이용하기 위한 docker image 를 만들 수 있습니다.

https://hub.docker.com 에 접속해서 jenkins를 검색하면 아래 그림과 같이 나옵니다.

docker hub

jenkins Official 이미지는 Android SDK 등이 포함 되지 않았으므로

$ git clone https://github.com/jenkinsci/docker.git
$ cd docker

git repository 를 clone 해서 수정해서 사용하도록 합니다.

공식 dockerfile 은 아래와 같고

FROM openjdk:8-jdk

RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*

ARG user=jenkins
ARG group=jenkins
....
...
..
.

dockerfile link

공식 dockerfile 에서 안드로이드에서 사용하기 위해서 Gradle , OpenJDK, Android SDK를 추가하도록 하겠습니다.

FROM openjdk:8-jdk » FROM ubuntu:16.04

FROM ubuntu:16.04

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

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 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
RUN echo y | android update sdk --no-ui --all --filter "android-24"
RUN echo y | android update sdk --no-ui --all --filter "android-25"
RUN echo y | android update sdk --no-ui --all --filter "android-23"
RUN echo y | android update sdk --no-ui --all --filter build-tools-26.0.2
RUN echo y | android update sdk --no-ui --all --filter platform-tools
RUN echo y | android update sdk --no-ui --all --filter extra-android-m2repository
RUN echo y | android update sdk --no-ui --all --filter extra-google-m2repository

Docker build

$ docker build -t ubuntu-jenkins .

Run Docker image

$ docker run -name ubuntu-jenkins -p 8080:8080 -p 50000:50000 ubuntu-jenkins

위와 같이 하면은 Jenkins가 띄워지고 사용하실 수 있습니다.

마치며

아직 한땀, 한땀 으로 공들여서 배포하시는 분들은 수동

CI / CD 를 도입해서 아래와 같이 공지해주는 것에서 해방 되시기를 바랍니다.

카톡

참고 페이지