๐Ÿ—๏ธ Jenkins๋ฅผ ์ด์šฉํ•œ SSH ํ†ต์‹ ์„ ํ†ตํ•ด AWS EC2 ์„œ๋ฒ„ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑํ•˜๊ธฐ

2022๋…„ 7์›” 15์ผ

๋“ค์–ด๊ฐ€๋ฉฐ

์—ฌ๋Ÿฌ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ์ค‘ Jenkins๋กœ Build ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ SSH ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ง์ ‘ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ์ƒ ์ด์Šˆ๋กœ ์ธํ•ด ๊ถŒ์žฅํ•˜๋Š” ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ๋ฐฐํฌ ๋ฐฉ์‹ ์ค‘ ์ด๋Ÿฐ ๋ฐฉ์‹๋„ ์žˆ๋‹ค ๋ผ๋Š” ์ ์„ ์•Œ์•„์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Process

process

๋จผ์ € Process๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ฐœ ์™„๋ฃŒ๋œ ์ฝ”๋“œ๋ฅผ git์„ ํ†ตํ•ด ์ €์žฅ์†Œ์— push ํ•ฉ๋‹ˆ๋‹ค.
  2. gitlab์€ push event๋ฅผ trigger ํ•˜๋ฉฐ, push ๋ช…๋ น์ด ๊ฐ์ง€๋˜๋ฉด jenkins์— webhook์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  3. jenkins๋Š” gitlab์œผ๋กœ ๋ถ€ํ„ฐ webhook์„ ์ˆ˜์‹ ํ•˜๊ฒŒ๋˜๋ฉด build๋ฅผ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ค์ •ํ•ด๋†“์€ build process์— ๋”ฐ๋ผ build๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. build๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด SSH ํ†ต์‹ ์„ ํ•˜์—ฌ AWS EC2๋กœ ์ƒ์„ฑ๋œ server์— ๊ฒฐ๊ณผ๋ฌผ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

Jenkins build Pipeline Setting

build setting

Gitlab Webhook Setting

image_2

๋จผ์ € webhook์œผ๋กœ ์—ฐ๋™๋  gitlab repository ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.

Credentials๊ฐ€ Jenkins์— ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ gitlab์—์„œ Webhook ์ „์†ก์„ ํ• ๋•Œ์— ์ธ์ฆ์ด ๋˜๋‹ˆ ๊ผญ ๋จผ์ € ์„ค์ •ํ•ด์ฃผ์„ธ์š” !

image_1

Gitlab Repository๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Jenkins์˜ build ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํŠน์ • Parameter๊ฐ€ ์ „๋‹ฌ๋˜์—ˆ์„๋•Œ ์‹คํ–‰๋˜๋Š” ์กฐ๊ฑด์„ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค.

gitlab repository์—์„œ develop์œผ๋กœ push๋œ commit์„ webhook์œผ๋กœ ๋ฐœ์†กํ• ๋•Œ์— Jenkins์—์„œ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด branch : develop ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Jenkins์—์„œ๋Š” develop branch์— ๊ด€ํ•œ webhook๋งŒ ๊ฐ์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

image_3

๋นŒ๋“œ ์œ ๋ฐœ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„ค์ •์€ Gitlab์—์„œ Webhook์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ• ๋•Œ์— ์–ด๋–ป๊ฒŒ ํ—ˆ์šฉํ• ๊ฑด์ง€์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋งจ ํ•˜๋‹จ์— ๋ณด์‹œ๋ฉด Secret token ์ƒ์„ฑ ์นธ์ด ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ๊ฐ’์„ gitlab webhook ์„ค์ •ํ™”๋ฉด์—์„œ secret token ์ž…๋ ฅ์นธ์— ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

gitlab

๊ทธ ํ›„ Gitlab Repository์˜ Webhook ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•˜์—ฌ URL์—๋Š” Jenkins Project URL์„ ์ž…๋ ฅํ•˜๊ณ , Scret Token์—๋Š” ์œ„์—์„œ ์ƒ์„ฑ๋œ Secret Token๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

