디지안의 개발일지
Gradle offline Build (feat. Docker) 본문
들어가기 전에
현재 회사에서는 주로 B2B를 진행하고 있기 때문에 인터넷이 되지 않는 온프레미스 환경에서 모든 환경들이 설정되어야 한다. 그리고 아무리 회사 내에서 테스트를 진행해도 고객사에서 문제가 발생하는 경우가 있어서 코드를 가져가서 직접 빌드하자는 의견이 나왔다. 감사하게도 이에 대해 정리해주신 글이 있었고 실제로 수행해본 결과를 정리하려고 한다.
의존성 캐싱
오프라인에서 gradle를 빌드하기 위해서는 온라인 상태에서 필요한 의존성들을 미리 캐싱을 해야한다. 캐싱은 따로 어떤 행위를 해야하는건 아니다. gradle에서는 기본적으로 ~/.gradle 폴더에 버전별로 라이브러리들이 저장이 되어있다. 정확하게 어떻게 저장하는지는 잘 모르겠다.
Docker로 빌드 환경 구성하기
현 회사에서는 기본적으로 kubenate와 Docker를 기반 통해 배포 환경을 구성하고 있기 때문에 실제 사이트에서 사용할 수 있는 것은 Docker 환경이다. 그래서 Docker 내에서 빌드할 수 있도록 환경을 구성해야한다.
Dockerfile을 다음과 같이 구성한다.
## 기본 이미지를 openjdk로 사용
FROM openjdk:11
## gradle 설치를 위한 명령어들
RUN apt-get update && apt-get install vim wget zip -y
RUN wget https://services.gradle.org/distributions/gradle-7.0.2-bin.zip
RUN unzip -d /opt/gradle gradle-7.0.2-bin.zip
RUN echo "alias gradle-build='/opt/gradle/gradle-7.0.2/bin/gradle -x test build -g /source/gradle --offline'" >> ~/.bashrc
RUN source ~/.bashrc
## 도커를 설치하기 위한 명령어들
RUN apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
RUN echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt update
RUN apt install -y docker-ce docker-ce-cli containerd.io
## gradle 의존성 폴더 및 소스 코드 복사
RUN mkdir /source
COPY . /source
# 하루 동안 sleep하는 형태로 멈춰 있음.
CMD ["sleep", "5184000"]
주의해야할 점은 캐싱하는 gradle 버전과 설치하는 gradle 버전이 맞아야 한다. 그래서 직접 수동으로 gradle을 설치하는 것을 선택했다.
위와 같이 작성이 완료되면 다음 명령어로 도커를 빌드한다.
docker build -t test:0.1.0 .
도커로 컨테이너를 실행하고 도커 내부에서 도커 이미지 만들기
이미지가 만들어졌으니 컨테이너를 실행해보자. 특별하게 들어가는 --privileged와 /sbin/init는 systemctl로 컨테이너 내부에서 도커를 실행할 수 있게 하기 위한 설정이다.
docker run -d --privileged --name test test:0.1.0 /sbin/init
현재 도커 환경 내부와 오프라인 모드에서 빌드를 하기 위해서는 다음과 같은 명령어를 작성해야한다.
/opt/gradle/gradle-7.0.2/bin/gradle build -g /source/gradle --offline
상당히 길기 때문에 쓰기 불편한 부분이 있어 alias를 등록해놨다.
gradle-build
gradle build가 완성되면 도커 이미지를 빌드하면 된다.
docker build -t test-in-docker:0.1.0 .
마무리
회사 코드이기 때문에 코드가 어떻게 구성되어 있는지 공개하기가 어려워 이해하기 어려울 수 있을 듯하다. 하지만 gradle과 docker에 대해서 어느정도 알고 있다는 전제 하에 다음 사항만 주의하면 될거 같다.
- 도커 내부에서 빌드하고 싶은 코드를 반드시 캐싱을 해야한다. 캐싱할 때 gradle 캐싱 파일이 생각보다 매우 크기 때문에 해당 프로젝트에서 필요로 하는 의존성만 캐싱하는 것이 좋다. (gradle 빌드 할 때 -g 옵션으로 특정 디렉터리를 지정하면 해당 디렉터리에 캐싱이 된다.)
- 의존성이 추가될 때마다 반드시 빌드를 다시해서 캐싱해야 한다.
- 캐싱하는 PC의 gradle 버전과 docker 내부의 gradle 버전이 반드시 같아야 한다. (위 Dockerfile 예제에서 버전만 변경하면 된다.)