들어가며
프로젝트의 기능을 구현한 후 aws-ec2를 이용해 인스턴스를 생성하여 배포를 진행하였다.
하지만 매번 변경 사항이 생길 때 마다 인스턴스에 접속해서 빌드하고 배포하는 과정을 수행한다는 일이 번거롭다는 생각이 들어 CI/CD에 대해서 학습했다.
도구
CI/CD를 구현하는 도구는 Jenkins를 사용했다.
해당 툴을 사용한 이유는 다음과 같다.
- 무료로 사용 가능하다
- Jenkins는 전 세계적으로 많은 사용자와 개발자들이 사용하고 있기에 자료가 많다.
이러한 이유로 Travis가 아닌 Jenkins를 이용했다. 이 밖에도 Jenkins의 장점은 많이 있으므로 공식 문서를 읽어보거나 사용해 보기를 권장한다.
구현
1.
먼저 aws-ec2에 생성한 인스턴스에 접속하여 다음의 과정을 통해 Jenkins를 설치한다. 나의 경우 linux2를 AMI로 이용했다.
sudo yum update -y
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins java-1.8.0-openjdk-devel -y
sudo systemctl daemon-reload
sudo systemctl start jenkins
sudo systemctl enable jenkins
2. 기본적으로 Jenkins 서버는 8080 포트에 열리므로 인스턴스의 ip의 8080포트에 접속한다. 이 때 인스턴스의 보안그룹에서 8080포트 접속을 허용해야 한다. 다음의 명령어를 통해 설정을 바꿔 포트를 변경할 수 있다.
sudo vim /etc/sysconfig/jenkins
접속하면 위의 화면이 보일것이다. 처음 접속할 때 초기 비밀번호가 필요한데 다음의 명령어를 통해 확인 가능하다.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
3. 다음의 화면에서 suggested plugin을 설치한다.
4. 이후 좌측의 New Item을 선택한 뒤 Pipeline을 선택 해 item을 만든다
5. 이후 General에서 Github Project를 선택한 후 리포지토리의 url을 입력한다.
6. Build Triggers는 다음과 같이 체크한다.
7. 이후 pipeline에서는 다음과 같이 선택한다.
위와 마찬가지로 Repository URL을 입력하고 해당 리포지토리가 비공개 리포지토리이면 Credentials를 입력한다. username에 깃허브의 아이디, password에 깃허브의 비밀번호를 입력하면 된다.
8. 이후 Script Path와 branch를 정해준다.
나의 경우 master 브랜치에 push가 되면 자동으로 빌드가 되도록 설정했다. 또한 리포지토리의 root 디렉토리에 Jenkinsfile이라는 이름의 file을 만들어 등록했다. Script Path에는 pipeline의 코드가 들어있는 경로와 파일명을 입력하면 된다.
9. 이후 github에 푸시가 올라오면 자동으로 jenkins에 알릴 수 있도록 webhook을 설정한다.
해당 프로젝트의 setting에서 webhook에 들어가 Add webhook을 선택한다.
webhook은 다음과 같이 설정하면 된다. 이렇게 되면 push가 될 때마다 jenkins 서버에서 빌드가 시작된다.
10. 위에서 등록한 script path에 해당되는 경로와 이름으로 알맞은 경로에 알맞은 파일명을 지어 파일을 만든다. 언어는 groovy이며 확장자 없이 만들면 된다.
작성 방식은 다음의 링크에서 참고할 수 있다. https://www.jenkins.io/doc/book/pipeline/
나의 경우 다음과 같이 빌드, 배포 단계를 거치도록 작성했다. 나의 경우 배포 서버와 jenkins 서버를 같은 인스턴스에서 실행하도록 하였다.
11. build 스크립트를 작성한다.
나의 경우 다음과 같이 작성했다.
간단히 스크립트를 설명하자면 다음의 순서대로 진행된다.
1. 현재 내가 배포할 프로젝트가 구동중인 PID를 확인해 종료시킨다.
2. nohup 명령어를 통해 터미널이 종료되더라도 서버가 계속 켜질 수 있도록 한다.
3. 2>&1 을 통해 실행 log는 홈 경로의 nohup.out 파일에서 확인 가능하다.
4. 맨 뒤의 & 명령어는 실행 파일이 백그라운드에서 실행 가능하게 하며 ctrl + c를 눌러 해당 터미널에서 다른 명령어를 입력해도 서버가 꺼지지 않는다.
12. 마지막으로 pipeline의 스크립트는 ec2-user가 아닌 jenkins 사용자가 이용하므로 jenkins 사용자에게 sudo 명령어로 수행 시킬 명령어들의 권한을 넣어준다.
마무리
위와 같은 과정을 거치면 github에 푸시 할 경우 자동으로 build 부터 배포까지 자동으로 된다. 나의 경우 pipeline에 테스트 단계를 거치지 않았는데, build시 자동으로 test가 진행되어 test를 스텝을 따로 추가하지는 않았다. 추 후 이 부분이 어떻게 쓰이는지 공부해볼 생각이다. 또한 위와 같이 배포 script를 작성하면 현재 진행중인 서비스가 몇초정도 중단되었다가 재배포가 되는데, 다음 글에서 nginx를 통해 무중단 배포 하는 방법을 작성해 볼 생각이다.
'프로젝트 > 고민' 카테고리의 다른 글
전략패턴을 이용한 리팩토링 (0) | 2023.03.26 |
---|---|
Nginx를 이용해 무중단 배포하기 (1) | 2023.03.22 |
프로젝트에 테스트 컨테이너 적용하기 (0) | 2023.03.12 |
인덱스 튜닝으로 성능 개선하기 (0) | 2023.03.11 |
낙관적 락을 이용한 성능 개선 with JMeter (0) | 2023.03.10 |