CI/CD가 뭔가요? 실전편

지난번 CI/CD가 뭔가요? - 이론편에서 CI/CD에 대해서 알아보았다.
이번 글에서는 jenkins를 이용해 하나의 CI/CD 환경을 구축하는 방법에 대해 알아보는 시간을 갖도록 하겠다.
개선 근로에서 구현한 리뷰 매칭 프로그램 을 젠킨스를 통해 master branch에 merge되면 새롭게 배포하는 환경을 구축하도록 하자.
Jenkins 환경 구축하기
우선 jenkins를 위한 서버가 필요하다.
해당 서버에 자신의 운영체제에 맞는 jenkins를 설치하도록 하자.
이 글에서는 어느 운영체제에서도 설치할 수 있도록 docker image로 jenkins를 설치하고 관리하도록 하겠다.
-
docker image 받기
docker pull jenkins/jenkins:lts
jenkins 프로세스를 위한 컨테이너를 만들기 위해 image 정보를 받아온다.docker images
로 설치받은 이미지들을 확인하자. -
docker container 실행
docker run -d -p 8080:8080 --name jenkins jenkins/jenkins
docker를 이용해 8080포트에 jenkins라는 이름의 jenkins 프로세스를 실행한다.docker ps
로 동작 중인 컨테이너들을 확인하자.이제 해당 서버의 8080 포트로 접근을 하면 아래와 같이 jenkins에 로그인하라는 문구를 확인할 수 있을 것이다.
docker exec -it jenkins /bin/bash
로 우리가 생성한 컨테이너에 접근하도록 하자.컨테이너에 접속한 뒤
cat /var/jenkins_home/secrets/initialAdminPassword
를 입력한 뒤에 사진의 폴더 속 내용을 조회하면 jenkins에 접근할 수 있는 비밀번호를 확인할 수 있을 것이다.로그인하고 나면, Customize Jenkins 페이지가 보이는데, 플러그인 설치에 관한 내용이 보이는데
Install Suggested Plugins
를 선택하도록 하자.이후 설치가 끝나면 계정 생성 페이지가 나오는데, 계정을 생성하고 나면 아래와 같은 화면을 마주할 수 있다.
이러면 설치는 모두 끝났다. 이제 jenkins에 프로젝트를 연결해보도록 하자!
Jenkins를 이용한 CI/CD 환경 구축하기
-
플러그인 확인
Jenkins에서 shell script를 통한 작업 생성 시에는 Post build task Plugin, gradle 빌드 시 Gradle Plugin, maven 빌드 시 Maven Plugin과 같은 플러그인이 필요하다.
Jenkins 관리 -> Plugin 관리 -> 설치된 플러그인 목록에 해당되는 플러그인이 존재하지 않는 경우, 설치 가능 탭에서 설치해주도록 하자.
-
작업 생성
새로운 item 탭에 들어가면 다음과 같은 화면을 조회할 수 있을 것이다.
build를 하면서 보다 복잡한 shell script 실행이 필요한 경우 pipeline을 통한 구축을 하는 것이 좋다.
지금은 간단한 환경 구축이니 freestyle로 작업을 만들어보도록 하자.
-
Github Project 등록
위와 같이 General -> Github project에 체크하고 저장소 url을 입력한다.
소스 코드 관리 -> Git 체크하고 Repository URL을 다시 한번 입력해준다.
저장소를 사용하려면 자격 증명이 필요하다. 토큰을 등록해주기 위해 Github 페이지에서
settings -> Developer Settings -> Personal access tokens -> Generate Access token
으로 접근할 범위를 아래와 같이 선택하고 토큰을 생성하자.만들어진 access token을 잘 갖고 있다가
Credentials
에 Add를 클릭해 자격 증명을 해주자.Kind는
Username with password
를 선택하고Username
에는 자신의 github 아이디,password
에는 발급받은 토큰을 입력해주도록 한다.Credential 추가 후에는 소스코드관리
Credentials
탭에서 생성한 Credential을 입력하도록 한다. -
Build trigger 추가
Branches to build
에는 빌드 할 브랜치명을 선택해주고,빌드 유발
에는 Github hook trigger for GITScm polling을 선택해준다. 이것은 Github의 webhook으로부터 빌드를 유발받겠다는 의미이다. -
Build 추가
Build -> invoke Gradle script
를 선택하고 Tasks에 수행할 빌드를 적어준다.이때, gradle wrapper를 사용하는 경우 아래와 같이 작성한다.
-
Build 후 조치
Log text에는 로깅 내용이 일치하는지 확인을 위한 용도로 사용한다.
Script에는 빌드 성공 후 배포할 스크립트를 적는다.
-
저장
Apply 와 저장을 클릭해준다.
이제 기본적인 환경 구축은 끝났다! 원하는대로 잘 동작하는지 확인해보도록 하자.
하지만 이게 웬일! build now를 클릭하고 console output을 확인해보면 아래와 같이 SUCCESS이지만, 서버 상에 배포가 되지 않았다.

이것은 docker로 jenkins를 구축했기 때문이다. 우리는 배포 서버에 해당 동작이 수행되기를 원했지만, 실제로는 jenkins를 담당하는 CI/CD 서버에서 동작이 수행된 것이다.
이럴 경우 배포 서버에 jenkins의 publish over SSH
기능을 이용해 jar 파일을 전송하고 실행하면 원하는 대로 배포 서버와 CI/CD 서버를 따로 구축할 수 있다.
Send publish over SSH
우선 publish over SSH 플러그인 설치가 필요하다.
Jenkins 관리 -> 시스템 설정
에서 다음과 같은 설정을 하도록 하자.

Key
에 SSH 통신을 위한 자신의 pem키
Hostname
에 file을 보낼 ip 주소
Username
에 자신의 서버 주인
Remote Directory
에 기본 위치를 등록하도록 하자.

Name
에 자신이 등록한 이름
Source files
에 jenkins에서 build한 jar 파일의 위치
Remove prefix
에 제거할 주소
Remote directory
에 file을 저장할 위치
Exec command
에 file을 실행할 명령어를 입력하도록 하자.
이렇게 하면 모든 준비는 끝났다.
Build Now를 하면 아래와 같이 Transferred 1 files 와 함께 모든 실행이 성공한 것을 볼 수 있을 것이다.

github repository에서 GitHub webhook을 등록하고 나면 이제 push 될 때마다 jenkins가 실행되는 것을 볼 수 있을 것이다.
마치며
이렇게 Jenkins를 이용한 CI/CD 환경 구축이 모두 끝이 났다.
상황에 따라 추가적인 설정이 필요할 수도, 필요 없을 수도 있지만 이 글을 통해서 CI/CD가 어떤 식으로 동작하는지 흐름이라도 이해할 수 있었기를 바란다.