본문 바로가기
DevOps

jenkins EC2 서버와 외부 EC2 서버 연결

by 규난 2022. 11. 6.
728x90

EC2 프리티어를 사용시 메모리 부족으로 Spring boot 배포 서버로 사용하고 있는 EC2에 jenkins를 설치하여 같이 쓸 수 없는 상황이었다. 그래서 jenkins 전용 EC2 프리티어 서버를 하나더 생성 후 jenkins EC2 -> Spring boot EC2를 연결하는 작업을 해줘야만 했다.

Spring boot EC2 서버에 접근하기 위해서 SSH 키 하나를 더 생성해야 한다.

$ssh-keygen -t rsa -C "키명칭" -m PEM -P "" -f /var/lib/jenkins/.ssh/[키명칭]

# jenkins EC2 서버에서 생성한 SSH publish key를 복사 후 
$ sudo cat /var/lib/jenkins/.ssh/[키명칭].pub

# Spring boot EC2 서버에 붙여넣기
$ vi .ssh/authorized_keys

위의 작업이 끝났다면 Jenkins 관리 -> 플러그인 관리 -> Available plugins에서 Publish Over SSH를 설치하고 jenkins를 재시작 한다. 설치 후 Jenkins 관리 -> 시스템 설정 -> Publish Over SSH 탭에서 설정을 시작한다.

Path to Key는 아까 위에서 생성한 SSH의 private key의 경로를 써주고 Key는 private Key를 복사한 후 붙여넣어준다.

Name은 접속한 SSH sever의 이름을 적어주고 Hostname은 접속할 서버의 주소 Username은 접속할 서버의 유저명을 넣어주면 된다.

입력을 한 후 Test Configuration을 통해 정상적으로 연결이 되었는지 확인 후 저장을 하면 된다.

 

위 설정이 전부 끝났으면 jenkins item을 생성해서 실제 깃허브 레포지토리에서 프로젝트를 가져와서 빌드를 해보도록  하겠다.

Dashboard -> 새로운 Item -> Freestyle project로 들어가준다. 

 

일단 제일 먼저 General 탭에서 GitHub project를 선택 후 project url을 적어준다. 

그 다음 소스 코드 관리 탭에서 실제 연결할 깃허브 레포지토리의 url을 입력 후 아까 생성해주었던 credential을 선택하여 준다.

이 부분 부터가 중요하다.

Build Step 탭에서 Add Build step -> Execute shell을 선택 후 

./gradlew clean build를 입력하여 레포지토리에서 프로젝트를 가져온 후 빌드를 해줄 수 있게 한다.

끝에 -x test를 적은 이유는 빌드 시 테스트 코드 검증이 전부 통과해야 다음 스탭으로 넘어 갈 수 있는데 현재 테스트 코드 몇개가 통과가 안되어서 빌드시 테스트 코드 검증하는 부분을 제외 시켰다. 테스트 코드를 수정 후 다시 지워야 한다.

빌드가 완료 되었으면 jenkins EC2 서버에 올려 놓은 dev-properties(mysql, redis, s3키 등의 정보를 모아둔 properties)를 jenkins가 프로젝트 빌드 후 생긴 프로젝트 resources 경로에 복사 후 도커 이미지를 만든다. 이렇게 하는 이유는 깃허브 레포지토리에 민감 정보인 properties를 올려두지 않아서 도커 이미지를 만들어 Spring boot EC2에서 실행하면 boot 실행시 에러가 나기 때문에 꼭 복사 후 도커 이미지를 만들어 주어야 한다. 이렇게 하는 방법 외에도 여러가지 방법이 있을거 같으니 각자 편한 방법대로 하면 될 거 같다.

이 포스트에서는 EC2 서버에 도커 설치와 도커 허브에 대한 내용은 다루지 않겠다.

위에서 빌드 성공 후 프로젝트를 도커 이미지로 만들어 허브에 푸시가 되었다면 그 다음 Spring boot EC2 서버와 연결하여 도커 허브에 있는 이미지를 pull 받아 실행하는 배포 작업을 해야하는데 그 부분을 빌드 환경 탭에서 해야한다.

빌드 환경에서 Send files or excute commands over SSH after the build runs를 선택 후 아까 jenkins 관리 -> 시스템 설정 -> publish over ssh에서 설정한 SSH Server를 선택 후 Exec command에 배포 서버에서 어떤 명령어를 실행할 것인지 작성해주면 된다.

설정이 다 끝났으면 프로젝트 메인 화면에서 지금 빌드를 누르면 깃허브 레포지토리의 프로젝트를 가져와 빌드를 실행하는걸 볼 수 있다.

하지만 여기서 문제가 발생하였는데 jenkins가 메모리를 많이 사용해서 EC2 서버를 분리하였는데도 메모리 부족으로 인해서 빌드가 엄청 오래걸리거나 EC2 서버가 다운되는 일이 발생하였다. 구글링을 해본 결과 EC2 프리티어에서 jenkins를 사용하려면 메모리 스왑을 통해 

RAM이 부족할 경우 HDD의 일정 공간을 마치 RAM 처럼 사용 할 수 있게 끔 해주어야 한다. 메모리 스왑 방법은 EC2 프리티어 메모리 스왑이라고 검색을 하면 많이 나오는 부분이니 생략하겠다. 

메모리 스왑후 다시 빌드를 하니 성공적으로 빌드 후 배포까지 잘 되는것을 볼 수 있었다. 빌드 정보는 로그가 너무 길어서 생략하겠다. 사진의 왼쪽 밑을 보면 #숫자로 해서 초록색으로 체크된 부분이 빌드가 잘 성공했다는 뜻이다.

728x90