젠킨스 설치부터 deploy ec2와 연결, plugin 설정
안녕하세요.
오늘은 젠킨스로 CI/CD 구축하겠습니다.
설치부터 ssh로 private repository와 연결, plugin 설치, node js 설정까지 진행하겠습니다.
목표
react와 spring 기능 구현이 완료되면 Github webhook과 script trigger로 젠킨스 빌드를 유도
젠킨스 파이프라인을 사용하지 않고 shell script로 진행
미리보는 회고
제가 젠킨스로 CI/CD를 구현하는 과정에서 해결했던 어려움들 입니다.
젠킨스 도커 컨테이너에서 도커를 실행할 때, docker in docker와 docker out of docker의 작동 방식 차이docker in docker 방식으로 실행되지 않은 점npm run build가 아닌 pnpm run build를 진행하기 위해 필요한 것현 시점 기준에서 pull request builder가 보안 문제로 더 이상 권장되지 않는 것
jenkins와 deploy를 개별 EC2 instance로 실행할 때 원격 명령어 실행이 안되는 것
환경
- AWS EC2
- jenkins: t2.micro
- deploy: m6i.large
- jenkins
- 2.424
- spring boot
- 3.1.1
- react
- vite
- pnpm run build
AWS EC2
실습 시작
1. AWS EC2 instance 시작
인스턴스 스펙은 아래와 같이 진행합니다.
- ubuntu 22.04.2
- t2.micro
- 네트워크 설정에서 ssh와 http 연결 허락하고 내 IP만으로 설정
- pem key 설정
- EBS: storage 30GB
탄력적 IP 설정 후 인스턴스와 연결 -> ec2 instance가 재시작하여도 public ip가 바뀌지 않도록 합니다.
※ 현 시점 기준으로 탄력적 IP는 EC2와 연결되어 있지 않으면 요금이 부과된다. 연결되어 있다면 따로 요금이 부과되지 않는다.
EC2에 접근하는 방법은 다른 포스팅을 참고하길 바랍니다.
2. 도커 설치
# 도커 공식 홈페이지를 참고하여 설치한다.
# https://docs.docker.com/engine/install/ubuntu
yes | for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt update && sudo apt install docker.io
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 유저를 docker 그룹에 포함시켜 docker 명령어 실행 시에 sudo를 붙이지 않아도 되게 설정한다.
sudo usermod -aG docker ${USER} && newgrp docker
설치가 완료되면 도커 허브에 로그인합니다.
저는 Github registry를 이용하기 때문에 다음처럼 진행했습니다.
docker login ghcr.io -u jujemu
3. 도커 컨테이너로 젠킨스 실행하기
젠킨스로 빌드하고 도커 이미지로 푸쉬할 때, docker-in-docker 방식과 docker out of docker 방식이 있습니다.
어떤 방식으로 진행하느냐에 따라서 앞으로의 진행이 달라질 수 있습니다.
두 방식으로 모두 진행해보았고 저는 docker out of docker 방식이 더 간단한 거 같습니다.
그래서 저는 docker out of docker 방식으로 진행하겠습니다.
docker in docker 방식으로 진행하면
젠킨스 컨테이너에서 도커를 다시 설치하면 됩니다.
추가로 젠킨스 CI/CD 구축을 검색해보면 bind mount 방식으로
-v /var/run/docker.sock:/var/run/docker.sock
로만 설정하는 경우가 있는데 저는 켄테이너 내부에서 도커가 실행되지 않았습니다.
스프링부트 3버전을 빌드하기 때문에 jdk17로 선택합니다.
# docker in docker
docker run -d --name jenkins --restart=always \
-p 8080:8080 -v /var/jenkins_home:/var/jenkins_home \
--privileged -e TZ=Asiz/Seoul -u root jenkins/jenkins:jdk17
# docker out of docker
docker run -d --restart=always --name jenkins -u root -p 8080:8080 \
-v jenkins-data:/var/jenkins_home -v $(which docker):/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock -v "$HOME":/home jenkins/jenkins:jdk17
4. 젠킨스 실행 후 브라우저로 접근하기
우선 EC2 보안그룹에 포트를 추가해야 젠킨스로 접근할 수 있습니다.
인바운드 규칙 편집
※ 모든 IP의 접근이 걱정된다면 내 IP 주소만으로 해도 좋으나
젠킨스의 접근은 ID/PW로 접근을 제한할 수 있고 이후 배포 스크립트를 실행할 때마다 ip를 추가해야하는 번거로움이 있다.
설정했던 탄력적 IP 주소로 접근합니다.
http://{public ip}:8080
권장되는 플러그인으로 설치
계정과 비밀번호 설정합니다. 젠킨스 접근할 때 필요합니다.
5. 젠킨스 플러그인 설치
위 그림처럼 Dashboard -> Jenkins 관리 -> Plugins로 들어갑니다.
Available plugins
- GitHub Integration
- Github webhook으로 push시에 젠킨스 빌드 트리거에 사용
- Publish Over SSH
- 젠킨스와 다른 ec2에 있는 deploy instance에 명령어를 실행시키기 위해 사용
- NodeJS
- react 빌드 시에 사용
플러그인 설치 후 Dashboard -> Jenkins 관리 -> Tools 에서 NodeJS 설정에 다음을 추가합니다.
일반 npm run build 가 아닌 pnpm 으로 빌드하기 때문에 추가합니다.
Add installer -> install from nodejs.org
- @types/react
- corepack
- pnpm
6. SSH 설정
Github private repository, deploy ec2에 연결하기 위해서 필요합니다.
우선 젠킨스 ec2 인스턴스에서 젠킨스 컨테이너로 들어갑니다.
# jenkins ec2 instance, 젠킨스 컨테이너를 실행하고 있는 호스트에서 실행
docker exec -it jenkins /bin/bash
# in jenkins container
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -f back
ssh-keygen -f front
ssh-keygen -f deploy-ec2
# 아래 private key를 복사 후, 젠킨스 credential에 넣어주기
cat back
# 아래 public key를 복사 후, Github back repository에 deploy key 추가
cat back.pub
Dashboard -> Jenkins 관리 -> Credentials로 들어가서
(global) 클릭 후 Add credential
Private Key에 Add 후, 위 private key 붙여넣습니다. front도 진행합니다.
다음으로 public key를 개발하고 있는 Github private back 레포지토리와 front 레포지토리에 settings -> deploy key에 추가합니다.
deploy ec2는 다음과 같이 진행 후, 인스턴스 꼭 재부팅 해야합니다.
# deploy instance에서 실행
vi ~/.ssh/authorized_keys
# deploy-ec2.pub, 즉 public key 등록 후 명령 모드, :wq 실행
다음으로 Dashboard -> Jenkins 관리 -> System에서 Publish over SSH 설정을 합니다.
deploy ec2 instance에 명령할 때 필요한 정보를 입력합니다.
중요한 점은 Hostname에 ip 주소를 입력하는데 private IP로 입력해야 합니다.
이제, 밑에 고급에서 Use password authentication, or use a different key 을 체크하고
back과 front의 private key를 확인했던 것처럼 deploy-ec2 private key를 확인하고 Key에 붙여넣습니다.
# jenkins container
cat ~/.ssh/deploy-ec2
설정이 잘 되었는지 확인해보겠습니다.
연결이 안되는 이유는 EC2의 보안그룹에 jenkins ec2를 추가해주지 않았기 때문입니다.
private IP로 추가하는 것도 좋지만 IP가 바뀔 수 있으므로
여기서는 젠킨스 인스턴스가 가지고 있는 보안그룹 자체를 추가하는 방법으로 진행합니다.
deploy instance의 보안그룹 설정에서 SSH 유형으로 소스에 jenkins instance가 가지고 있는 보안그룹을 지정하면 됩니다.
다시 연결을 확인해보면 정상적으로 동작하는 것을 확인할 수 있습니다.(아래 사진은 보여주기 위해 고급을 접어뒀습니다.)
여기까지 간단한 젠킨스 초기 설정을 다뤘습니다.
정리하면,
EC2 instance 시작
도커설치 후 jenkins를 실행
plugin을 설치하고 Github private repository와 deploy EC2 instance를 연결
이상입니다.
'프로젝트' 카테고리의 다른 글
[소마] 로그인 페이지 서버사이드 mvc 구현에서 endpoint 호출로 수정 (0) | 2024.01.17 |
---|---|
[소마] application.properties 에 노출되면 안되는 값을 암호화하자 (0) | 2024.01.15 |
[소마] mysql에 저장할 때, 아이콘, 이모지가 저장 안 되는 문제 해결 (0) | 2023.11.14 |
[소마] 젠킨스로 CI/CD 구현하기 - (2) 젠킨스 빌드 유도부터 배포 완료 (0) | 2023.09.29 |
[소마] 세팅하지 않은 alias 문제와 alias command (0) | 2023.06.28 |