์ž! ์ด๋Ÿฌ๋ฉด Jenkins์™€ Gitlab์˜ Wehook ์—ฐ๋™์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Gitlab reposiory์—์„œ ํŠน์ • branch(์—ฌ๊ธฐ์„  develop)์— git push ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Jenkins์— Webhook์„ ๋ฐœ์†กํ•˜์—ฌ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

jenkins build

์ด ๋ถ€๋ถ„์€ build ์„ค์ • ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” node.js๊ธฐ๋ฐ˜์˜ Vue.js ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— Jenkins ์—์„œ node.js๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋กœ build๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

image_4

Jenkins Market Place์—์„œ Node.js๋ฅผ ์„ค์น˜ํ•ด์ฃผ์‹  ํ›„ ํ•ด๋‹น Jenkins ํ”„๋กœ์ ํŠธ์—์„œ Provide ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.

image_11

๊ทธ ํ›„ Build ํƒญ์—์„œ Script๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

npm install yarn -g
yarn cache clean
yarn install
yarn build:test

image_5

๊ทธ ํ›„ chmod ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น direcoty์˜ ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. directory์˜ ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•ด์ฃผ์…”์•ผ SSH ํ†ต์‹ ์„ ํ†ตํ•ด AWS EC2 ์„œ๋ฒ„๋กœ build๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

node.js ๊ธฐ๋ฐ˜์˜ Vue.js ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฌผ์ธ dist ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SSH setting

์ด์ œ๋Š” SSH Plugin์„ ์ด์šฉํ•˜์—ฌ AWS EC2์— ์ ‘์†ํ•œ ํ›„ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜ฎ๊ฒจ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

image_6

๋จผ์ € ํ•ด๋‹น AWS EC2์˜ ์„œ๋ฒ„์— ์ ‘์†์„ ํ•œ ํ›„ ssh-keygen ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด rsa key๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

image_8

์ƒ์„ฑ๋œ rsa-key๋Š” ์œ„์˜ ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ~/.ssh ๊ฒฝ๋กœ์—์„œ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image_9

$ vim id_rsa.pub

id_rsa.pub ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ์ƒ์„ฑ๋œ ssh-key๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

image_10

๊ทธ ํ›„ Jenkins๋กœ ๋Œ์•„์™€ SSH Server ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.

  • Hostname : AWS EC2์˜ IP์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • Username : AWS EC2์˜ User๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„  Ubuntu)
  • Remote Directory : ์ ‘์†ํ•˜์˜€์„๋•Œ์˜ ์ฒซ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. use Password Authenticaton, or use a different Key ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ์„ ํƒ ํ•œ ํ›„ Key ์ž…๋ ฅ์นธ์— ์œ„์—์„œ ์ƒ์„ฑํ•ด๋†“์€ ssh-rsa ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์‹œ๋ฉด Jenkins SSH Publish ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!! ๐ŸŽ‰๐ŸŽ‰

์ด์ œ Jenkins์—์„œ build๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด SSH ํ†ต์‹ ์œผ๋กœ AWS EC2 ์„œ๋ฒ„์— ์ ‘์† ํ•œ ํ›„ ์„ค์ •ํ•ด๋†“์€ ๊ฒฝ๋กœ์— build ๊ฒฐ๊ณผ๋ฌผ์„ ์ „์†กํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค !

Deploy

๋ชจ๋“  ์„ค์ •์„ ๋งˆ์นœ ํ›„ ํ•œ๋ฒˆ develop branch์— PUSH๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

image_12

์ •์ƒ์ ์œผ๋กœ build๊ฐ€ ์™„๋ฃŒ๊ฐ€ ๋œ ํ›„ SSH ํ†ต์‹ ์„ ํ†ตํ•ด file์„ ์ „์†กํ•œ log๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜Ž๐Ÿ˜Ž

๋งˆ์น˜๋ฉฐ

์‚ฌ์‹ค ๋ณด์•ˆ์ƒ์˜ ์ด์Šˆ๋กœ ์ธํ•ด Jenkins์—์„œ SSH Publish ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค,,ใ…Žใ…Ž

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•ด๋ณด๊ณ  ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋Š” ์ด์œ ๋Š” "์ด๋Ÿฌํ•œ ๋ฐฐํฌ ๋ฐฉ์‹๋„ ์žˆ์—ˆ๋‹ค."๋ผ๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜บ๐Ÿ˜บ