본문 바로가기
Spring Boot

[Spring Boot] 스프링부트 jenkins, docker, github사용하여 배포

by byeongoo 2020. 3. 1.

이번 포스팅에서는 스프링부트와 docker, jenkins, github를 사용하여 AWS EC2서버에 jenkins에 빌드 버튼을 누르면 자동으로 도커 컨테이너로 서버가 올라오는 부분까지 진행해보도록하겠습니다. 참고로 빌드툴로 Maven을 사용하였습니다. 또한 Maven 파일에는 도커를 사용하기 위해 fabric8이라는 플러그인을 추가하였습니다. 스프링부트에서 도커파일을 작성하였고, 도커 build가 가능한 상태라고 가정하고 진행하겠습니다.  

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.26.0</version>
                <configuration>
                    <images>
                        <image>
                            <name>nuguya</name>

                            <build>
                                <dockerFileDir>${basedir}</dockerFileDir> <!-- 기본 경로가  src/main/docker 까지 잡혀있음 basedir 환경 변수를 쓰면 프로젝트의 기본 디렉토리를 쓰게됨-->
                                <filter>@</filter>
                            </build>
                        </image>
                    </images>
                </configuration>
                <executions>
                    <execution>
                        <id>docker-build</id>
                        <phase>package</phase> <!-- 패키징 한다음에 끼어들어가라 -->
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

1. 도커 설치

aws ec2 인스턴스에 도커가 설치되어있지 않은 분들은 도커를 설치해줍니다.

docker pull jenkins/jenkins

2. jenkins 도커 이미지 다운로드

jenkins 도커 이미지를 다운로드 받습니다.

docker pull jenkins/jenkins

3. jenkins 컨테이너 실행

다운로드 받은 jenkins 도커 이미지를 통해서 jenkins 컨테이너를 실행시켜줍니다.

docker run -d -p 30000:8080 --restart=always -v /var/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins -u root jenkins/jenkins

4. jenkins 내부 도커 설치

jenkins container 내부에 다음 명령어를 통해 접속합니다.

sudo docker exec -i -t jenkins bash

jenkins container 내부에 도커를 설치합니다.

curl -fsSL https://get.docker.com/ | sh

5. 젠킨스 서버 접속

자신의 서버ip에 30000 포트로 접속을 해줍니다. (ex) http://15.123.43.212:30000

Administrator password를 다음 명령어를 통해 확인하고 입력해준후 Continue를 클릭합니다.

docker logs [컨테이너 id]
(ex) docker logs jenkins

6. jenkins 기본 플러그인 설치

젠킨스의 기본 플러그인 설치를 진행합니다. 설치가 진행완료된 후 계정정보를 입력하고 젠킨스 설치를 완료합니다.

7. Publish Over SSH 설치

Jenkins관리를 클릭하고 플러그인 관리를 들어갑니다.

설치가능 목록을 누르고 필터창에 ssh를 검색합니다. 그리고 Publish Over SSH 플러그인을 설치합니다.

설치가 완료된 후 Jenkins 관리 > 시스템 설정 으로 들어가서 Publish over SSH에 ssh로 배포할 곳의 서버 정보를 입력해줍니다. 추가 버튼과 고급 버튼을 클릭해줍니다.

다음은 예시로 입력한 내용입니다. Key에는 저는 aws로 접속하기 위해 발행받은 .pem파일의 내용을 cat 명령어를 통해 확인하고 그 내용을 적어준 예시입니다. 

입력을 완료하고 Test Configuration 버튼을 클릭해서 success가 되는지 확인합니다. 그리고 저장 버튼을 클릭합니다.

8. 메이븐(Maven) 설정

젠킨스 설정 > Global Tool Configuration 으로 이동합니다. 메이븐을 다음과 같이 설정해줍니다.

9. 프로젝트 추가

새로운아이템 추가 버튼을 눌러서 다음 화면에 진입합니다. 프로젝트의 이름을 넣고, FreeStyle project를 선택해주고 확인을 눌러줍니다.

소스 코드 관리탭으로와서 자신의 깃허브 repository 주소를 입력해줍니다. 배포할 브랜치는 master로 지정하겠습니다.

Credential을 만들어야하는데, 위의 화면에서 Credentials에서 Add를 누르면 다음화면이 나타납니다. 자신의 깃허브 아이디와 비밀번호를 입력합니다.

다음으로는 Build 탭으로 내려오겠습니다. Add build step을 클릭하고 Invoke top-level Maven targets를 선택하겠습니다. 

Maven clean과 install을 설정을 해줍니다.

이제 build 후 조치를 선택하겠습니다. 여기에서는 sh 파일을 작성해서 기존의 docker container를 삭제하고 새로 올라와야할 컨테이너를 올리는 작업을 진행합니다.

SSH Server에서는 Publish Over SSH에서 지정한 자신의 SSH Server를 선택해줍니다. 저는 기존에 2weeks라는 ssh를 만들었고 이 설정을 지정하겠습니다. 그리고 저희 기존 프로젝트는 /home/ubuntu/nuguya2 라는 곳에 미리 git clone을 했었는데 이 곳에 target에 jar 파일을 배포하기 위해 remote directory를 nuguya2/target으로 지정하였습니다. 그리고 미리 생성해놓은 sh 파일을 실행한도록 exec command에 명령어를 지정합니다.

다음은 nuguya.sh 파일 예시입니다. nuguya라는 기존에 만들어둔 컨테이너를 삭제하고, 새로 배포한 container를 실행하는 예시입니다.

sudo docker rm -f nuguya
sudo docker run -d -p 2000:8080 --name nuguya --restart=always -e spring.profiles.active=prod -v /home/ubuntu/data/nuguya:/home/ubuntu/data/nuguya nuguya
docker ps

프로젝트 설정이 완료되었고 이제 build now 버튼을 눌러봅니다.

jar 파일이 자신의 프로젝트 /target에 안들어올수가있는데 저는 chmod로 777권한을 주었더니 배포가 정상적으로 되었습니다. sh파일도 권한 문제로 실행이 되지 않아서 동일하게 777 권한을 주었습니다. 빌드가 정상적으로되었다면 다음 사진과 같이 나올것입니다.

 

이제 실행되고 있는 docker 상태를 확인해보겠습니다.

sudo docker ps

nuguya라는 저의 웹어플리케이션이 컨테이너로 올라온것을 확인할 수 있습니다.