배포 자동화를 진행하면서 너무 많은 삽질이 있었다.
배포 자동화를한 후 2주정도 지났는데 에러가 뜨지 않고 잘 돌아간다.
기록하지 않으면 또 똑같은 삽질로 시간을 낭비할 수 있기 때문에 복습할겸 기록을 해본다.
도입 배경
프로젝트 일정 중 기능 구현이 끝나면 리팩토링이나 새로운 기술 도입 전에 배포를 하기로 했다.
배포를 하고나서 리팩토링이 진행되면 계속 버전업을 해줘야 하는데 그렇게 되면 배포해야 할 일이 잦아진다.
그래서 젠킨스와 네이버클라우드를 활용하여 배포 자동화를 도입하기로 했다.
젠킨스와 네이버클라우드 선택 이유
먼저 젠킨스를 선택한 가장 큰 이유는 다른 CI를 위한 툴과는 다르게 오픈소스 툴이라는 장점과 그런 이유에서인지 방대한 커뮤니티가 존재하여 배포를 진행하는 데 있어 정보가 많다고 생각했기 때문이다.
네이버 클라우드는 지급받은 바우처가 있어 여러 가지 다양한 시도를 해볼 기회라고 생각하고 한글로 되어있어 주니어 개발자한테 적합하다고 생각했다.
도커 설치하기
젠킨스를 다운받기
Jenkins 서버에서 프로젝트를 빌드하여 jar 파일로 Docker 이미지를 생성하는데 도움을 주기 위해 설치한고,
그렇게 생성된 Docker 이미지를 Docker Hub에 푸시하기 위해 사용한다.
또한 푸시된 Docker 이미지를 가져와서 컨테이너로 실행하기 위해 나중에 스프링부트 서버에도 도커가 필요하다.
$ sudo apt-get update
$ sudo apt-get install curl
$ curl https://get.docker.com > docker-install.sh
$ chmod 755 docker-install.sh
$ sudo ./docker-install.sh
젠킨스 및 연동
// pull 명령어로 이미지 파일을 받는다.
$ docker pull jenkins/jenkins:lts-jdk17
// 다운받은 도커 이미지 확인
$ docker images
// 도커 이미지 만들기: 젠킨스 + JDK17 + 도커 클라이언트
$ mkdir docker-workspace
$ cd docker-workspace
// install-docker.sh 파일 생성
$ vi install-docker.sh
// install-docker.sh 파일 내용
#!/bin/sh
apt-get update
apt-get -y install apt-transport-https \
apt-utils \
ca-certificates \
curl \
gnupg2 \
zip \
unzip \
acl \
software-properties-common
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update
apt-get -y install docker-ce
$ docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server
--restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17
// 도커 빌드 파일 생성
$ vi Dockerfile
// Dockerfile 내용
FROM jenkins/jenkins:lts-jdk17
USER root
COPY install-docker.sh /install-docker.sh
RUN chmod +x /install-docker.sh
RUN /install-docker.sh
RUN usermod -aG docker jenkins
RUN setfacl -Rm d:g:docker:rwx,g:docker:rwx /var/run/
USER jenkins
// 도커 이미지 생성
$ docker build -t jaew0n/my-jenkins:1.0 .
// 도커 이미지를 도커 허브 사이트에 업로드 하기
$ docker login
$ docker push jaew0n/my-jenkins:1.0
// 컨테이너 생성 및 실행하기
$ docker run --privileged -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure --network="jenkins" --name my-jenkins jaew0n/my-jenkins:1.0
$ docker container ls
// 젠킨스가 8080포트를 사용하고 젠킨스 노드를 관리하는 서버 포트는 50000
// -v jenkins_home:/var/jenkins_home -> 젠킨스가 지워져도 젠킨스 안에 설정한 값이 유지
젠킨스 설치 후 NCP에서 발급받은 공인 IP로 접속하면 비밀번호가 필요한데
젠킨스 로그를 확인하여 admin 계정을 만들어 준다.
계정을 만들고 로그인 후 Jenkins 관리 -> tools -> JDK 에서 JDK를 추가해준다.
이미 JDK17이 설치된 jenkins/jenkins:lts-jdk17를 사용했기 때문에
JAVA_HOME 경로는 /opt/java/openjdk 이다.
docker inspect my-jenkins 에서 확인 가능하다
계정을 만들고 새로운 Item을 누른후 원하는 유형을 고른다
나는 간단한 구조이기 때문에 파이프라인보다는 Freestyle project로 만들어줬다.
만들고 나면 구성으로 들어가서 다음 순서대로 설정을 진행한다.
- General
- 설명 : 필요한 설명
- GitHub Project 체크
- Project url : 배포 자동화를 하기 위한 깃허브 레포지토리 주소
- 소스 코드 관리
- Git 선택
- Repository URL : 배포 자동화를 하기 위한 깃허브 레포지토리 주소
- Credentials :
- Add -> Add Jenkins -> Username with Password
- 깃허브 사용자 이름과 깃허브 토큰(Develoer Setting의 access token에서 받을 수 있다)
- Username과 Password 밑에 있는 ID는 Credentials을 식별하기 위한 이름같은 것이다.
- Add -> Add Jenkins -> Username with Password
- 빌드 유발
- GitHub hook trigger for GITScm polling 선택
- Build Steps
- Invoke Gradle Script 선택
- Invoke Gradle 선택 -> Gradle Version 에서 선택
- 나의 프로젝트에 맞는 버전이 아니거나 그래들이 뜨지 않는다면
- Dashboard로 나가서 Jenkins관리 -> Tools -> Gradle installations에서 내 프로젝트와 맞는 버전을 다운받아준다.
- Invoke Gradle이 아닌 Make gradlew exevutable로 체크한 경우 Make gradlew executable 체크 -> Wrapper location는 비워둔다
- Tasks -> clean build (React.js나 Next.js를 배포하게 된다면 npm install npm run build를 써주면 된다)
- 저장하고 나와서 지금 빌드 클릭 후 Console Output으로 나가서 빌드가 성공했는지 확인한다.
깃허브 웹 훅 연동
깃허브 특정 브랜치에 머지 or 푸시되면 젠킨스가 감지하여 자동 배포를 하기위해 Webhooks을 걸어준다.
이제 여기까지 하면 젠킨스 설정은 끝낫다 다음 파트에서는 스프링부트와 연결하는 부분을 다뤄볼 것이다.
'개발' 카테고리의 다른 글
@JoinColumn의 name 속성과 referencedColumnName 속성의 기본 값 (2) | 2024.11.22 |
---|---|
ansible 기본 실행 옵션 (1) | 2024.10.04 |
공통 검증 메서드 모듈화 및 메서드 분리 (0) | 2024.07.25 |
Spring Boot validation @NotBlank (0) | 2024.07.18 |
JPA N + 1 해결 (0) | 2024.07.17 |