도입 배경:
KnockKnock 프로젝트가 끝나고 고도화를 시키기 위해 작업 중인 CI/CD에 대해 기록해 보겠다.
먼저, KnockKnock 프로젝트에서는 CI/CD를 적용하지 못했었다. 무중단 배포라는 것을 시도해보고 싶었지만, 프로젝트의 일정과 학습해야 하는 데브옵스와 인프라의 내용 등을 고려했을 때, 러닝커브가 높다고 판단하였고, 시작한다면 이도저도 아닐 것 같았기 때문이다. 하지만, 프로젝트 막바지에 계속되는 오류 수정과 기능 추가 등 새로운 배포가 끊임없이 필요한 상황을 겪게 되었고, 매번 배포하는 과정을 수동으로 실행해야 하는 단점을 경험하면서, 고도화 작업을 시작할 때 가장 첫 번째로 무중단 배포 환경을 구성하고 시작해야겠다고 생각했다.
CI/CD 도구 선정:
CI/CD 환경을 구축하도록 도와주는 도구들은 여러 가지가 있는데, 그중 대표적으로 Jenkins, github action, gitlab CI/CD 등이 있다. Knock Knock에서는 Jenkins를 사용하기로 결정하였는데, 시중에 배포되어 있는 여러 도구 중 Jenkins가 많은 정보와 관심도가 있는 도구이며 학습에 용이한 레퍼런스가 많은 것이 처음 적용해 보는 입장으로서 좋다고 판단하였다. 또한 비용적인 부분에서도 무료로 사용할 수 있다.
설치 과정:
우선적으로, Jenkins를 사용할 EC2 인스턴스를 우분투 기반으로 생성해 주었다. 그러고 나서 도커를 적용하여 컨테이너를 띄웠다. 도커를 사용하기로 한 이유는 복잡한 환경설정 없이 Jenkins를 설치하고 서버에 띄울 수 있기 때문이다. 학습한 내용에 기반하면, 만약 도커를 사용하지 않고 직접 설치했을 시 각기 다른 환경마다 실행이 되도록 정말 많은 환경설정을 해주어야 한다고 한다.
인스턴스에 접속해서 우분투 패키지 관리 툴 명령어인 apt update를 통해 레퍼지토리 인덱스 갱신을 통한 업데이트를 해주었다.
Jenkins는 Java를 기반으로 동작하는 프로그램이기 때문에, 자바를 설치해 주기 위해서 java -version이라는 명령어를 통해, 확인해 주었다. 없다면 다운로드해 주자. 나중에 알게 된 사실이지만, 도커를 설정하면서 jenkins를 설정하면 도커 패키지안에 포함되어 있기 때문에 따로 해주지 않아도 되는 것 같다.
다시 한번, 레포지토리를 셋업 하기 위해 명령어를 통해 우분투의 apt 패키지의 인덱스를 최신화하고, HTTPS를 통해 패키지 설치가 가능하도록 설정한다.
도커 공식문서에 나와있는 설명을 따라 GPC 키를 추가하고 도커 엔진을 다운로드해 주면, Hello from Docker!라는 문구와 함께 성공적으로 도커가 설치된 것을 확인할 수 있다.
위에서 언급한 것과 같이, $ docker pull jenkins/jenkins:lts 명령어를 통해 젠킨스 이미지를 다운로드하면 그 안에 java 또한 같이 다운로드된다. 마지막으로 젠킨스 컨테이너를 띄우기 위해서 옵션을 작성해 주면 설치는 마무리가 된다. 옵션의 자세한 설명은 친절한 gpt의 설명을 참조하자.
위의 명령어는 Docker를 사용하여 Jenkins 서비스를 실행하는 명령어입니다. 각 옵션과 명령어의 역할은 다음과 같습니다:
sudo: 해당 명령어를 슈퍼 유저 권한(root)으로 실행합니다. Docker를 관리하려면 관리자 권한이 필요할 수 있습니다.
docker run: Docker 컨테이너를 실행하는 명령어입니다.
-d: 컨테이너를 백그라운드(background) 모드로 실행합니다. 이 옵션을 사용하면 컨테이너가 백그라운드에서 실행되며 콘솔을 차지하지 않습니다.
-p 8080:8080: 호스트와 컨테이너 간의 포트 매핑을 설정합니다. 이 옵션은 호스트의 8080 포트와 컨테이너의 8080 포트를 연결하여 호스트에서 Jenkins 웹 인터페이스에 액세스 할 수 있게 합니다.
-v /jenkins:/var/jenkins_home: 호스트와 컨테이너 간의 볼륨 마운트를 설정합니다. 이 옵션은 호스트의 /jenkins 경로와 컨테이너의 /var/jenkins_home 경로를 연결하여 Jenkins 설정 파일과 데이터를 호스트 시스템에 저장하게 합니다. 이렇게 하면 컨테이너를 삭제하더라도 Jenkins 설정과 데이터는 유지됩니다.
--name jenkins: 컨테이너에 이름을 부여합니다. 이 경우 컨테이너의 이름은 "jenkins"로 지정됩니다.
-u root: 컨테이너 내부에서 실행되는 Jenkins 프로세스를 root 사용자로 실행합니다. Jenkins가 필요로 하는 권한 및 파일 액세스를 위해 root 권한이 필요한 경우가 있습니다.
jenkins/jenkins:lts: 사용할 Docker 이미지를 지정합니다. 여기서는 "jenkins/jenkins:lts" 이미지를 사용하며, 이는 Jenkins의 LTS (Long-Term Support) 버전을 포함한 이미지입니다.
이 명령어를 실행하면 Docker 컨테이너가 백그라운드에서 실행되며 호스트의 8080 포트와 컨테이너의 8080 포트가 연결되어 Jenkins 서비스를 사용할 수 있게 됩니다. 또한 Jenkins 설정과 데이터는 호스트의 /jenkins 경로에 저장되어 영속성을 유지합니다.
from.Chatgpt
도커에 젠키스 컨테이너가 EC2 인스턴스에 실행된다면, EC2 pubilc IP를 통해 8080 포트로 접속했을 시 위와 같은 접속 화면이 나타난다.
$ sudo docker logs jenkins 명령어를 통해 initial admin password를 확인하고, Administrator password 부분에 입력해 주자.
여기까지 성공적으로 마치게 되면, 본격적으로 Jenkins를 설정할 수 있는 단계로 넘어갈 수 있게 된다. 😁
마무리:
다음에는 어떤 식으로 배포환경을 구성하였는지 포스팅해 보겠다. 👐