본문 바로가기

개발공부/DevOps

Github + Jenkins 연동

회사에서 Github를 사용하고 있어서 Github과 Jenkins를 연동하여 ec에 배포하는 방법을 찾아 보았다.

Github + Jenkins 연동과 Jenkins Build ssh 배포하기

 

 

 

 

다음 그림과 같은 형식 CI/CD를 구현

 

 

1. Jenkins 설치

OS가 ubuntu인 ec2에 jenkins를 설치.

jenkins는 java가 설치되어 있어야 하기 때문에 java를 설치하겠습니다.

 

다음과 같이 openjdk-8-jdk를 설치합니다.

1
2
3
sudo add-apt-repository ppa:webupd8team/java
sudo apt update
sudo apt-get install openjdk-8-jdk

 

java -version을 통해 java가 잘 설치되었는지 확인합니다.

 

 

maven으로 build할 예정이기 때문에 sudo apt-get install maven를 통해서 maven을 설치합니다.

mvn -vsertion 또는 mvn -v를 통해 버전을 확인할 수 있습니다.

 

다음은 jenkins를 설치하겠습니다. 아래 명령어를 입력하여 jenkins를 설치합니다.

1
2
3
4
wget --- https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list
sudo apt-get update
sudo apt-get install jenkins
 

 

설치가 된 후 systemctl status jenkins를 통해 jenkins가 설치가 되고 작동하고 있는 모습을 볼 수 있습니다.

 

이렇게 작동 중인 jenkins는 defult로 8080포트를 사용하고 있습니다.

EC2의 퍼블릭 ip를 통해 접근할 때 ip:8080형식으로 접속하면 다음과 같은 화면이 출력됩니다.

 

jenkins는 /var/lib/jenkins/secrets/initialAdminPassword에 Administrator password를 저장합니다.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword 명령어를 통해 password를 얻을 수 있습니다.

 

passwrod를 다음과 같이 입력하고 Continue로 넘어갑니다.

 

다음과 같은 화면이 나오는데 추천 플러그인 설치를 선택합니다.

 

설치가 완료될 때까지 기다립니다.

 

다음 접속부터 사용할 관리자 계정 정보를 등록합니다.

 

 

여기까지 왔으면 jenkins 설치가 완료되었으며 다음과 같은 jenkins 화면을 볼 수 있습니다.

 

maven을 통해서 build할 예정이기 때문에 추가 설정을 해야 합니다.

다음과 같이 Global Tool Configuraion으로 갑니다.

 

jdk와 maven을 설정했습니다. 각각 이름과 경로를 입력하고 저장합니다.

2. Jenkins + Github 연동

jenkins가 설치된 ec2에서 ssh-keygen을 통해서 key를 생성하겠습니다.

Enter를 눌러 넘어가면 다음과 같이 key가 만들어집니다. 이때 id_rsa, id_rsa.pub이 생성됩니다.

 

cat /home/ubuntu/.ssh/id_rsa를 통해 출력되는 key를 복사합니다.

 

그림 같은 순서대로 접속합니다.

 

Add Credentials를 통해 key를 생성합니다.

 

다음과 같이 입력하여 등록합니다. 입력되는 Key는 이전에 복사한 ssh key입니다.

 

이제 연동할 Github repository를 설정합니다.

spring boot를 공부할 때 생성한 repository를 사용하겠습니다.

다음 그림과 같이 접속하여 deploy key를 생성합니다.

 

cat /home/ubuntu/.ssh/id_rsa.pub 명령어를 통해 이전에 생성한 id_ras.pub을 복사하여 key에 붙여 넣습니다.

 

그림과 같이 접속하여 Add webhook을 통해 webhook을 생성합니다.

 

payload URL에는 http://jenkins URL:8080/github-webhook/ 형식으로 입력합니다.

이렇게까지 하면 Github repository에서의 설정이 끝납니다.

 

이제 Jenkins에서 새로운 Item을 통해 item을 등록합니다.

 

Enter an item name에 원하는 item 이름을 입력하고, Freestyle project를 선택합니다.

 

소스 코드 관리에서 Git을 선택합니다.

Repository URL에  git@github.com:Github사용자명/프로젝트명.git 형식으로 입력하고

Credentials는 아까 생성한 key를 선택합니다.

 

GitHub hook trigger for GITScm polling을 선택해야 github에 push 이벤트가 오면 자동으로 실행합니다.

 

Build에서 Invoke top-level Maven targets를 선택합니다.

Maven Version에는 Global Tool Configuraion에서 설정한 maven을 선택합니다.

Goals에 clean package를 입력하여 저장합니다.

 

