개발

Nest JS 프로젝트 배포 자동화 하기 (1) - jenkins, webhook

whiporithm 2023. 10. 29. 00:45

 

 

 


(2) 편 - https://whiporithm.tistory.com/104

(3) 편 - https://whiporithm.tistory.com/107

 

서론

 

본격적인 프로젝트를 앞서, 배포 자동화를 한 번 경험해보고 싶었다. 개발로도 벅찰 거 같아 배포에도 신경을 많이 쓰고 싶지 않기에, jenkins와 docker를 활용한 간단한 배포 자동화 구조를 만들어보려 한다. Nest 프로젝트를 배포한다고 했지만, 언어나 프레임워크가 중요한건 아니긴 하다. 어찌되었던, 아래는 내가 생각한 구조이다.

 

 

미숙한 개념으로 만들어 본거라 적당히 참고만..

 

우선 코드를 push 하면 Webhook을 통해 이벤트를 보낸다

 

이후에 빌드서버에서 해당 코드를 가져와 테스팅 및 빌드를 진행하고, 도커 이미지화를 시킨다.

 

이미지 파일은 docker hub 에 올리고, 배포 서버는 그걸 가져와서 배포한다.

 

단, 위처럼 서버 2개를 사용하고 싶지만, 프리티어의 한계로 ec2는 하나만 가능해서.. 빌드서버와 배포서버를 한 서버로 퉁쳐서 진행할 예정이다.

 

환경 구성

빌드 및 배포 서버

- AWS EC2 (Ubuntu 22.04 / t2.micro)

  프리티어로 제공되는 t2.micro는 램이 1기가이므로 메모리 스왑을 미리 설정하고 진행하자. (링크)

  * 도커과정을 진행하다 보면 기본 설정인 8기가로 부족할 수 있음. 최대 30기가까지 무료니, 이 또한 설정하자! (링크)

 

프로젝트

- Nodejs v18

- NestJS v10

 

 


 

젠킨스 설치

우선 ec2에 젠킨스를 설치하겠다. 

 

젠킨스는 java기반으로 동작되는 프로그램으로 우선 자바를 설치해주어야 한다. 아래 명령어로 자바를 설치하고, version 커맨드로 잘 설치되었는지 확인해보자.

 

sudo apt update

sudo apt-get install default-jdk

java --version

 

 

이후에는 젠킨스를 설치해주자. 젠킨스 공식홈페이지를 방문하면 os별로 설치하는 방법을 제공하고 있다. 그 중 Ubuntu 를 선택해서 그대로 터미널창에 붙여넣으면 설치를 손쉽게 할 수 있다. (링크를 방문하면 copy 가 제공되므로 이를 이용하자.)

 

오른쪽에 복사 아이콘이 뜨니 이를 활용하자.

 

https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

 

Linux

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

 

젠킨스 설치가 완료되면 젠킨스를 실행하고, 상태를 확인해보자.

 

service jenkins start // 실행
service jenkins status // 상태 확인

 

실행되고 있다면 running 중이라고 표기된다.

 

ec2가 부팅될시에 자동으로 젠킨스를 시작하고 싶다면 아래 명령어를 입력하자.

 

sudo systemctl stop jenkins.service
sudo systemctl start jenkins.service
sudo systemctl enable jenkins.service

 

이후에 젠킨스를 셋업해주어야 하는데, 로컬에서 접속할 필요가 있다. 따라서 ec2의 인바운드 규칙을 설정해주어 접속을 허용해줘야 한다. 기본적으로 젠킨스는 포트 8080으로 설정되기에 8080에 대한 모든 ip접속을 허용해주자. 

 

단 실제 환경에서는 모든 ip를 허용하면 안될것이다.

 

인바운드 뿐 아니라 ec2 내부에서도 ufw 명령어로 방화벽 설정을 할 수 있다. 

 

sudo ufw allow 8080
sudo ufw allow 22
sudo ufw enable
sudo ufw status

 

status로 확인하면 위와 같은 내용이 나온다.

 

 

 

그리고 '젠킨스서버:8080' 으로 접속하면 아래와 같은 화면을 마주하게 된다. (젠킨스 서버 = ec2)

 

 

처음 접속하면 위와 같은 화면이 뜨는데 인증을 요구한다. 위에 안내된 경로의 파일을 확인해보고 그 값을 붙여넣어 주면된다. 아래와 같이 말이다. 

 

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

파일 내용을 복사해서 붙여넣어주면 된다.

 

 

입력한 후 설치화면이 뜨는데 나는 제안해준대로 설치했다.

 

쭉쭉 설치된다.

 

 

 

설치가 끝나면 계정 정보를 설정해준다.

계정명과 암호는 젠킨스에 접속할때 필요하니 설정하고 잘 기억하자.

이름과 이메일 주소는 크게 중요한지는 잘 모르겠다. 편한값으로 설정하자.

 

설정값을 넣어주자.

 

진행하면 젠킨스 URL을 설정하라고 나오는데,  '젠킨스서버:8080' 으로 설정해주었다.

 

 

이렇게하면 젠킨스 설치가 완료된다!

 

 

