๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“š ์‹œ๋ฆฌ์ฆˆ/- Jenkins์™€ Webhook์„ ์ด์šฉํ•œ CICD

[Webhook์„ ์ด์šฉํ•˜์—ฌ CI CD ๊ตฌ์„ฑํ•˜๊ธฐ] - Dockerizing ๋ฐ Nginx ์„ค์ •

by Wonit 2021. 8. 30.

ํ•ด๋‹น ๊ธ€์€ Jenkins์™€ Github Webhook์„ ์ด์šฉํ•œ CICD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑํ•˜๊ธฐ ์‹œ๋ฆฌ์ฆˆ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

๋งŒ์•ฝ ํ•ด๋‹น ์‹ค์Šต ๋‚ด์šฉ์˜ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๊นƒํ—ˆ๋ธŒ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ˆœ์„œ

  • ํ”„๋ก ํŠธ ๋„์ปค๋ผ์ด์ง•
  • gradle ์„ค์น˜
  • ๋ฐฑ์—”๋“œ ๋„์ปค๋ผ์ด์ง•
  • nginx ๋ฆฌ๋ฒ„์Šคํ”„๋ก์‹œ ์„ค์ •ํ•˜๊ธฐ

 

์ด๋ฒˆ ์‹œ๊ฐ„์€ ์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ๋งŒ๋“  ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ ํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก SPEC ์„ ๋ช…์‹œํ•˜๋Š” Dockerfile ์„ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค.

 

๋˜ํ•œ EC2 ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” Nginx ๋ฅผ ์ด์šฉํ•ด์„œ Reverse Proxy ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๊ณ  Front์™€ Back ์„ ๊ฐ๊ฐ ์—ฐ๊ฒฐ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

 

1. ํ”„๋ก ํŠธ์—”๋“œ ๋„์ปค๋ผ์ด์ง•

 

์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ์‹œ๊ฐ„๋ถ€ํ„ฐ ๋งŒ๋“  ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์„œ Dockerfile ์„ ์ƒ์„ฑํ•˜์ž.

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œํ•ด์ค€๋‹ค.

 

FROM node:latest

WORKDIR /frontend

COPY ./package*.json /frontend

RUN npm install

COPY / /frontend

RUN npm run build

CMD ["npx", "serve", "-s", "build"]

EXPOSE 5000

 

์œ„์˜ Dockerfile์„ ๊ฐ„๋žตํžˆ ํ•ด์„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  • WORKDIR /frontend : ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ working directory๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • COPY ./package*.json /frontend : ์˜์กด์„ฑ ๋ชฉ๋ก์ด ์žˆ๋Š” package.json ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  • RUN npm install : package.json ์— ๋ช…์‹œ๋œ ์˜์กด์„ฑ๋“ค์„ ์„ค์น˜ํ•œ๋‹ค.
  • COPY / /frontend : HOST PC์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  • RUN npm run build : npm์œผ๋กœ build๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • CMD ["npx", "serve", "-s", "build"] : serve ๋กœ build ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์žˆ๋Š” ํŒŒ์ผ๋กœ ์›น ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • EXPOSE 5000 : 5000 ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค

 

ํ•ด๋‹น ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ docker build ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์ธ์ž ๊ฐ’๋“ค์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๋ฐ, ๋‹ค์Œ์— CICD ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ตฌ์„ฑ๋  ๋•Œ git ์—์„œ pull ํ•œ ์ฝ”๋“œ๋“ค์„ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…์— ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.

 

2. gradle ์„ค์น˜

 

์šฐ๋ฆฌ๊ฐ€ CICD ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๊ณ  ๋ฐฑ์—”๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๊ธฐ ๊นŒ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

 

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ git commit์„ ํ•œ๋‹ค.
  2. github webhook ์ด ์ด๋ฅผ ์ธ์ง€ํ•œ๋‹ค.
  3. jenkins ๊ฐ€ commit ๋œ ์ฝ”๋“œ๋ฅผ git pull ํ•œ๋‹ค
  4. gradle build ๋ฅผ ๊ฑฐ์นœ๋‹ค.
  5. dockerfizing ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ 4๋ฒˆ์งธ ๊ณผ์ •์„ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ์˜ ์šด์˜ ์„œ๋ฒ„, ์ฆ‰ EC2 ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ Build ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” Build ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๋‚˜๋Š” Gradle ์„ ์ด์šฉํ•  ์˜ˆ์ •์ด๋‹ˆ ssh๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€๋กœ ์ ‘์†ํ•˜์ž.

 

๊ทธ๋ฆฌ๊ณ  gradle ์„ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, apt ์—์„œ ์ œ๊ณตํ•˜๋Š” gradle ์€ 4์ ๋Œ€ ๋ฒ„์ „์œผ๋กœ ํ˜„์žฌ ๋ฒ„์ „์˜ Spring Boot Application ์„ ๋นŒ๋“œํ•˜๋Š”๋ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ˆ˜๋™์œผ๋กœ gradle ์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

 

