최근 개발 중인 백오피스 앱에 Jenkins를 활용해 CI/CD(지속적 통합 및 지속적 배포)를 적용하여 배포 자동화를 구현했습니다.
이 앱은 Nest.js를 기반으로 개발되었지만, CI/CD 파이프라인 설정은 Node.js 기반 앱 전반에 적용할 수 있도록 구성되었습니다.
예를 들어, npm run build와 같은 명령어를 사용해 배포를 자동화하기 때문에, Node.js로 개발된 다른 프로젝트에도 쉽게 적용할 수 있습니다.
1. Java 설치
먼저 서버에 Java를 설치해야합니다.
Jenkins는 Java 기반의 애플리케이션이므로 Java가 설치되어 있지않다면 Java를 먼저 서버에 설치합니다.
설치하기 전에 서버에 설치 가능한 자바 버전들을 확인합니다.
// 설치할 수 있는 자바 버전 확인
yum list | grep jdk
Jenkins 공식 홈페이지에서 Java 11 버전 이상 지원한다고 하니 Java 11 버전을 설치해야겠군요.
// 자바 11 Development Kit 설치
yum install java-11-openjdk-devel
자바 11 버전들 중에 개발 도구들이 포함되어있는 devel 버전을 설치합니다.
2. Jenkins 리포지토리 추가
Jenkins의 최신 버전을 설치하기 위해 Jenkins 리포지토리를 추가합니다.
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
현재 서버의 OS는 CentOS 7.x를 사용하고 있습니다.
Jenkins를 Red Hat 계열의 Linux 배포판(CentOS, Fedora, RHEL 등)에 설치할 때 사용하는 패키지는 RPM 패키지 형식입니다.
RPM 패키지를 설치할 때는 패키지가 신뢰할 수 있는 출처에서 왔는지를 확인하기 위해 패키지에는 디지털 서명이 포함됩니다. 이 서명을 확인하려면, 먼저 해당 패키지의 서명에 사용된 GPG 공개 키를 시스템에 추가해야 합니다.
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
3. Jenkins 설치
yum install jenkins
4. Jenkins 서비스 시작
Jenkins를 설치한 후, Jenkins 서비스를 시작합니다
systemctl start jenkins
서비스가 자동으로 시작되도록 설정합니다
systemctl enable jenkins
5. Jenkins 포트 열기
Jenkins는 기본적으로 8080 포트를 사용합니다. 이 포트를 서버의 방화벽에서 허용해야 합니다
방화벽의 인바운드 규칙에 Jenkins가 사용할 8080 포트를 허용해줍니다.
6. Jenkins 초기 설정
Jenkins의 초기 설정을 위해 브라우저에서 서버의 IP 주소와 포트 8080으로 접속합니다
http://your_server_ip:8080
하지만 Jenkins가 "Failed to start Jenkins Continuous Integration Server." 에러를 뱉고 작동하지 않았습니다.
에러 내용을 파악하기 위해 로그메세지를 살펴보니 Jenkins는 Java 11로 실행되고 있지만, 현재 Jenkins 버전은 Java 17 또는 Java 21을 필요하다고 합니다.
Running with Java 11 from /usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x8
Supported Java versions are: [17, 21]
서버의 OS 버전이 CentOS 7.x이기때문에 Java 17이상을 지원하지 않습니다.
Jenkins의 버전을 다운그레이드하여 사용해야합니다.
6-1. Jenkins 버전 다운그레이드
Jenkins에서 Java 11을 지원하는 버전인 Jenkins 2.361.4 LTS를 설치하도록 합시다.
그전에 먼저 현재 설치된 Jenkins를 제거합니다.
yum remove jenkins
그 후 Jenkins 2.361.4 LTS를 설치합니다.
CentOS 7에서 특정 버전의 Jenkins를 설치하려면 직접 .war 파일을 다운로드해야합니다.
wget https://get.jenkins.io/war-stable/2.361.4/jenkins.war
설치가 된 다음에는 아래의 명령어를 사용하여 수동으로 Jenkins를 실행할수도 있습니다.
java -jar jenkins.war
하지만 일일히 해당 코드를 작성하여 실행하는건 번거로우므로 Jenkins를 서비스에 등록해 사용합시다.
기존에 남아있던 Jenkins 설정을 사용하려면 /usr/lib/jenkins에 .war 파일을 이동하고 Jenkins 서비스를 재시작합니다.
systemctl restart jenkins
작동하지 않는거나 .war파일로 바로 설치하였다면 기존 Jenkins 설정이 없으므로 수동으로 세팅해줍니다.
먼저 jenkins.service 파일을 /etc/systemd/system/ 디렉터리에 생성합니다.
vi /etc/systemd/system/jenkins.service
'vi' 편집기에서 다음 내용을 입력합니다.
[Unit]
Description=Jenkins CI
After=network.target
[Service]
User=root
ExecStart=/usr/bin/java -jar /path/to/jenkins.war
SuccessExitStatus=143
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
/path/to/jenkins.war 부분을 실제 jenkins.war 파일의 경로로 변경해야 합니다
6-2. 시스템 데몬 다시 로드
시스템에 Jenkins를 등록했다면 시스템 데몬을 다시 로드하여 서비스 파일의 변경 사항을 반영합니다.
systemctl daemon-reload
그 후 Jenkins 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다.
systemctl start jenkins
systemctl enable jenkins
Jenkins가 제대로 실행됐다면 나머지 초기 설정을 세팅합니다.
처음 브라우저로 Jenkins에 진입시 아래와 같은 화면이 나옵니다.
서버 콘솔에 나타난 initialAdminPassword를 사용하여 Jenkins를 Unlock하고 Admin 계정 정보를 세팅합니다.
Jenkins 플러그인을 설치합니다.
특정 플러그인이 필요한게 아니라면 Install suggested plugins를 눌러 보편적으로 사용되는 플러그인들을 설치합니다.
플러그인까지 설치가 되면 Jenkins의 설치가 끝납니다.