티스토리 뷰
개발 환경
젠킨스 서버 : Aws Ubuntu Server 18.04 LTS, t2.micro
개발 서버 : Aws Ubuntu Server 18.04 LTS, t2.micro
Spring boot
JDK 11
Gradle
Git Hub
Docker Hub
Step 01 - Jenkins EC2 스왑 과정(생략 가능)
프리티어 EC2 메모리 부족 해결하기
프리티어 EC2 메모리 부족 해결하기
- 현재 젠킨스 서버로 사용하는 프리티어 EC2는 젠킨스를 버틸 수 없습니다. 젠킨스를 도커로 띄우고 설정까지는 문제가 없으나 깃허브 웹훅으로 젠킨스를 이용해 spring을 빌드하는 과정에서 램을 1기가 이상(프리티어 EC2 램은 1기가) 사용하게 되면서 EC2가 먹통이 되어버립니다. 이 문제의 해결 방안으로는 리눅스의 하드디스크를 가상 메모리로 전환시켜 사용할 수 있다는 점을 이용하면 됩니다.
AWS에서는 메모리의 양에 따라 스왑 메모리의 크기를 아래와 같이 권장하고 있습니다.
1. 스왑 파일 생성하기
- 아래 명령은 시간이 약 10~20초 정도 걸리므로 여유있게 기다리면 됩니다.
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
2. 스왑 파일에 대한 일기 쓰기 권한 업데이트하기
sudo chmod 600 /swapfile
3. Linux 스왑 영역 설정하기
sudo mkswap /swapfile
4. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 하기
sudo swapon /swapfile
5. 절차가 성공했는지 확인하기
sudo swapon -s
6. /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 활성화하기
# 1.파일 열기
sudo vi /etc/fstab
# 2.파일 가장 마지막에 다음을 추가하고 :wq로 저장하고 종료
/swapfile swap swap defaults 0 0
7. free 명령어로 메모리 확인하기
free
Step 02 - Jenkins 서버 설정
1. jdk 11 설치 및 젠킨스 설치
# 1. 기존 페키지 업데이트 및 업그레이드
sudo apt-get update -y && apt-get upgrade -y
# 2. 자바 11버전의 JDK 설치
sudo apt install openjdk-11-jdk
# 3. 패키지에 젠킨스 추가, 해당 명령어가 성공시 OK 출력됨
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
# 4. 패키지에 추가
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
# 5. 젠킨스 설치
sudo apt update
sudo apt install jenkins
# 6. 젠킨스가 성공적으로 설치가 되었다면 아래 명령어를 통해 현재 젠킨스의 상태 확인
sudo systemctl status jenkins.service
# 7. 도커 설치
sudo curl -s https://get.docker.com/ | sudo sh
# 8. 도커 시작
sudo systemctl start docker
# 참고 - 젠킨스 시작 및 중지 방법
sudo systemctl stop jenkins.service
sudo systemctl start jenkins.service
sudo systemctl enable jenkins.service
2. EC2 Jenkins 인스턴스의 인바운드 규칙에 8080을 열어줍니다.
- jenkins 인스턴스의 인바운드 규칙에 8080 포트를 여는 이유는 jenkins는 기본적으로 8080 포트를 사용합니다.
3. jenkins 페이지 접속
- 해당 url로 접근시 비밀번호를 입력해야 합니다.
- sudo cat /var/lib/jenkins/secrets/initialAdminPassword 명령어를 통하여 비밀번호가 확인 가능합니다.
4.젠킨스에 필요한 플러그인 설치
- install suggested plugins를 클릭하여 필요한 플러그인을 설치합니다.
5.젠킨스에 필요한 플러그인 설치 과정
- 열심히 플러그인을 다운로드 하고 있습니다.
6.젠킨스에 계정 생성
- 계정명 - KDG
- 암호 - 12345
- 이름 - KDG-IS
- 이메일 주소 - KDG~
7.젠킨스의 URL 설정
- 젠킨스에 접속할 수 있는 url을 설정할 수 있습니다. 기본적으로 따로 설정을 하지 않는것이 좋습니다.
8.젠킨스를 사용할 준비가 완료되었습니다.
9.젠킨스에 사용할 플러그인을 설치해야 합니다.
- 젠킨스는 조금 더 편하게? 사용할 수 있도록 많은 플러그인을 제공해주고 있습니다. 여기서 우리는 Publish Over SSH를 다운 받아야합니다.
10.Publish Over SSH 플러그인 설치
- ssh를 검색 한 후 체크를 한 뒤 Install without restart 버튼을 클릭해줍니다.
💡 지금까지 우리는 젠킨스를 설치하고 젠킨스 페이지에 접속하여 기초적으로 필요한 플러그인을 설치하는 과정을 진행하였습니다. 지금부터는 젠킨스 서버에 SSH 키를 생성하고 등록하는 방법을 알아보겠습니다.
11.Jenkins Server SSH Key 생성 및 등록
- 왜 SSH Key를 생성하고 어디에 사용을 할까?
- Jenkins에서 GitHub에 접근하기 위해서는 SSH 키를 깃허브에 등록해야 합니다.
- Docker에서 Jenkins를 적재할때는 볼륨(v) 옵션을 사용하여 마운트를 해둔 상태이므로 호스트 PC에서 SSH 키 생성을 대행할 수 있습니다.
sudo mkdir /home/jenkins/.ssh
sudo chmod 700 /home/jenkins/.ssh
sudo ssh-keygen -t rsa
진행하면 아래의 저장 경로와 키파일 이름을 설정하는 구간이 나옵니다. 다음과 같이 지정합니다.
Enter file in which to save the key (/root/.ssh/id_rsa): /home/jenkins/.ssh/id_rsa
12.Jenkins에게 root 권한 부여
vi /etc/sudoers
# 맨 아래 추가
jenkins ALL=(ALL) NOPASSWD: ALL
13. Jenkins 서버의 id_rsa.pub의 키를 복사하여 개발 서버에 등록합니다.
- 아까 jenkins 서버에서 /home/jenkins 디렉토리에 id_rsa 키를 생성했습니다.
- jenkins 서버에서 생성한 키를 개발 서버에 등록해줍니다.
- 개발 서버에 등록할때는 아래 위치에 등록합니다.
cd ~
cd .ssh/
vi authorized_keys
// 맨 밑에 키를 등록합니다.
14.이어서 남은 젠킨스를 설정합니다.
- 지금까지는 젠킨스 서버의 키를 생성한 다음 개발 서버와 커플링을 하는 작업을 진행 했습니다. 지금부터는 젠킨스에 Git Hub Repository를 등록하고 젠킨스 서버와 어떻게 연동을 하는지 알아보겠습니다.
- 젠킨스 관리 > 시스템 설정을 클릭해줍니다.
15.Publish Over SSH 설정
- 맨 아래쪽으로 이동하면 Publish Over SSH를 설정하는 공간이 있습니다. 여기에 Remote 서버에 대한 정보를 입력해야합니다.
- Key는 젠킨스 서버에서 생성한 /home/jenkins/.ssh 경로에 있는 id_rsa 파일에 있는 내용을 입력해야 합니다.
- SSH Servers에 대한 내용
- Name은 본인이 사용하고자 하는 임의의 이름을 설정해주면 됩니다.
- HostName 은 실제로 접속할 원격 서버의 private ip를 입력하면 됩니다.
- UserName 은 접속할 원격 서버의 user 이름입니다.
Step 03 - Spring Boot 프로젝트 연동
1.개발 서버에 8080 포트 열어주기
2.Dockerfile 작성
- Spring boot 최상단에 Dockerfile을 만들고 아래와 같은 코드를 작성합니다.
FROM openjdk:11-jre-slim-buster
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
3.해당 프로젝트를 Github에 push
4.Git Token 발급
- Github Settings -> Developer settings -> Personal access token 항목에 들어갑니다
jeknins로 repository의 코드를 build, deploy등을 할 거여서 repo 권한 전체를 주었습니다
생성된 키 ⇒ xxxxYYYYzzz
키는 다음에 다시 확인할 수 없으니 반드시 복사하여 어딘가 저장해두어야 합니다.
5.Git Token 발급 + Jenkins Credential 등록
Credential 추가를 해주면 됩니다
- Kind : Username with Password를 선택합니다.
- Username : 본인의 깃 허브 아이디를 입력합니다.
- Password : 이전에 발급받은 GutHub Token 값을 입력합니다.
- ID : 원하는 값으로 설정하며, git이 jenkins에게 Credenial을 줄 때 인식할 수 있도록 합니다.
6.젠킨스에 해당 Git Repository 등록
7.설정 후 빌드 테스트 진행
8.테스트 성공 후 추가적인 설저
- 구성 파일 수정전 먼저 젠킨스 서버에서 도커 허브에 로그인을 해줍니다.
- 이때 미리 도커 허브에 가입이 되어 있어야 로그인이 가능합니다.
- 로그인에 성공한다면 다시 젠킨스 구성 파일로 가서 Build 부분을 수정해줍니다.
- 저는 Spring boot 배포시 Gradle을 사용하므로 Use Gradle Wrapper 클릭 후 Tasks에 build를 입력합니다.
- Add build step을 클릭하고 Execute shell을 클릭하여 추후 설정을 해줍니다.
*참고 ) 도커 허브에 dev라는 repository를 만들고 진행해야합니다.
./gradlew clean build
echo " Execute shell start"
# 도커 빌드와 개시 삭제
sudo docker build --no-cache -t cova1256/dev .
# 기존 서버에 있는 컨테이너 중지
sudo docker stop spring-container || true
#기존 서버에 있는 컨테이너 삭제
sudo docker rm -f spring-container || true
# 도커 로그인
sudo docker login -u cova1256 -p password 입력
# 도커 이미지 태그 설정 및 태그가 없다면 오류가 발생해도 넘어가도록 true 처리
sudo docker image tag dev cova1256/dev || true
# 도커 허브에 나의 레포지토리에 도커 푸시
sudo docker push cova1256/dev
# 푸시 후 빌드한 이미지 삭제
sudo docker rmi -f cova1256/dev || true
echo " Execute shell end"
빌드 후 조치
echo " 빌드 후 조치 start"
# 기존에 있는 이미지를 삭제합니다.
sudo docker rmi -f cova1256/dev || true
# 기존에 있는 컨테이너를 중지합니다.
sudo docker stop spring-container || true
# 기존에 있는 컨테이너를 삭제합니다.
sudo docker rm -f spring-container || true
# 컨테이너를 설치하고 실행합니다.
sudo docker run -d -p 8080:8080 --name spring-container cova1256/dev
# none인 이미지 삭제
sudo docker rmi $(docker images -q -f dangling=true)
echo " 빌드 후 조치 end"
9.개발 서버에 도커 설치 및 세팅
sudo apt-get update
sudo apt-get upgrade
# 2.Docker & Docker Registry 설치
sudo curl -s https://get.docker.com/ | sudo sh
# 3.docker start
sudo systemctl start docker
10.빌드 성공 시 개발 서버에서의 도커 확인
- 젠킨스 서버에서 빌드 시 개발 서버에 자동으로 구축이 되도록 하였습니다. 그래서 docker ps 명령어 입력시 cova1256/dev가 있는것을 확인할 수 있습니다.
11.접속이 되는지 확인해 봅니다.
- 개발 서버의 퍼블릭 IPv4 주소:8080으로 접속하면 아래와 같은 화면을 확인할 수 있습니다.
Docker 관련 명령어
# 해당 도커 컨테이너의 로그를 확인합니다.
docker logs 도커 컨테이너 이름
# 해당 도커 컨테이너를 중지시킵니다.
docker stop 도커 컨테이너 이름
# 해당 도커 컨테이너를 삭제시킵니다.
docker rm 도커 컨테이너 이름
Docker에 Mysql 설치 방법입니다.
https://kdg-is.tistory.com/111
도커 기본 명령어
https://kdg-is.tistory.com/273
도커 이미지에 대해
https://kdg-is.tistory.com/275
'CI&CD' 카테고리의 다른 글
React Nginx Docker 최적화 이미지 빌드 (2) | 2022.03.10 |
---|---|
Docker - 이미지란 (0) | 2022.03.09 |
React & Docker & Jenkins CI&CD 배포 방법 (0) | 2022.03.08 |
Docker - Docker 기본 명령어 (0) | 2022.03.05 |
Docker - Mysql 설치 방법 (2) | 2022.02.24 |
- Total
- Today
- Yesterday
- redis 대기열 구현
- pipe and filter architecture
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot redisson sorted set
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- 공간 기반 아키텍처
- 람다 표현식
- transactional outbox pattern
- redis sorted set
- spring boot redis 대기열 구현
- 서비스 기반 아키텍처
- spring boot excel download paging
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot 엑셀 다운로드
- 레이어드 아키텍처란
- spring boot redisson 분산락 구현
- polling publisher spring boot
- spring boot excel download oom
- service based architecture
- spring boot poi excel download
- @ControllerAdvice
- java userThread와 DaemonThread
- microkernel architecture
- redis sorted set으로 대기열 구현
- pipeline architecture
- spring boot redisson destributed lock
- space based architecture
- transactional outbox pattern spring boot
- java ThreadLocal
- 자바 백엔드 개발자 추천 도서
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |