관리 메뉴

개발 블로그

[Jenkins] Jenkins에서 Docker build와 Docker push하기 본문

백엔드 개발/Jenkins

[Jenkins] Jenkins에서 Docker build와 Docker push하기

anomie7 2018.12.18 15:36

현재 젠킨스를 git hub와 연동해서 master branch에 push하면 자동으로 빌드하도록 설정했다.

빌드는 gradle로 하고 unit test도 함께 진행한다.

그리고 빌드의 시작과 끝(성공과 실패 모두)은 slack으로 알람을 받을 수 있다.

코드에 대한 build 자동화는 끝난 셈이다.

그러나 docker image로 build하고 docker hub에 push하는 작업도 자동화가 필요하다.

여기까지만 자동화가 되어도 상당히 편하게 개발을 할 수 있을 것같다.

1. 도커 안에서 도커를 돌리는 방식 소개

젠킨스 이미지에서 docker build와 push를 하기 위해서는 docker image 안에 docker를 설치할 필요가 있다.

컨테이너에서 docker를 돌리는 방식을 docker in docker라고 하는데.

docker in docker를 구현하는 방법으로는 두가지가 있다.


첫번째는 docker socket을 이용하는 것이다.

가장 심플하고 가벼운 방법이다.

이 방법을 사용하면 docker container에서 docker 명령어를 사용할 수 있지만 실제로는 docker host에서 명령어가 실행된다.

만약 docker run 명령어를 컨테이너에서 실행하더라도 실제로는 명령어를 실행한 컨테이너의 형제 컨테이너가 실행된다.

우리는 이 방법을 사용할 것이다.


두번째는 docker를 실제로 돌리는 것인데.

이 경우 첫번째 경우와 다르게 호스트와 독립적인 환경을 구성하게 될 것같다.

이번에는 이 방법은 사용하지 않는다.


2. 도커 소켓으로 젠킨스 컨테이너와 도커 호스트 연결하기


구글링을 해보니 이미 모든 것이 설정되어 있는 젠킨스 이미지가 있었다.

jenkins/jenkins:lts를 기반으로 하고 있어서 아직 컨테이너를 안 돌리고 있다면 바로 받아서 사용하면 될 듯하다.

그리고 만약 이미 젠킨스 이미지를 돌리고 있다면 이 글을 참고해서 docker를 설치하면 된다.


3. 젠킨스 이미지 실행하기

docker run \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
getintodevops/jenkins-withdocker:lts



젠킨스 이미지에 도커를 설치했다면 실행할 때 호스트와 컨테이너에 존재하는 docker.sock라는 파일을 -v 옵션으로 마운트해줘야한다.

docker.sock 파일을 /var/run/ 디렉토리 아래에 있으므로

위와 같이 실행시키면 된다.


docker exec -it -u root 컨테이너 이름 /bin/bash로 접속해서 docker ps를 실행해보자

그러면 host에서 돌아가고 있는 container list가 조회될 것이다.



4. Dockerfile 작성하기


docker build를 하기 위해서는 Dockerfile을 프로젝트의 루트 디렉토리에 위치시켜야한다.

내가 테스트하고 있는 프로젝트도 루트에 Dockerfile이 위치하고 있다.

Dockerfile에 대해서는 굳이 설명하지 않겠다.



5. 젠킨스에서 쉘 스크립트 작성하기


우선 build.gradle 파일의 version 속성을 수정한다.

version = 0.0.1-SNAPSHOP로 되어 있는 것을 version = 0.0.1로 바꾸겠다



젠킨스 서버로 접속해서 내가 빌드할 프로젝트을 선택하고 > 구성 > Build에서 Execute Shell을 선택한다.


./gradlew clean build

JARNAME=$(find ./build/libs/*.jar | cut -d - -f 4)
VERSION=$(expr substr $JARNAME 1 5)
docker build -t username/demo:$VERSION . && docker push minudev1212/demo:$VERSION


필자는 이런식으로 스크립트를 작성했다.


빌드를 실행해서 제대로 푸쉬가 되는지 확인해보자


제대로 빌드와 푸쉬가 되었다.(순서가 이상한 건 무시하자...연습하다보니 이렇게 되었다.)

처음에는 되게 복잡할거라고 생각했는데.

생각보다 간단하게 되어서 너무 좋았다.

이제 빌드의 자동화는 다 된 셈이다.

여태 docker build하고 push하는게 넘 귀찮았는데. 자동화되니깐 넘나 좋다...

이제는 빌드한 이미지는 어떻게 테스트할까 생각이 드는데.

docker push한 직후 새로 docker container를 띄우는 것도 나쁘지 않아보인다.


0 Comments
댓글쓰기 폼