도대체뭐가문제임

Android 프로젝트 CI/CD(Docker, Jenkins)[2] - Dockerfile 작성 본문

개발 기타

Android 프로젝트 CI/CD(Docker, Jenkins)[2] - Dockerfile 작성

뭐가문제임 2021. 6. 16. 17:19

Docker는 일종의 가상머신이다.

VirtualBox, VMware와 같은 가상머신에서 OS를 가상화하여 사용하는 것처럼

Docker도 Container를 가상화하여 사용한다.

 

도커로 Jenkins를 사용하면 Docker Engine에서 호스트의 커널을 공유하면서 Jenkins를 구동하는데 필요한 바이너리만 올라가게 된다.

역시 일반적인 가상머신처럼 Host OS 위에 Guest OS를 올려 사용하는 방식보다는 가벼울 수 밖에 없다.

 

Jenkins를 사용해 앱을 빌드하려면 JVM, Android SDK, Gradle이 필요하다.

호스트 OS에 JVM, Android SDK, Gradle이 설치되어있고 환경변수가 등록되어있다면 사용할 수 있는것이다.

 

하지만 그렇게 하면 Docker를 목적대로 온전히 사용하지 못한다고 생각했다.

어떠한 환경에서든 이미지만 실행시키면 똑같이 동작하게 해야하는데 Host OS에 필요한 것들이 설치되지 않았다는 이유로 변수가 생기면 완전한 추상화가 아니다.

 

그래서 Container위에 바로 Jenkins를 올리는 것이 아닌 리눅스 커널을 올리고 그 리눅스 커널에 각종 환경들을 갖춰 리눅스 커널 위에서 Jenkins가 동작하는 방식을 사용하기로 했다.

 

환경

Container 베이스 - Ubuntu 20.04

JVM -> openjdk-8-jdk

Gradle -> gradle-7.1

Jenkins -> 2.289.1

Android SDK -> sdk-tools-linux-4333796

Build Platform -> 30, 29

Build Tool -> 30.0.0, 30.0.1, 30.0.2, 30.0.3 , 29.0.0, 29.0.1, 29.0.2 

 

2021년 6월 21일 기준 최신버전으로 구성했다.

프로젝트에 따라 필요한 버전이 있다면 바꿔서 사용할 수 있다.

2021년 11월부터는 플레이스토어에 게시되는 모든 앱의 targetSdk를 30으로 맞춰야하니 11월부터는 29버전에 대한 대응은 필요없을 듯 하다.

 

#Dockerfile

FROM ubuntu:20.04

