CI/CD 툴에는 Jenkins 외에도 Github Actions, GitLab, Bitbucket Pipelines 등 여러가지가 존재하는데, 그 중 Jenkins가 가지고 있는 장점은 다음과 같다.
개발자의 편의를 위한 많은 Plugin들을 제공한다. 이로 인해 Git 연동
과 다른 EC2와의 통신을 위한 SSH
등을 편리하게 할 수 있다.
GUI 환경
을 제공한다. Jenkins를 설치하면 CLI가 아닌 GUI 화면에서 편하게 사용할 수 있다.
Java 기반
이기 때문에 JDK, Gradle, Maven 등의 설정을 편리하게 할 수 있기 때문에 Java 프로젝트에 적합하다.
Swap 메모리를 설정했음에도 하나의 EC2에 Jenkins와 WAS를 동시에 돌려보니 Jenkins가 죽는 현상이 발생했다.
따라서 EC2 두개를 띄워 CI/CD와 운영 서버 환경을 분리하기로 결정했다.
Jenkins를 활용한 CI/CD 환경 구축에는 여러가지 방법들이 있다.
- Jenkins 서버에서 도커 이미지(docker image)를 Docker Hub에 push 후 운영 서버에서 pull 하기
- Jenkins 서버에서 빌드한 jar 파일을 SSH 접속 등을 통해 운영 서버에 전달 후 실행시키기
나는 2번 방법으로 CI/CD 환경을 구축해보기로 했다.
Docker 공식 docs의 가이드가 친절하게 작성되어 있기 때문에, 그대로 따라하면 쉽게 설치할 수 있다.
프리티어 기준 EC2 메모리는 1GB이다. 따라서 서버가 뻗어버릴 수도 있고, 성능에도 문제가 생길 수 있기 때문에, Swap 메모리를 확보해 총 3GB로 사용하는 방법을 많이 사용한다.
free 또는 free -h
- Swap 파일 생성
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
일반적으로 2GB를 증설시키며, 이 명령어도 동일하게 작동한다 (128MB x 16 = 2048MB)
- 생성된 Swap 파일 권한 부여
$ sudo chmod 600 /swapfile
- Linux 스왑 영역 설정
sudo mkswap /swapfile
- 스왑 공간에 스왑 파일을 추가하여 사용할 수 있도록 한다.
sudo swapon /swapfile
- 작업 성공 확인
sudo swapon -s
- 부팅 시 Swap 파일 활성화
$ sudo vi /etc/fstab
마지막 줄에 아래 내용 추가
$ /swapfile swap swap defaults 0 0
Jenkins를 EC2 서버에 다운받는 방식을 사용할 수도 있지만, Docker를 통해 더 편리하게 사용할 수 있다.
$ sudo docker run -d --name jenkins -p 9090:8080 jenkins/jenkins:jdk11
-d
: 컨테이너를 백그라운드로 실행한다.--name
: 컨테이너에 이름을 부여한다. 컨테이너 실행과 같은 명령어에서 컨테이너 ID 대신 이름을 사용해 편리하게 사용할 수 있다.-p 9090:8080
: 컨테이너 외부와 통신할 port(9090)와 내부적으로 사용할 port(8080)를 지정해 포워딩할 수 있다. 9090 port로 접속하기 위해 설정했다.컨테이너 실행 후
docker container ps
를 통해 포트 포워딩 확인
이후부터는 생성된 컨테이너를 바로 실행시키면 된다.
sudo docker start jenkins
컨테이너를 실행시키고, {EC2 Pulbic IP}:8080
으로 접속하면 다음 화면이 나온다.
최초에는 Administrator password를 입력해야 한다. 이 password는 /var/jenkins_home/secrets/initialAdminPassword
경로에 있다고 친절히 나와있다.
$ sudo docker exec -it jenkins bash
$ cat /var/jenkins_home/secrets/initialAdminPassword
Plugin 선택 화면이 나오며, Install Suggested Plugins를 선택하여 진행했다. Plugin 같은 경우에는 추후에 따로 설치할 수도 있다.
이제 본격적으로 Jenkins Pipeline을 구축하면 된다.