Jenkins+Docker+GitHub+SpringBoot jar 자동배포환경 구성

Posted by Albert 773Day 2Min 49Sec ago [2023-03-09]

환경구성

1. SpringBoot 웹서비스 https://github.com/visionboy/autoDep

(그냥 index.html 파일을 포함한 springboot 프로젝트이다. java 버전은 openjdk11로 설정되었고 Maven 기준으로 빌드함)


2. 서버는 Centos7

3. Docker Containers(Docker이미 사용가능한 환경이라고 시작)

컨테이너1: jenkins 구동용(플러그인:Maven Integration Plugin, Publish Over SSH)

컨테이너2: springboot 웹 서비스 구동용


4. 중간 매체 GitHub 사용


자동배포로직

  1)  개발자 로컬상inteliJ를 GitHub와 연동 후 일부 내용 변경후 commit and push 

  2)  GitHub상 WebHook을 통하여 신규로 push된 항목을 jenkins로 넘김

  3)  Jenkins 상 GitHub으로부터 소스변경내용 전달받아  jenkins내부에서 build하여 신규 springboot jar 파일 생성

  4)  빌드 후 조치: Docker이 설치된 서버에 ssh 통신하여 접속 후 신규 jar서비스 구동로직 구현 

  

1. Spring Boot Sample 프로젝트는 https://github.com/visionboy/autoDep 에 올려놓았으니 다운로드 하여 intelij로 오픈하면 바로 사용가능

Intelij 도 github와 연동된 상황을 기본으로 함 


2. Docker 로 Jenkins 설치 및 구동

[albert@docker ~]$ docker pull jenkins/jenkins:lts

[albert@docker ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins lts f16216f97fcb 4 weeks ago 467MB

[albert@docker ~]$docker run -d -p 8077:8080 -v /var/jenkins_home --name jenkins -u root jenkins/jenkins:jdk11

Jenkins의 기본포트는 8080이다 나는 내부적으로 8080사용중이므로 8077로 컨테이너 구성하였다.

[albert@docker ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2ea353cb8f jenkins/jenkins:lts "/usr/bin/tini -- /u…" 25 hours ago Up 25 hours 50000/tcp, 0.0.0.0:8077->8080/tcp, :::8077->8080/tcp jenkins

3. jenkins 설치

Docker 구동하고 브라우저상 http://localhost:8077로 접속하면 jenkins세팅 화면으로 이동된다. 비밀번호를 입력하라고 하는데

해당 비밀번호는 아래 명령을 사용하면 비번이 뜨는데 이것을 Administrator Password에 입력하고 Continue 버튼 클릭 및 Install sugested plugins 버튼을 클릭하여 계속 진행하여 설치 완료한다.

[albert@docker ~]$cat /var/lib/jenkins/secrets/initialAdminPassword



Springboot 구동 Docker image 생성

Dockerfile을 

FROM openjdk:11
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

생성하고 (최초에는 Dockerfile위치에 수동으로 배포한 app.jar 파일을 넣어주고 이미지 생성 및 서비스 구동)

[albert@docker ~]$ docker build -t albert:springboot .
[albert@docker ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
albert springboot 4f76c9cc9339 22 hours ago 672MB
[albert@docker ~]$ docker run -it -p 7777:7777 --name springboot albert:springboot
[albert@docker ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d57426027ee1 albert:springboot "java -jar /app.jar" 2 hours ago Up 2 hours 0.0.0.0:7777->7777/tcp, :::7777->7777/tcp springboot

jenkins 플러그인 설치(maven,ssh)

maven플러그인설치(springboot프로젝트 빌드시 사용)

Dashboard=>Jenkins관리=> 플러그인 관리

maven integration plugin 을 검색하여 설치


Dashboard=>Jenkins관리=> Global Tool Configuration


Dashboard=>Jenkins관리=> 플러그인 관리

우선 Centos 서버상 openssh 설치하여 주어야한다.

[albert@docker ~]$ yum install openssh-server openssh-clients openssh-askpass

Publish Over SSH 설치는 위 maven 설치와 동일하게 설치하면 되니 건너뜀

Jenkins관리=>시스템관리에 접속하여 쭉 스크롤 내리면 SSH Servers 항목 있는데

Name: ssh 연결 항목명(임의로 원하는걸로 적으면 됨)

Hostname: ssh 접근할 서버명 혹은 ip 적으면됨

Username: 접속 사용자 계정

고급버튼 클릭후 Use password authentication, or use a different key 체크 후 접속 사용자 계정 비밀번호 입력

정보 입력완료후에는 Test Configuration 버튼을 통하여 접속성공여부 확인 가능 

접속성공하면 저장하면 됨


GitHub설정

1. webhook(주의점Playload URL은 localhost같은 경로는 먹히지않는다 로컬 테스트용으로 구성시에는 ngrok같은 포워딩방식으로 jenkins 경로 만든후 등록해주면 된다.)

ngrok 설치 및 사용법은 https://visionboy.me/812  에서 확인가능

2. tocken 생성

1. github 사이트 오른쪽 상단 사용자 아이콘 클릭=> Settings=> 왼쪽메뉴 Personal access tockens => Tockens classic 

Generate new tocken 버튼 클릭하여 신규 토큰 생성하면 토큰 값이 생성된다 이걸 잘보관하고 

2. jenkins 화면으로 다시접속

Dashboard=>jenkins관리=>Manage Credentials => Stores scoped to Jenkins 항목중 (global)버튼 클릭=> 

상단 Add Credentials 버튼 클릭하여 항목 추가

Username: githubid

Password: 위에서 github에서생성한 토큰 값

Id: Credential id로서 보기쉽게 설정


Jenkins상 item 생성 (Dashboard=> +새로운 Item 버튼 클릭 )

item name은 원하는대로 적으시고 하단에 Maven project 선택후 ok 클릭


deploy.sh bash shell을 통하여 빌드후 신규 생성된 jar 파일을 springboot 컨테이너에 올린다.

docker cp jenkins:/var/jenkins_home/workspace/test1/target/autoDep-0.0.1-SNAPSHOT.jar ./app.jar
docker cp ./app.jar springboot:/
docker restart springboot

내용은 아주 간단하다 

1. jenkins docker container에 jenkins가 빌드하여 생성된 jar파일을 서버 로컬로 복사하고

2. 복사된 app.jar 파일을 다시 springboot docker  container로 넣어주고 

3. springboot container restart 시켜줌


Intelij에서 내용 변경후 push하면 정상적으로 배포까지 잘되는걸 확인 할 수 있다.





LIST

Copyright © 2014 visionboy.me All Right Reserved.