#우분투 업데이트, git 관련설치
RUN apt-get update \
 && apt-get upgrade -y \
 && apt-get install -y git curl \
 && curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash \
 && apt-get install -y git-lfs \
 && git lfs install \
 && rm -rf /var/lib/apt/lists/*

#각종 유틸 설치
RUN apt-get update \    
 && apt-get install -y unzip \    
 && apt-get install -y wget \    
 && apt-get install -y vim


#JDK 설치 및 환경변수 등록
ENV DEBIAN_FRONTEND=noninteractive
RUN 6 | apt-get install -y openjdk-8-jdk
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
ENV PATH $JAVA_HOME/bin:$PATH

#Gradle 설치 및 환경변수 등록
ADD https://services.gradle.org/distributions/gradle-7.1-all.zip /opt/
RUN unzip /opt/gradle-7.1-all.zip -d /opt/gradle
ENV GRADLE_HOME /opt/gradle/gradle-7.1
ENV PATH $GRADLE_HOME/bin:$PATH

#젠킨스 관련 변수 및 환경변수 등록
ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000
ARG http_port=8080
ARG agent_port=50000
ARG JENKINS_HOME=/var/jenkins_home
ARG REF=/usr/share/jenkins/ref
ENV JENKINS_HOME $JENKINS_HOME
ENV JENKINS_SLAVE_AGENT_PORT ${agent_port}
ENV REF $REF


RUN mkdir -p $JENKINS_HOME \
 && chown ${uid}:${gid} $JENKINS_HOME \ 
 && groupadd -g ${gid} ${group} \ 
 && useradd -d /var/jenkins_home -u ${uid} -g ${gid} -m -s /bin/bash ${user}

#로컬 호스트와 공유할 컨테이너 내부 디렉토리 설정
VOLUME $JENKINS_HOME

RUN mkdir -p ${REF}/init.groovy.d

#tini 설치
ARG TINI_VERSION=v0.16.1
COPY tini_pub.gpg ${JENKINS_HOME}/tini_pub.gpg
RUN curl -fsSL https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-$(dpkg --print-architecture) -o /sbin/tini \
 && curl -fsSL https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-$(dpkg --print-architecture).asc -o /sbin/tini.asc \
 && gpg --no-tty --import ${JENKINS_HOME}/tini_pub.gpg \
 && gpg --verify /sbin/tini.asc \
 && rm -rf /sbin/tini.asc /root/.gnupg \
 && chmod +x /sbin/tini

#Jenkins버전 지정 및 환경변수 등록
ARG JENKINS_VERSION
ENV JENKINS_VERSION ${JENKINS_VERSION:-2.289.1}

#Jenkins 설치에 필요한 SHA-256 (Jenkins 버전에 따라 달라짐)
ARG JENKINS_SHA=70f9cc6ff1ac59aeeb831b980709a9ddb0ee70d216ee50625a8508b9840f75f2

#Jenkins 다운로드 Url 변수 등록
ARG JENKINS_URL=https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-war/${JENKINS_VERSION}/jenkins-war-${JENKINS_VERSION}.war

#Jenkins 다운로드 및 설치
RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war && \
    echo "${JENKINS_SHA}  /usr/share/jenkins/jenkins.war" | sha256sum -c -
ENV JENKINS_UC https://updates.jenkins.io
ENV JENKINS_UC_EXPERIMENTAL=https://updates.jenkins.io/experimental
ENV JENKINS_INCREMENTALS_REPO_MIRROR=https://repo.jenkins-ci.org/incrementals
RUN chown -R ${user} /var/jenkins_home "$REF"

#Android SDK 설치, 라이센스 등록, 환경변수 등록(sdk 버전 30, 29)
RUN apt-get update && apt-get -y install mc && mkdir /var/android-sdk && cd /var/android-sdk
RUN wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
RUN chown -R jenkins:jenkins /var/android-sdk/
RUN unzip sdk-tools-linux-4333796.zip
RUN mv tools /var/android-sdk/
RUN cd /var/android-sdk/tools/bin/
RUN yes | /var/android-sdk/tools/bin/sdkmanager --update
RUN yes | /var/android-sdk/tools/bin/sdkmanager --licenses
RUN yes | /var/android-sdk/tools/bin/sdkmanager --list
RUN yes | /var/android-sdk/tools/bin/sdkmanager \
"tools" \
"platform-tools" \
"platforms;android-30" \
"build-tools;30.0.0" \
"build-tools;30.0.1" \
"build-tools;30.0.2" \
"build-tools;30.0.3" \
"platforms;android-29" \
"build-tools;29.0.0" \
"build-tools;29.0.1" \
"build-tools;29.0.2" \
"extras;android;m2repository" \
"extras;google;m2repository"
RUN rm -r sdk-tools-linux-4333796.zip

# 웹포트 지정
EXPOSE ${http_port}

# slave agent포트 지정. 도커엔진이 사용하는 포트이다.
EXPOSE ${agent_port}

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
COPY tini-shim.sh /bin/tini
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]

# from a derived Dockerfile, can use `RUN plugins.sh active.txt` to setup ${REF}/plugins from a support bundle
COPY plugins.sh /usr/local/bin/plugins.sh
COPY install-plugins.sh /usr/local/bin/install-plugins.sh

이 외에 필요한 파일이 몆 가지 더 있는데

https://github.com/raphael1063/DockerAndroidJenkins.git

 

raphael1063/DockerAndroidJenkins

Android CD/CD를 위한 Docker. Contribute to raphael1063/DockerAndroidJenkins development by creating an account on GitHub.

github.com

여기에 모두 포함되어있다.

 

참고

https://medium.com/@NovaWoo/docker-와-jenkins-를-사용한-안드로이드-ci-1-9510178a525f

 

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

이번 Docker 와 Jenkins 를 사용한 안드로이드 CI — 1 포스트에서는 1. 넓고 얕게 훑고 넘어가는 Docker 에 대한 언급과 2. Dockerfile 수정, docker build, docker run 을 다룹니다. 2. 간단한…

medium.com

https://beomseok95.tistory.com/181

 

Docker 를 이용한 CI 구축 - 3(android sdk setup)

Docker 를 이용한 CI 구축 - 3(android sdk setup) 이번에는 안드로이드 sdk 를 설정해주도록 하겠습니다 1. 터미널에서 루트권한으로 컨테이너에 접속해 줍니다 . docker exec -it -u 0 "Container name"..

beomseok95.tistory.com

 

Comments