GitHub WebHook 설정

다음으로 깃헙 웹 훅을 설정해줄것이다.

이를 활용하기 위해서는 우선적으로 토큰을 발행해주어야 한다.

 

계정 설정에 들어간다음, 좌측 하단에 'developer settings' 에 들어가자. 이후에 'Personal access tokens' 를 들어간다.

 

위와 같이 우 상단에 'Generate new token' 에서 classic 을 발행한다.

 

 

그러면 위와 같이 토큰을 설정하는 페이지가 나오게 되며, Note에는 식별할 수 있도록 정보를 적어주면 된다.

 

 

이 토큰을 활용해 훅 기능을 사용할 것이므로 hook 부분에 체크를 해주고 토큰을 생성해주면 된다.

 

토큰을 생성하게 되면 키값이 나오는데 어딘가에 잘 저장해두자, 다시 확인할 수 없다.

 

 

다음으로 우리가 배포할 깃헙 레포에 들어가자.

 

 

세팅에 들어가고 좌측에 'Webhooks' 라는 메뉴를 누르자.

 

 

이후 'Add webhook' 을 눌러서 추가해주자.

 

그러면 위와 같은 페이지가 뜨는데 값을 넣어 설정해주자.

URL에는 서버주소:포트/github-webhook/ 으로 설정해주고 Content-type은 json으로 설정해준다. (/github-webhook/ 은 필수로 들어가야하니 주의하자.)

 

 

젠킨스 설정

젠킨스에 접속하여 Security 탭에 들어가서, Credentials로 진입하자.

 

위와 같은 페이지가 뜰것이고, (global) 탭을 눌러주자.

 

 

그러면 여기서 Credentials 를 설정할 수 있는데 'Add Credentials' 를 눌러주자.

 

 

Username -> github 사용자 이름

Password -> 발급받은 토큰 값

 

ID는 위와같이 설명되어 있는데 일반적으로는 비워두면 된다.

 

설정이 완료되면 생성하자.

 

 

 

그러면 위와 같이 Credential 이 생성됨을 알 수 있다.

 

젠킨스 프로젝트 설정

사전 작업은 끝났고 이제 push가 발행되면 작업을 수행할 jenkins 프로젝트를 만들어보자. 젠킨스 메인화면으로 이동해서 'Create a job' 을 클릭하자.

 

 

Freestyle project를 눌러주자.

 

 

 

설정 페이지가 나오게 된다. GitHub project임을 명시하고 url을 넣어주자.

 

 

하단에 '소스 코드 관리' 탭에서 Git을 선택하자.

이후에 깃헙 레포 주소를 등록해주고, 방금 생성한 Credentials 도 선택해준다.

 

그리고 어떤 브랜치에 push가 발생하면 동작을 수행할지 정해주어야 하는데 나는 기본적으로 master가 되어 있어서 오류가 났었다. main으로 수정해주거나, 자신이 원하는 브랜치명을 표기해주자.

 

 

다음에는 'Build Steps' 에서 'Excute shell' 을 선택한다. push가 일어나면 해당 스크립트를 실행할 것이다.

 

 

 

우선 위와 같이 임시로 스크립트를 작성해보고 프로젝트를 생성해주자.

 

 

프로젝트 페이지에 와서 '지금 빌드' 를 클릭해보면 초록색 체크버튼으로 정상적으로 수행되었음을 알 수 있다.

 

그러면 push 이벤트에도 잘 동작할까? 코드를 임의로 바꾸고 push 해보자.

 

새롭게 빌드가 수행됨을 확인할 수 있다.

 

위 스크립트는 테스트로 수행한거기에, 스크립트를 수정해주어야 한다. 젠킨스에서 가져온 소스코드를 도커라이즈 해주고 도커헙에 올려주어야 한다. 이는 다음 포스팅에 이어 작성하겠다.

 

 

참고 자료

 

https://velog.io/@wksh229/Jenkins-Node.jsPM2-GitHub%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EB%8F%99%EB%B0%B0%ED%8F%AC-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0

 

Jenkins + Node.js(PM2) + GitHub를 이용한 자동배포 구축하기(1)

아무튼 자동배포를 할 일이 생겼다 거창한 이유는 아니고 그냥 컴퓨터에서 git push, 서버에 연결해서 git pull, pm2 restart를 하면서 쌓인 귀찮음 게이지가 어느 순간 임계점을 넘어버리고 말았다. 아

velog.io

 

https://choseongho93.tistory.com/entry/JenKins-%E2%91%A0-%EC%A0%A0%ED%82%A8%EC%8A%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-nodejs-CICD-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-NestJS

 

[JenKins] ① 젠킨스를 이용해서 node.js CI/CD 자동 배포하는 방법 (NestJS)

JenKins를 이용해서 node.js 배포하는 방법 (NestJS)에 대해 포스팅하겠습니다. ▼ Jenkins를 통해 자동배포 (NodeJS) 시리즈 ▶ ① 젠킨스를 이용해서 node.js CI/CD 자동 배포하는 방법 - 바로가기 ▶ ② 젠킨

nanbuja.com