필요성
예를 들어, 하나의 조직에서 애플리케이션을 개발했는데, 이 애플리케이션의 규모가 상당하다고 생각해보자. 그럼 단순히 개발을 하고, 테스트를 진행하며, 빌드를 한 후, 배포를 하는데만 시간이 꽤나 오래걸리게된다. 게다가 이 애플리케이션은 한 사람이 관리하는 것이 아닌, 몇십명으로 구성된 하나의 조직이 관리한다. 따라서 이 조직은 애플리케이션의 수정본을 하나로 합치는 것부터 배포까지 걸리는 시간이 오래 걸려 긴 배포 주기를 가지게 된다. 이렇게 되면 사용자의 피드백을 빠르게 반영할 수 없을 뿐더러, 배포 과정 속에서 문제가 발생할 가능성도 높다.
구축 목적
- 개발자는 소스 코드를 수정하고, 코드 컨벤션을 준수했는지, 코드가 잘 작동하는지 Pull Request를 보내 자동으로 확인합니다.
- 변경된 소스 코드에 대해 코드 리뷰를 진행합니다.
- 코드 리뷰가 끝나면 PR Merge 작업이 수행됩니다.
- 배포 가능한 소스 코드를 주기적으로 빌드하여 테스트 버전을 생성한 후, 여러 모바일 장치에서 다양한 테스트를 진행합니다.
- 테스트 과정에서 발생한 오류를 수정하여 스토어에 배포합니다.
위와 같은 작업을 한 사람이 수행해도 다양한 Human Error를 야기할 가능성이 높은데, 여러 사람들과 연계하여 매끄럽게 처리하기 위해서는 팀 내부적으로 엄청난 노력이 필요한다.
따라서 이런 작업을 자동화하여 배포 주기 단축 및 불편함을 최소화하는 것이 CI/CD 파이프라인 구축의 목적이다.
지속적인 통합 (CI, Continuous Integration)란?
지속적인 통합, CI(Continuous Integration)란 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경 사항을 중앙 리포지토리에 정기적으로 병합하는 DevOps 소프트웨어 개발 방식이다.
이 단계에서는 버전 관리를 통한 코드 병합, 빌드, 테스트, 오류 보고를 자동화하여 반복적인 작업을 줄이고, 발생한 문제에 대해 빠르게 처리가 가능하여 더 좋은 품질의 소프트웨어를 개발할 수 있다.
지속적인 서비스 제공 (CD,Continuous Delivery)란?
지속적인 서비스 제공, CD(Continuous Delivery)는 반복적인 작업을 자동화한 CI 과정을 거친 소스코드를 레포지토리에 자동으로 반영하는 단계를 의미한다.
이 단계에서 바로 프로덕션 단계로 배포하는 지속적인 배포 단계로 확장이 가능하지만, 따로 테스트 환경에 배포하여 추가적인 여러 사용자 차원에서 테스트를 검증할 수 있는 단계이다.
지속적인 배포 (CD, Continuous Deployment)란?
지속적인 배포, CD(Continuous Deployment)는 CI/CD의 마지막 단계로 모든 테스트를 거친 코드를 레포지토리에 자동으로 반영하는 지속적인 서비스 제공 단계의 확장된 형태이다.
이 단계에서는 애플리케이션을 프로덕션 단계로 자동으로 배포하는 작업을 자동화하여, 개발자가 변경 사항을 적용한 후 짧은 시간 이내에 사용자는 새로운 버전의 애플리케이션을 사용할 수 있다
CI/CD 파이프라인 개선 전략
CI/CD는 단순히 반복 작업의 자동화를 통한 배포 주기의 단축을 위해서 사용할 수 있는 것이 아니다. 이를 어떻게 활용하고, 개선하느냐에 따라 서비스의 품질이 눈에띄게 향상될수도 있다.
- 빠르게 구축할 수 있고 문제가 발생했을 때 참고할 만한 레퍼런스가 많은가?
- 데이터를 유연하게 수집할 수 있는가?
- 설정을 손쉽게 변경할 수 있는가?
- 알림 기능이 있는가?
- 다양한 차트를 사용할 수 있고 관련 생태계가 구축되어 있는가?
- 시스템을 처음 접하는 동료와도 손쉽게 시작할 수 있는가?
Jenkins를 활용하여 CI/CD 구축
- OS : Ubuntu 22.04 LTS
- Web Server : NGINX
- WAS : Tomcat9
- VCS : Git(WebHook 사용)
- 실습 Github Repository : https://github.com/SeolSongWoo/file_extension_block
GitHub - SeolSongWoo/file_extension_block
Contribute to SeolSongWoo/file_extension_block development by creating an account on GitHub.
github.com
- NGINX 설치 및 설정
1. Ubuntu에 NGINX 설치
apt-get install nginx
2. 리버스 프록시 설정
- 8080 = tomcat9 사용포트, 9100 = Jenkins 사용포트
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location /jenkins {
proxy_pass http://localhost:9100;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 0;
client_max_body_size 50m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_temp_file_write_size 64k;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off;
}
설정한 속성들은 추후 NGINX 문서에서 자세히 풀어보도록 하겠다.
- tomcat 9 설치 및 설정
1. OpenJDK 및 tomcat9 설치
sudo apt install openjdk-11-jdk tomcat9 tomcat9-admin
2. Jenkins 배포자동화를 위해, tomcat manager를 사용 따라서 tomcat-users.xml 설정
<role rolename="manager"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-jmx"/>
<user username="id" password="password" roles="standard,manager,manager-script,manager-gui,manager-status,manager-jmx"/>
- Jenkins 설치 및 설정
1. Jenkins 설치
sudo apt-get install jenkins
2. Jenkins의 경우 기본포트가 8080을 사용중이므로 포트번호 변경
sudo nano /etc/default/jenkins
~~~
HTTP_PORT=9100
3. Jenkins 설정에서 프록싱된 주소가 아닌, 본래의 주소 및 포트에 접근하는부분을 프록싱된곳으로 요청되도록 수정
sudo nano /etc/default/jenkins
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"
4. Jenkins 배포 이후, 파이프라인 구축 전 기본 설정
5. 파이프라인 구축
- 병렬처리 및 복잡한 설정을 위해서는 파이프라인 구성을 직접해줘야하지만 본 예재에서는 Jenkins에서 제공하는 Freestyle Project를 사용하겠다.
6. 구축된 파이프라인에 Github 계정 정보 등록
7. Github WebHooks 사용
- Webhooks? 특정 이벤트들을 커스텀 Callback으로 변환해주는 방법. 등록된 url로 HTTP의 POST 메소드를 사용하여 요청
8. 파이프라인에 WebHooks 발생 시, 트리거가 동작하도록 설정
9. tomcat manager를 사용하여, 빌드가 성공적으로 이루어지면 배포가 되도록 설정(CD 구축)
- Jenkins를 이용한 CI/CD 구축 완료
'개발 > DevOps' 카테고리의 다른 글
RDP(Remote Desktop) SSH 터널 인증방식 도입 (0) | 2024.04.19 |
---|---|
리눅스 맬웨어 발견과 제거 (2) | 2024.04.19 |