티스토리 뷰

728x90
반응형

 

개발 환경

젠킨스 서버 : 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

 

Docker - Mysql 설치 방법

이번에는 docker에서 mysql을 설정하는 방법을 알아보겠습니다. Docker 설치 # 1.yum 패키지 업데이트 업그레이드 vi 설치 sudo apt-get update sudo apt-get upgrade sudo apt-get install vim # 2.Docker & Doc..

kdg-is.tistory.com

 

도커 기본 명령어

https://kdg-is.tistory.com/273

 

Docker - Docker 기본 명령어

도커 기본 명령어 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 --name mysql-container -v ~/mysqldata/:/var/lib/mysql mysql:8.0.28 옵션 설명 -d detached mode (백그라운드 모드) -p 호스트와..

kdg-is.tistory.com

 

도커 이미지에 대해

https://kdg-is.tistory.com/275

 

Docker - 이미지란

이미지란? 이미지란 프로세스가 실행되는 파일들의 집합입니다. 예를들어 리눅스서버가 실행되기 위해서는 무수히 많은 파일들이 있는데 해당 모든 파일들을 압축하여 이미지를 만든다고 생각

kdg-is.tistory.com

 

728x90
반응형

'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