팀 프로젝트를 진행 중, 백엔드 배포를 할 필요성이 생겨 이것저것 자료를 챙겨보게 되었다.
그러나 따라하다 진행 중 만난 에러가 너무 많아 기나긴 삽질 끝에 배포를 해냈다!
나중에도 기록해두면 유용하게 쓰일 것 같아서 정리해 놓고자 글을 쓰게 되었다.
우선 전체적인 아키텍처는 아래와 같다.
GCP를 사용해 우분투 20.04 LTS 버전을 사용했으며,
젠킨스를 실행하는 서버, 스프링 부트를 실행하는 서버로 나누어 인스턴스를 2개 사용한다.
우선 젠킨스 서버를 구성해보자.
젠킨스 배포용 서버 구축
우선 젠킨스를 실행시키기 위해 도커를 설치한다.
우분투 자체에 젠킨스를 설치하는 방법도 있으나, 도커 컨테이너로 실행시킬 때의 장점은 아래와 같다.
- 컨테이너끼리 격리된 환경을 보장해 주기 때문에 충돌을 막을 수 있다.
- 도커 이미지를 사용하기 때문에 젠킨스 버전 관리가 용이하다.
- 도커파일을 통해 젠킨스와 관련된 설정을 코드로 관리할 수 있다.
- 도커에서 리소스를 효율적으로 관리해 준다.
사실 체감되는 내용은 없었으나, 우선 이 방법을 사용할 것이다.
우선 인스턴스에 접속하면, 나는 root 유저를 사용해서 설치했다.
GCP의 경우 접속시 사용자 계정이 디폴트일 것인데,
su 명령어로 root로 변경시키자.
만약 비밀번호를 설정해야한다면
su passwd로 root 패스워드를 변경할 수 있다.
좋은 방법은 아니지만, 내 인스턴스는 나만 사용하기 때문에 root로 진행해도 추후 문제가 없을 것이라고 판단했다.
도커 설치하기
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
위에서부터 명령어별로 복붙 해서 설치하면 된다.
젠킨스 설치하기
이제, 도커 허브를 통해 젠킨스 이미지를 내려받고 젠킨스를 컨테이너로 실행시켜 보자.
docker pull jenkins/jenkins:lts
docker run --privileged -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
젠킨스는 8080 포트를 기반으로 접속 가능하기 때문에 컨테이너 포트를 8080으로 실행시켜야 한다.
이제 젠킨스가 도커 컨테이너로 실행 되었으며, docker ps 명령어로 실행중인 컨테이너를 확인할 수 있다.
그리고 젠킨스 포트를 8080으로 실행시켰기 때문에, 사용하는 인스턴스의 공개 IP:8080으로 접속하면 젠킨스에서 기본 비밀번호를 입력하라는 화면이 나온다.
우리는 젠킨스를 도커 위에서 실행중이기 때문에 실행중인 젠킨스 컨테이너에 접속해서 패스워드를 확인해야한다.
실행중인 컨테이너에 접속하는 도커 명령어는 아래와 같다.
docker exec -it jenkins /bin/bash
접속후, 아래의 명령어를 통해 초기 비밀번호를 확인할 수 있고, 복붙해서 위 입력창에 넣어주자.
cat /var/jenkins_home/secrets/initialAdminPassword
그리고 초기 설정을 위해 플러그인을 설치해야하는데,
왼쪽에 자동 설치로 진행하자.
설치가 완료되면 계정을 만드는 페이지가 나오고, 나중에 접속할때 계정와 비밀번호이므로 기억해두자.
젠킨스 프로젝트 생성하기
접속하면 젠킨스 메인 페이지가 나오고, 좌측에 새로운 Item -> Freestyle Project를 생성한다.
그리고 다음과 같이 Github Project를 체크하고, 저장소 URL을 넣어준다.
그리고 내려와서, 소스 코드 관리에 Git을 체크한 후,
똑같이 저장소 URL을 입력하고, Credentials를 정해야한다.
이는 깃허브와 젠킨스가 데이터를 주고받을때 인증하는 방식을 정하는 것이다.
처음이라 -none- 으로 되어있을 것인데, 밑에 Add -> Jenkins로 만들어주어야 한다.
Username: 깃허브 닉네임
Password: 깃허브 패스워드
ID: Credential의 이름. 적당히 지으면 된다.
생성후 위 사진처럼 추가하면 된다.
그리고 밑의 브랜치가 있는데, 깃허브에서 푸시를 감지하고 빌드할 브랜치를 정하는 것이다.
나는 feature 브랜치를 개발 환경에서 사용하고, main 브랜치가 운영 브랜치이므로 main 브랜치로 감지하도록 했다.
그리고 빌드 유발에는 GitHub hook trigger for GITScm polling을 체크한다.
내려오면 Build Steps 탭이 있는데,
Add Build Step -> Execute Shell을 추가하고 아래와 같은 명령어를 넣는다.
chmod +x gradlew
./gradlew clean build
나의 경우는 스프링 부트 프로젝트 빌드시 프로필을 dev로, 테스트 없이 하고 싶어서 따로 명령어를 추가해주었다.
chmod +x gradlew
./gradlew clean build -PSPRING_PROFILES_ACTIVE=dev -x test
위처럼 작성할 경우 빌드시 dev 프로필로, 테스트 없이 빌드가 된다.
우선 여기까지만 하고 이제 깃허브와 젠킨스를 연결해보자
깃허브 - 젠킨스 웹훅 연결
연동하고 싶은 저장소의 Settings 탭에 가서 WebHooks 로 들어가자.
그리고 우측의 Add webhook
위와 같이 작성해준다.
Payload URL에는 위에서 세팅했던 젠킨스 서버 URL에 /github-webhook/을 붙여서 입력해주어야한다.
그리고 Content type에는 json으로 하고, Secret은 비워둔다.
만약 아까 Credentials를 추가할때 SSH 방식으로 인증하는 것을 택했다면, 위 Secret에 추가 설정이 필요하다!
이제 깃허브 main 브랜치에 푸시하면 젠킨스가 웹훅을 통해 감지하고, 빌드를 시작한다.
이제 배포용 서버를 만들어서 스프링 부트 프로젝트를 실행 시키기 위해 젠킨스용 서버와 연결을 해주어야한다.