백엔드

[DevOps] Docker와 Jenkins를 이용한 CI/CD 구축 (1)

육빔 2024. 8. 15. 16:48
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가지로 나눌 수 있을 것같다.

  1. 일관된 환경 제공:
    • Docker 컨테이너는 애플리케이션을 실행하는 데 필요한 모든 환경 설정을 포함할 수 있습니다. 이를 통해 Jenkins를 실행하는 환경이 어디서나 동일하게 유지되므로, 개발 환경과 프로덕션 환경 간의 차이로 인한 문제를 최소화할 수 있습니다.
    • Jenkins의 종속성과 플러그인을 포함하여 일관된 환경에서 작업할 수 있습니다.
  2. 쉽고 빠른 배포:
    • Docker 이미지를 사용하면 Jenkins 설치를 표준화하여 빠르게 배포할 수 있습니다. 새로운 Jenkins 인스턴스를 생성하는 데 소요되는 시간이 줄어들고, 설정 오류 가능성도 낮아집니다.
    • Jenkins를 Docker Hub와 같은 저장소에 이미지를 저장해 두면 필요할 때 쉽게 다운로드하고 실행할 수 있습니다.
  3. 이동성과 확장성:
    • Docker 컨테이너는 플랫폼 독립적인 환경을 제공하기 때문에 Jenkins를 쉽게 다른 서버로 이동할 수 있습니다. 이는 Jenkins를 클라우드 환경에서 실행할 때 특히 유용합니다.
    • Jenkins 노드를 컨테이너로 실행하면 Jenkins의 빌드 작업을 쉽게 확장할 수 있으며, 필요에 따라 Jenkins 노드를 더 추가하거나 제거할 수 있습니다.

하지만 무엇보다 쉽고 빠르게 설치를 할 수 있는 이유가 가장 컸다.

 

설치를 해보자

 

우선 인스턴스에 Docker을 설치한다.

 

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

공식사이트를 참고해서 설치하면 된다. 

# 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

 

스왑 파일을 사용하여 Amazon EC2 인스턴스에서 메모리를 스왑 스페이스로 할당합니다.

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 스왑 파일로 사용할 메모리를 할당하고 싶습니다. 어떻게 해야 하나요?

repost.aws

 

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

 

Jenkins와 Docker로 CI/CD pipeline 구축하기 (1)

Jenkins의 장점 https://docs.docker.com/engine/install/ubuntu/ 최초 비밀번호 입력 최초에는 Administrator password를 입력해야 한다. 이 password는 /var/jenkins_home/secrets

velog.io

728x90
반응형