728x90
반응형
프로젝트를 시작하기 전에 CI/CD를 구축하고 진행하면 훨씬 더 용이하다고 멘토님이 말씀해주셔서 우선 구축하고 진행하려고 한다.
우선 CI/CD가 정확하게 뭘까?
CI/CD는 소프트웨어 개발에서 지속적 통합(Continuous Integration, CI)과 지속적 전달/배포(Continuous Delivery/Deployment, CD)를 의미합니다.
지속적 통합(CI): 개발자들이 자주 코드를 중앙 저장소에 병합하며, 자동으로 빌드 및 테스트를 수행하여 코드 품질을 보장합니다. 이를 통해 병합 충돌과 버그를 조기에 발견하고 해결할 수 있습니다.
지속적 전달(CD): 소프트웨어를 항상 배포할 수 있는 상태로 유지하여, 릴리스 준비 상태로 자동화합니다.
간단하게 개발자의 귀찮은 통합, 배포 등의 반복적인 작업을 없애주는 역할이라고 보면 될 것 같다.
- 개발자의 코드 변경 사항 Commit 및 Push:
- 개발자는 로컬 개발 환경에서 코드를 수정한 후, Git 저장소에 변경 사항을 커밋하고 푸시합니다. 이 과정에는 새로운 기능 추가, 버그 수정, 리팩토링 등의 작업이 포함됩니다.
- Git Webhook 트리거:
- Git 저장소에 변경 사항이 푸시되면 설정된 Webhook이 트리거되어 Jenkins 서버에 알립니다. Webhook은 사전에 Jenkins와 Git 저장소 간에 연동되어야 합니다.
- Jenkins에서의 자동 Build-Test-Deploy 과정:
- Build 단계: Jenkins는 소스 코드를 빌드하여 컴파일하고, 필요한 의존성을 다운로드하며 패키징합니다.
전반적인 흐름은 이렇게 될 것 같다.
CI/CD는 인스턴스에서 도커 위에 Jenkins를 설치한 후 jar파일을 다른 인스턴스 위에서 실행하는 형태로 진행하려고 한다.
왜 난 Docker를 사용하여 Jenkins를 설치하였나?
크게 3가지로 나눌 수 있을 것같다.
- 일관된 환경 제공:
- Docker 컨테이너는 애플리케이션을 실행하는 데 필요한 모든 환경 설정을 포함할 수 있습니다. 이를 통해 Jenkins를 실행하는 환경이 어디서나 동일하게 유지되므로, 개발 환경과 프로덕션 환경 간의 차이로 인한 문제를 최소화할 수 있습니다.
- Jenkins의 종속성과 플러그인을 포함하여 일관된 환경에서 작업할 수 있습니다.
- 쉽고 빠른 배포:
- Docker 이미지를 사용하면 Jenkins 설치를 표준화하여 빠르게 배포할 수 있습니다. 새로운 Jenkins 인스턴스를 생성하는 데 소요되는 시간이 줄어들고, 설정 오류 가능성도 낮아집니다.
- Jenkins를 Docker Hub와 같은 저장소에 이미지를 저장해 두면 필요할 때 쉽게 다운로드하고 실행할 수 있습니다.
- 이동성과 확장성:
- Docker 컨테이너는 플랫폼 독립적인 환경을 제공하기 때문에 Jenkins를 쉽게 다른 서버로 이동할 수 있습니다. 이는 Jenkins를 클라우드 환경에서 실행할 때 특히 유용합니다.
- Jenkins 노드를 컨테이너로 실행하면 Jenkins의 빌드 작업을 쉽게 확장할 수 있으며, 필요에 따라 Jenkins 노드를 더 추가하거나 제거할 수 있습니다.
하지만 무엇보다 쉽고 빠르게 설치를 할 수 있는 이유가 가장 컸다.
설치를 해보자
우선 인스턴스에 Docker을 설치한다.
https://docs.docker.com/engine/install/ubuntu/
공식사이트를 참고해서 설치하면 된다.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Swap 메모리 확보
설치 전 Jenkins가 메모리를 많이 잡아먹어서 Swap 메모리를 확보해준다.
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo vi /etc/fstab
/swapfile swap swap defaults 0 0
도커 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
젠킨스 설치
sudo docker run -d --name jenkins -p 8080:8080 jenkins/jenkins:jdk11
docker 명령어 설명
- sudo:
- sudo는 명령을 슈퍼유저 권한으로 실행하기 위한 Linux 명령어입니다. Docker 명령어는 일반적으로 관리자 권한이 필요하므로 sudo를 사용하여 명령을 실행합니다..
- -d (또는 --detach):
- 이 옵션은 컨테이너를 백그라운드에서 실행합니다. 즉, 컨테이너가 시작되면 터미널에서 분리되며, 백그라운드에서 계속 실행됩니다. 터미널을 점유하지 않으므로 다른 작업을 계속할 수 있습니다.
- --name jenkins:
- --name 옵션은 생성된 컨테이너에 jenkins라는 이름을 지정합니다. 이를 통해 컨테이너를 식별하고 관리할 때 편리합니다. 컨테이너 ID 대신 이름을 사용하여 명령을 실행할 수 있습니다.
- -p 8080:8080:
- -p 옵션은 포트 매핑을 설정합니다. 여기서는 호스트의 포트 8080을 컨테이너의 포트 8080에 매핑합니다. 이를 통해 로컬 호스트의 8080 포트를 통해 Jenkins에 접근할 수 있습니다.
젠킨스 시작
sudo docker start jenkins
젠킨스 초기 비밀번호 찾기
sudo docker exec -it jenkins bash
cat /var/jenkins_home/secrets/initialAdminPassword
- docker exec:
- 실행 중인 컨테이너에 명령을 전달하는 Docker 명령어입니다. 특정 컨테이너 내부에서 명령어를 실행할 수 있습니다.
- -it:
- -i: 표준 입력(STDIN)을 활성화하여 상호작용이 가능하게 합니다.
- -t: TTY를 활성화하여 터미널과 같은 환경을 제공합니다.
- 이 두 옵션은 함께 사용되어 상호작용이 가능한 셸을 실행할 수 있게 합니다.
- jenkins:
- 명령을 실행할 대상 컨테이너의 이름 또는 ID입니다. 앞서 생성한 jenkins라는 이름의 컨테이너 내에서 명령을 실행합니다.
- bash:
- 컨테이너 내에서 실행할 명령입니다. 여기서는 Bash 셸을 시작하여, 해당 컨테이너의 터미널에 접속할 수 있게 합니다.
- cat:
- 파일의 내용을 출력하는 Linux 명령어입니다. 지정한 파일의 내용을 표준 출력(터미널)에 표시합니다.
ref
https://velog.io/@bagt/Jenkins%EC%99%80-Docker%EB%A1%9C-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-1
728x90
반응형
'백엔드' 카테고리의 다른 글
[Spring Boot] Spring Security 기본 필터 살펴보기 (0) | 2024.08.22 |
---|---|
[Spring Boot] Spring Security 내부 구조 파악하기 (0) | 2024.08.22 |
[Spring Boot] JPA @Id 전략 (0) | 2024.08.15 |
[Spring Boot] 디렉터리 패키지 구조 - 도메인형, 계층형 (0) | 2024.08.11 |
[Spring Boot] IoC, DI, AOP 정리 (0) | 2024.08.11 |