ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jenkins 활용해서 Spring boot 서버 배포하기 - 3
    카테고리 없음 2021. 12. 14. 04:22

    저번 포스팅은 Jekins를 활용해 Spring boot 프로젝트빌드하는 것 까지 해보았다.

     

    이전 포스팅: https://zin-oh.tistory.com/53

     

    Jenkins 활용해서 Spring boot 서버 배포하기 - 2

    지난 1편에서 Jenkins Dashboard까지 띄우는 작업을 했다. 이전 포스팅: https://zin-oh.tistory.com/52 Jenkins 활용해서 Spring boot 서버 배포하기 - 1 하반기 취준이 끝났다.. 결과는 비록 좋진 않았지만 이번..

    zin-oh.tistory.com

     

    이번 포스팅에서는 Jenkins를 통해 SSH 방식으로 다른 서버에 파일을 전송하는 과정과 그 서버에서 프로젝트 서버를

    구동하는 것까지 할 것이다.

     

     

    1. SSH 방식 사전 작업

     

    1) SSH에 필요한 플러그인 설치

     

    Jenkins 관리 -> 플러그인 관리 클릭

    Jenkins 화면

    '플러그인 관리' 에 들어가 SSH 전송에 필요한 publish over ssh를 다운로드 한다.

     

    설치 가능 부분에서 검색한 뒤 Download now and install after restart 를 누른다.

     

    설치가 완료되면 재시작 버튼을 통해 Jenkins를 재 구동한다.

     

     

     

    2) SSH 연결 확인

     

    SSH 연결에 필요한 플러그인을 다운 받았으면, SSH 연결을 통해서 다른 서버와 통신이 되는지 확인을 하는 과정이 필요하다.

     

    Jenkins 관리 -> 시스템 설정 클릭

    Jenkins 관리 화면

     

    시스템 설정의 제일 하단에 Publish over SSH가 보인다.

    SSH Servers에 추가를 클릭!!

     

    SSH 정보

    우리는 Key 인증 방식을 EC2에서 Private Key를 받은 것을 이용해 인증 할것이다.

     

    pem 파일을 텍스트 편집기로 연다.

     

    EC2를 터미널로 접속할 때 들고있던 .pem 파일을 텍스트 편집기로 연다.

     

    그러면 ----BEGIN RSA PRIVATE KEY----  문구와 함께 암호 비슷한 것이 뜬 것을 복사해 Key에 대입한다.

     

     

    SSH Server에 들어가는 정보.

     

    • Name: 본인 프로젝트 서버 명. ex) SpringBoot_Server
    • Hostname: 서버 ip 주소. ex) 124.253.213.12 등
    • Username: 서버 username ( 우리는 EC2 ubuntu를 선택했기 때문에 ubuntu로 했다.

     

    입력한 뒤 Test Configuration을 클릭하면 -> 옆의 Success 문구가 보인다.

     

     

    시스템 설정을 저장한 뒤 다음 순서로 간다.

     

    2. SSH 이용해 파일 전송하기

     

    초기 본인이 작성한 Jenkins 구성 파일을 다시 들어간다.

     

    빌드 후 조치 탭에서 추가 버튼에 다음과 같이 SSH를 통한 전송(Send build artifacts over SSH) 부분을 클릭한다.

    빌드 후 조치

     

    누른 뒤 다음과 같은 화면이 나온다.

     

    빌드된 jar파일 전송

     

    Transfer Set에서 입력할 값들은 다음과 같다.

     

    • Source files: 보낼 소스 파일 (.jar파일 전송)
    • Remove prefix: 지우고 싶은 소스파일 앞의 디렉토리 부분
    • Exec command: 전송할 서버에서 실행할 명령어

     

     

    현재 그림에서 입력된 것은 글쓴이의 파일구조에서 적용되는 것입니다.

     

    글쓴이의 현재 스프링 Project 구조상 back/build/libs 경로에 .jar파일이 생성된다. (이 점의 유의해서 작성)

     

     

    주의할 점!!

    command를 잘못 입력 한다면, SSH로 파일 전송이 실패할 수 있다. 차근차근 한 줄씩 해보자.

     

    Dockerfile 전송 및 명령어

     

    Dockerfile이 위치한 프로젝트 디렉토리를 입력해주었다. (글쓴이의 프로젝트의 경우 back 디렉토리에 존재.)

     

    Exec command

    sudo docker build -t duder
    sudo docker run -d -p 8080:8080 duder

     

    -t 뒤의 duder 의 경우 본인이 지정하고자하는 tag를 입력해준다. ex) spring_project

     

     

    입력한 뒤 저장 버튼 클릭해서 해당 구성파일 저장.

     

     

    현재 스프링 프로젝트에 Dockerfile이 없다면 다음과 같이 작성하여 넣어준다.  (경로 확인!! 중요!!)

     

     

    Dockerfile

    FROM openjdk:8
    VOLUME /tmp
    EXPOSE 8080
    ARG JAR_FILE=./duder.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

    JAR_FILE = 내 jar 파일이 있는 경로이다.

     

    본인 프로젝트에 맞게 Dockerfile을 작성하길 바란다. (현재 글쓴이의 프로젝트 JAVA 버전은 8 임)

     

     

    저장을 한 뒤 다시 Build now 클릭.

     

     

    Console 확인

     

    다음과 같이 console output을 확인한다.

     

    console ouput

    .jar 파일 (snapshot 포함) 2개 + Dockerfile 1개를 전송했다.

     

     

    파일 확인

     

    Jenkins 서버 말고 Spring boot Server로 들어가 해당 파일들이 잘 왔는지 확인해준다.

     

     

    jar파일 및 Dockerfile

     

    SSH 전송이 잘 되었다면 해당 jar파일 두개DockerfileSpring 서버에 있을 것이다.

     

     

    hello.txtSSH 작성할 때 command 내 echo "hello world" > hello.txt를 통해 생성된 것이다.

     

     

    Docker 명령어 실행 확인

     

    도커 구동 확인

     

    Container가 잘 구동되어 있다. Spring boot Server의 Public ip 로 들어가게 되면,

     

    다음과 같이 반가운 에러페이지가 반기고 있다.

    반가운 에러 페이지

     

     

    잠깐 여기서 추가할 사항!!

     

    위까지 잘 마쳤다면 서버가 Docker Container로 잘 실행된 것이다.

     

    하지만 이미 구동된 Container다시 구동하면 에러가 나기 때문에 삭제하는 과정을 추가하고 구동시켜야 한다. 

     

    docker 명령어 추가

    따라서 다음과 같은 코드추가해준다.

     

    sudo docker stop $(sudo docker ps -a -q)
    sudo docker rm $(sudo docker ps -a -q)

     

    모든 docker container를 stop 과 해당 컨테이너 삭제!!

     

    미리 넣지 않은 이유는 stop할 container가 없다면 위 명령어가 작동하지 않기 때문이다. (최소 1개의 인자가 필요하다고 에러남)

     

    따라서 다음 변경사항을 적용한 뒤 Build now를 클릭해주면 된다.

     

     

    잘 구동되었다면 이제 마지막으로 Git hook이 잘 적용되는지 확인하고 마무리하면 될 것 같다.

     

    여기까지 소마에서 했던 작업을 다시 해보면서 블로그로 정리해 보았다.

     

    다음에는 Jenkins pipeline을 활용해서 구현해보려고 한다. 

     

    이번 Jenkins 블로그를 쓰면서 중간중간 부수적으로 많은 작업들을 블로그에 최대한 담아내 오류없이 다른 사람들이 쓸 수 있게

    하려고 노력했다. (글쓴이는 오류가 났을 때 왜 오류가 났는지 디버깅 하는 과정에서 많이 배웠던거 같다.)

     

    빌드를 여러번 실패해도 포기하지 마시길... (글쓴이는 최소 60번 실패했다...)

     

    pwd, ls 등 중간중간 콘솔 확인용 스크립트를 찍어가며 디버깅 하시길 바랍니다~~!!

     

     

    댓글

Designed by Tistory.