$ sudo apt install -y gradle

$ wget https://services.gradle.org/distributions/gradle-7.1.1-bin.zip -P /tmp

$ sudo apt install -y unzip
$ sudo unzip -d /opt/gradle /tmp/gradle-7.1.1-bin.zip

$ sudo ln -s /opt/gradle/gradle-7.1.1 /opt/gradle/latest

 

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ gradle ํ™ˆํŽ˜์ด์ง€์—์„œ ์ง์ ‘ ๋‹ค์šด๋ฐ›๊ณ  zip์„ ํ•ด์ œํ•˜๋ฉฐ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์ž.

 

๊ทธ๋ฆฌ๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ gradle ์„ ์ž…๋ ฅํ•ด์„œ gradle.sh ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ์„ค์น˜ํ•œ ๋ฒ„์ „์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.

 

$ sudo gedit /etc/profile.d/gradle.sh

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์ž

 

export GRADLE_HOME=/opt/gradle/latest
export PATH=${GRADLE_HOME}/bin:${PATH}

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ , source ๋ช…๋ น์–ด๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค

 

$ sudo chmod +x /etc/profile.d/gradle.sh

$ source /etc/profile.d/gradle.sh

 

๊ทธ๋ฆฌ๊ณ  gradle ๋กœ ๋ฒ„์ „์„ ํ™•์ธํ•˜๋ฉด 7.1.1 ๋ฒ„์ „์ด ์ž˜ ์„ค์น˜๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋ฐฑ์—”๋“œ ๋„์ปค๋ผ์ด์ง•

 

์ด์ œ ๋‹ค์‹œ github ์— ์žˆ๋Š” ์šฐ๋ฆฌ์˜ ๋ฐฑ์—”๋“œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค Dockerfile์„ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

์šฐ๋ฆฌ๋Š” ์šด์˜ ์„œ๋ฒ„, ์ฆ‰ EC2 ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ Build๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค.

 

/backend ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ฐ€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์ž.

 

FROM openjdk:17-ea-11-jdk-slim

WORKDIR /server

COPY ./build/libs/jenkins-cicd-todo-0.0.1-SNAPSHOT.jar todo-server.jar

ENTRYPOINT ["java", "-jar", "todo-server.jar"]

 

ํ•ด๋‹น ํŒŒ์ผ์— ๋ช…์‹œ๋œ ์ •๋ณด๋กœ ๋ณด์ž๋ฉด /backend ๋””๋ ‰ํ† ๋ฆฌ์—์„œ docker build . ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด /backend/build/libs ์•„๋ž˜์— ์žˆ๋Š” jar ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ์ ์— jar๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

 

4. Nginx ๋ฆฌ๋ฒ„์Šคํ”„๋ก์‹œ ์„ค์ •ํ•˜๊ธฐ

 

์ด์ œ nginx ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

ssh ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ด์šฉํ•ด์„œ EC2 ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  /etc/nginx ์œผ๋กœ ์ด๋™ํ•ด๋ณด์ž ๊ทธ๋Ÿผ nginx.conf ํŒŒ์ผ์ด ์žˆ์„ํ…๋ฐ, ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด nginx.conf ํŒŒ์ผ์„ ๋งŒ๋“ค์ž.

 

$ cd /etc/nginx
$ sudo rm nginx.conf

$ sudo vi nginx.conf

 

ํ•ด๋‹น ํŒŒ์ผ์—์„œ reverse proxy ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ค์Œ์„ ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์–ด์ค€๋‹ค.

 

worker_processes  1;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  upstream front-server {
    server 127.0.0.1:5000;
    keepalive 100;
  }

  upstream backend-server {
    server 127.0.0.1:8080;
    keepalive 100;
  }

  server {
    listen 80;
    server_name localhost;

    location / {
      proxy_pass http://front-server;

      proxy_set_header HOST $host;
      proxy_set_header Referer $http_referer;
    }

    location /api {
      proxy_pass http://backend-server;

      proxy_set_header HOST $host;
      proxy_set_header Referer $http_referer;
    }

    error_page 500 502 503 504 /50x.html;
    location = 50x.html {
      root /usr/share/nginx/html;
    }
  }
}

 

๊ทธ๋ฆฌ๊ณ  sudo systemctl reload nginx ๋ฅผ ์ด์šฉํ•ด์„œ nginx ๋ฅผ ์žฌ์‹คํ–‰ํ•˜๊ณ  ec2 ์ธ์Šคํ„ด์Šค์— 80 ํฌํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด nginx ๊ฐ€ 502 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•œ๋‹ค๋ฉด ์ •์ƒ์ด๋‹ค!

 

๋Œ“๊ธ€