들어가다
프로젝트 기능을 구현한 후 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. 이후 파이프라인에서는 다음과 같이 선택한다.
위와 같이 Repository URL을 입력하고 해당 리포지토리가 개인 리포지토리인 경우 Credentials를 입력합니다.
username에 FitHub ID, password에 FitHub 비밀번호를 입력합니다.
8. 그런 다음 Script Path와 branch를 결정합니다.
내 경우에는 master 브랜치에 push가되면 자동으로 빌드가되도록 설정했습니다.
또한 리포지토리의 루트 디렉토리에 Jenkinsfile이라는 파일을 만들고 등록했습니다.
Script Path에는, pipeline의 코드를 포함한 패스와 파일명을 입력하면 된다.
9. 그런 다음 github에 푸시가 올라가면 자동으로 jenkins에 알리도록 webhook을 설정합니다.
해당 프로젝트 설정에서 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을 통해 실행 로그는 홈 경로의 nohup.out 파일에서 확인할 수 있습니다.
4. 마지막 & 명령은 실행 파일을 백그라운드에서 실행 가능하게 하고, ctrl + c 를 눌러 그 단말에서 다른 명령을 입력해도 서버가 오프가 되지 않는다.
12. 마지막으로 pipeline 스크립트는 ec2-user가 아닌 jenkins 사용자가 사용하므로 jenkins 사용자에게 sudo 명령으로 실행할 명령의 권한을 넣습니다.
마무리
위와 같은 과정을 거치면 github에 푸시하는 경우 자동으로 build에서 배포까지 자동으로 된다.
제 경우에는 파이프 라인에 테스트 단계를 거치지 않았지만 빌드시 자동으로 테스트가 수행되어 테스트를 별도로 추가하지 않았습니다.
가을 후 이 부분이 어떻게 사용되는지를 공부해 볼 생각이다.
또한 위와 같이 배포 스크립트를 작성하면 현재 진행 중인 서비스가 몇 초 정도 중단되어 재배포가 되지만, 다음 기사에서 nginx를 통해 무중단 배포하는 방법을 작성해 보겠습니다.