Skip to content

AWS 인스턴스 배포 및 젠킨스를 활용한 CI CD 설정

joanne edited this page Jul 8, 2021 · 2 revisions

AWS 인스턴스 배포 및 젠킨스를 활용한 CI/CD 설정

AWS 인스턴스 배포하기

  1. 인스턴스를 생성한다.
  2. 도커를 설치한다.
sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. 내도메인.한국을 이용해 도메인을 생성한다.
// 고급 설정
IP연결(A)에 연결할 인스턴스의 public IP를 작성한다.
  1. TLS를 설정한다.
sudo docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d 'yourdomain.com' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory


TLS 명령 실행 중 나오는 값을 고급 설정>TXT 필드에 각각 구분하여 입력한다.
  1. 인증서를 현재 경로로 옮긴다.
cp /etc/letsencrypt/live/[도메인주소]/fullchain.pem ./ &&
cp /etc/letsencrypt/live/[도메인주소]/privkey.pem ./
  1. DockerFile을 생성한다.
vi DockerFile

// 내용
FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf 
COPY fullchain.pem /etc/letsencrypt/live/[도메인주소]/fullchain.pem
COPY privkey.pem /etc/letsencrypt/live/[도메인주소]/privkey.pem
  1. nginx.conf 파일을 작성한다.
vi nginx.conf

// 내용
events {}

http {       
  upstream app {
    server 172.17.0.1:8080;
  }
  
  # Redirect all traffic to HTTPS
  server {
    listen 80;
    return 301 https://$host$request_uri;
  }

  server {
    listen 443 ssl;  
    ssl_certificate /etc/letsencrypt/live/[도메인주소]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[도메인주소]/privkey.pem;

    # Disable SSL
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # 통신과정에서 사용할 암호화 알고리즘
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    # Enable HSTS
    # client의 browser에게 http로 어떠한 것도 load 하지 말라고 규제합니다.
    # 이를 통해 http에서 https로 redirect 되는 request를 minimize 할 수 있습니다.
    add_header Strict-Transport-Security "max-age=31536000" always;

    # SSL sessions
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;      

    location / {
      proxy_pass http://app;    
    }
  }
}
  1. 도커 컨테이너를 띄운다.
sudo docker build -t nextstep/reverse-proxy:0.0.2 . && \
sudo docker run -d -p 80:80 -p 443:443 --name proxy nextstep/reverse-proxy:0.0.2
  1. 운영 DB를 설치한다.
sudo apt update && sudo apt install mysql-server
  1. 운영 DB에 사용자 및 데이터베이스를 등록한다.
sudo mysql -uroot -p

create user '{MySQL 유저명}'@'{WAS Server Private IP}' identified by '{MySQL 유저 password}';
CREATE DATABASE {schema} DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all privileges on {schema}.* to {MySQL 유저명}@'{WAS Server Private IP}';
flush privileges;
  1. 자바 설치
sudo apt update && sudo apt install default-jre && sudo apt install default-jdk
  1. 빌드
./gradlew clean build

// jar file 찾기
find ./* -name "*jar"

// 실행
nohup java -jar -Dspring.profiles.active=dev [jar파일명] 2>&1 &

젠킨스 CI/CD 설정하기

상황 가정: 젠킨스 인스턴스와 서버 인스턴스가 구분되어있다.
디렉토리 구조가 gradle이 최상위가 아닌 backend 폴더에 포함되어있다.

젠킨스 자동배포 1편까지는 동일하게 진행한다.
젠킨스 자동배포 2편에서는 다음과 같은 부분에서 변경 사항이 발생한다.

변경 사항 - 아이템 설정

소스코드 관리 - Add Credentials

아이템의 소스코드 관리에서 Credentials를 Add할 때 다음과 같이 진행한다.

  1. Kind에서 Username with password를 선택한다.
  2. Username에는 깃허브 아이디, Password에는 깃허브 패스워드를 기입한다.

Build

Use Gradle Wrapper를 선택한 뒤, Make gradlew executable을 체크하고 Wrapper location에 다음과 같이 기입한다.

${workspace}/backend

Tasks에는 clean build를 작성한다.

빌드 후 조치 - Transfers

// Source files
backend/build/libs/*.jar

// Remove prefix
backend/build/libs

// Remote directory
/deploy (작성하지 않으면 최상위 폴더로 jar이 온다)

// Exec command
sh /home/ubuntu/{실행할 스크립트 명}.sh 

고급을 누른다.
// Exec timeout
0
Clone this wiki locally