korean IT student

[DOCKER & Jenkins & Github] 를 활용한 멀티모듈 spring Boot CI/CD (centos 8) 본문

Infra/Docker

[DOCKER & Jenkins & Github] 를 활용한 멀티모듈 spring Boot CI/CD (centos 8)

현창이 2021. 7. 7. 14:15

순서

1. spring boot Dockerfile 작성하기

2. docker로 jenkins설치 

3. jenkins로 아이템 생성  (github 연동)

4. jenkins build (docker명령어로 프로젝트 실행)

5. jenkins 컨테이너에 docker 설치 (docker error 해결)

 

[참고- 제가 올린 레포지토리 입니다. ]

- https://github.com/koreanstudent/MSA2021

 

 

1. spring boot Dockerfile 작성하기

먼저 아래와 같이 msa-eureka, msa-user 두 개의 프로젝트를 jenkins를 활용하여 배포할 예정입니다.

 

msa-eureka 프로젝트 최상단에 Dockerfile을 생성합니다. (msa-user도 동일하게 만들어줍니다.)

내용은 아래와 같이 입력합니다.

https://spring.io/guides/gs/spring-boot-docker/   <- 공식문서

 

- ARG는 build 시에 사용되는 변수입니다.

- COPY는 사용하면 파일이나 디렉터리를 복사하여 컨테이너 디렉터리에 추가해줍니다.

- ENTRYPOINT 는 해당 컨테이너가 시작되었을 때 수행할 실행 명령을 정의하는 명령어입니다. Dockerfile 파일 내에서 1번만 정의가 가능합니다.

 

작성이 완료되었으면 github에 생성한 repository에 push 합니다.

 

2. docker로 jenkins설치 

jenkins 이미지를 다운로드합니다. (스프링 부트 프로젝트가 자바 11이라서 젠킨스도 자바 11로 설치하였습니다.)

- docker pull jenkins/jenkins::jdk11

 

젠킨스를 구동합니다. 

- docker run --name jenkins-docker -d -p 8080:8080 -p 50000:50000 -v /home/docker/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:jdk11

- 젠킨스 컨테이너 (/var/jenkins_home)안에서 새롭게 우리의 프로젝트 컨테이너를 구동시킬 것이기 때문에 docker.sock 파일을 볼륨 해줍니다.

 

8080 포트로 실행을 합니다. 아래와 같이 초기 비밀번호를 입력하고 설정은 완료합니다.

 

 docker logs jenkins(컨테이너명)을 실행하여 비밀번호를 확인할 수 있다.

 

3. jenkins로 아이템 생성  (github 연동)

젠킨스에 아이템을 생성해보자. 아래 이미지 참고

GitHub를 연동할 계획이다. 먼저 GitHub project를 선택하고 프로젝트 url을 입력합니다.

 

이후 Git을 선택 후 Repostiry URL을 입력 및 GitHub 아이디 비밀번호를 입력합니다.

- Branches to build - GitHub에서 사용하고 있는 branch name을 입력합니다.

 

4.  jenkins build (docker명령어로 프로젝트 실행)

젠킨스 Build 명령어를 입력합니다. (멀티 모듈로 진행하여 프로젝트 각각 build 처리할 것입니다.)

 

- shell에 전달할 파라미터 값을 지정할 수 있습니다. 

- PROJECT_NAME : shell에 입력될 파라미터 명

- Choices : 젠킨스 빌드 시 파라미터 명을 선택할 수 있습니다.

- gradle 실행 시 접근 권한 문제로 인해서 먼저 chmod +x gradlew를 입력합니다.

- 프로젝트 선택에 따라 빌드를 다르게 설정하였습니다. (msa-eureka 프로젝트 기준으로 설명드리겠습니다.)

- jenkins 내의 /home/docker/jenkins/workspace/젠킨스 아이템 명/msa-eureka/build/libs 안에 jar파일이 생성됩니다.

- 도커 이미지로 빌드할 프로젝트로 경로 이동 후 docker 빌드 및 docker hub에 push 합니다.

- 이후 스프링 프로젝트가 실행되고 있으면 중지 및 제거를 하고 docker hub에서 최신 이미지를 받아서 실행합니다.

if [ ${PROJECT_NAME} = "discovery-service" ]; then
  echo "discovery-service docker start"
  ./gradlew :msa-eureka:clean :msa-eureka:build
  cd msa-eureka/
  docker build -t hn123123/${PROJECT_NAME} .
  docker push hn123123/${PROJECT_NAME}
  docker stop ${PROJECT_NAME} || true && docker rm ${PROJECT_NAME} || true
  docker run -d -p 8761:8761 --network msa-network --name ${PROJECT_NAME} hn123123/${PROJECT_NAME}
else 
  echo "user-service docker start"
  ./gradlew :msa-user:clean :msa-user:build
  cd msa-user/
  docker build -t hn123123/${PROJECT_NAME} .
  docker push hn123123/${PROJECT_NAME}
  docker stop ${PROJECT_NAME} || true && docker rm ${PROJECT_NAME} || true
  docker run -d -p 8082:8082 --network msa-network --name ${PROJECT_NAME} -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" hn123123/${PROJECT_NAME}
fi

 

5.  jenkins 컨테이너에 docker 설치 (docker error 해결)

jenkins로 빌드 시 아래와 같이 에러가 날 경우 해결 방법입니다. (docker: not found)

- 젠킨스 컨테이너 내에 docker를 설치 및 로그인을 합니다.

- docker exec -it jenkins /bin/bash : 젠킨스 컨테이너 접속

- curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz : 도커 설치

- tar xzvf docker-17.04.0-ce.tgz : 압축을 풀어줍니다.

- mv docker/docker /usr/local/bin : bin 폴더에 옮겨 docker 명령어 사용할 수 있게 합니다.

- rm -r docker docker-17.04.0-ce.tgz : 기존 압축파일 제거

- docker login : 도커 아이디 및 비밀번호를 입력하여 로그인을 합니다.

 

docker에 프로젝트가 실행됨을 알 수 있다.

 

마무리

- 처음에 하나의 프로젝트만 실행을 해보았는데 이렇게 멀티 모듈 프로젝트를 각각 아이템을 만들어서 하려고 했는데 Choice parameter로 빌드할 프로젝트를 선택 후 shell에 if else 문을 통하여 원하는 프로젝트를 빌드할 수 있었다.

Comments