이제 git에서 push를 하면 jenkins에서 자동으로 Build가 됩니다.

Build Now를 통해 수동으로 Build를 할 수 있습니다.

 

3.  EC2 ssh 연동 & 배포

build를 한 후에 다른 ec2에 ssh로 연동을 통해서 배포를 하겠습니다.

먼저 이전에 jenkins가 설치되어 있는 ec2에서 cat /home/ubuntu/.ssh/id_rsa.pub를 통해 id_rsa.pub을 복사합니다.

 

복사한 값을 배포할 ec2의 authorized_keys에 추가합니다.

authorized_keys는 ubuntu의 경우 /home/ubuntu/.ssh/authorized_keys에 기본적으로 만들어져 있습니다.

vim /home/ubuntu/.ssh/authorized_keys 명령어에서 알 수 있듯이 vim 에디터로 붙여 넣습니다.

 

  • 1번 값은 ec2 접속할 때 사용하는 .pem 파일의 인증 값입니다. 해당 값을 지우면 pem 혹은 ppk를 통해서 접속할 수 없습니다.
  • 2번 값은 id_rsa.pub의 값입니다. 해당 값을 추가했기 때문에 이후에 jenkins에서 자신의 ssh key를 이용하여 접속할 수 있습니다.

 

mkdir /home/ubuntu/springboot를 통해서 빌드 된 jar 파일을 저장할 directory를 만들었습니다.

 

배포하고 jar 파일을 restart 하기 위한 shell script 파일을  작성했습니다.

 vim /home/ubuntu/springboot/restart.sh

 

이제 jenkins에서 ssh를 통해 배포하겠습니다.

jenkins 관리 -> 플러그인 관리에 들어갑니다.

 

설치가능에서 필터에 Publish Over SSH를 검색하여 설치합니다.

 

이후 jenkins 관리 -> 시스템 설정에 들어갑니다.

 

Publish Over SSH 항목을 설정합니다.

key에는 id_rsa의 값을 붙여 넣습니다.

HostName에는 배포할 서버의 private ip를 입력합니다.

Username은 ubuntu로 진행하며, Remote Directory에는 위에서 생성한 directory의 경로를 입력하고 저장합니다.

 

이전에 만든 프로젝트를 수정하겠습니다.

구성을 통해 설정을 변경할 수 있습니다.

 

빌드 후 조치에서 Send build artifacts over SSH를 선택합니다.

  • Name : 위에서 설정한 Publish Over SSH에서 SSH Server 항목의 Name과 같은 것을 선택합니다.
  • Source files : 서버에 업로드할 파일을 선택하는 곳입니다. 저의 경우 /var/lib/jenkins/workspace/SpringBootProject가 해당 item의 default 경로입니다.
  • Remove prefix : 파일 전송 시 source file에서 제거되는 prefix입니다. 저의 경우 target을 입력했기 때문에 target이 제거됩니다.
  • Remote directory : 위에서 설정한 Publish Over SSH에서 입력한 remote directory 이후의 경로입니다.
  • Exec Commend : 전송이 완료된 후 실행되는 command입니다. restart.sh를 nohub으로 실행합니다.

 

위 설정을 저장한 후 Build Now를 통해 item을 Build 합니다.

 

배포 서버용 ec2에서 다음과 같이 jar 파일이 저장됩니다.

 

이제 만들었던 springboot가 정상적으로 작동합니다.

 

여기까지 jenkins + github을 이용하여 CI/CD를 구성해 보았습니다.

 


참고자료 링크들

https://velog.io/@haeny01/AWS-Jenkins를-활용한-Docker-x-SpringBoot-CICD-구축#4-스프링부트-프로젝트-확인

https://velog.io/@dlsrjsdl6505/혼자-하는-Spring-프로젝트-10-CDCD-with-Jenkins-Docker-AWS#ec2-jenkins-서버에-jenkins-설치하기-jenkins-ec2-서버

https://suyeon96.tistory.com/36

https://dante6327.tistory.com/15

https://neo-blog.tistory.com/42

https://devlog-wjdrbs96.tistory.com/300

https://suvera.tistory.com/75

https://minddong.tistory.com/70

https://ongamedev.tistory.com/475

https://m.blog.naver.com/cutesboy3/221643742358

https://suyeon96.tistory.com/36

https://medium.com/@nuatmochoi/amazon-ecs-ci-cd-best-practices-using-jenkins-and-aws-codepipeline-d97eec11ff6

https://ongamedev.tistory.com/475

https://velog.io/@showui96/DevOps-칸반보드-인프라-개선기-3탄

https://more-learn.tistory.com/