Day 17

Travis CI ๋ฐฐํฌ ์ž๋™ํ™”

CI, CD ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํŽธ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•จ

  • CI(Continuous Integration - ์ง€์†์  ํ†ตํ•ฉ) : ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” VCS ์‹œ์Šคํ…œ(Git, SVN ๋“ฑ)์— PUSH ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ์•ˆ์ •์ ์ธ ๋ฐฐํฌ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •

  • CD(Continuous Deployment - ์ง€์†์ ์ธ ๋ฐฐํฌ) : CI์˜ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ ์šด์˜ ์„œ๋ฒ„์— ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๊นŒ์ง€ ์ง„ํ–‰๋˜๋Š” ๊ณผ์ •

ํ˜„๋Œ€์˜ ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰

โ†’ ๊ฐœ๋ฐœ์ž ๊ฐ์ž๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋ฅผ ํ•ฉ์ณ์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ํฐ์ผ์ด์˜€๋‹ค.

์ด๋ฅผ CI๊ฐ€ ๊ฐœ๋ฐœ๋จ์— ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž ๊ฐ์ž๊ฐ€ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง

CD ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€. 1,2๊ฐœ์˜ ์„œ๋ฒ„์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ• ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์„œ๋ฒ„์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๊ธ‰ํ•  ๊ฒฝ์šฐ์—”ใ„ด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋˜ํ•œ ์ž๋™ํ™”๋ฅผ ์‹œ์ผœ๋ฒ„๋ฆผ

CI ๋„๊ตฌ๋ฅผ ๋„์ž…ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ CI๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค

CI์˜ 4๊ฐ€์ง€ ๊ทœ์น™

  • ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์‚ด์•„์žˆ๊ณ (์‹คํ–‰๋˜๊ณ ) ๋ˆ„๊ตฌ๋“  ํ˜„์žฌ์˜ ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์ง€์ ์„ ์œ ์ง€ํ•  ๊ฒƒ

  • ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•ด์„œ ๋ˆ„๊ตฌ๋“  ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ์„ ๋นŒ๋“œํ•˜๋Š” ๋‹จ์ผ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ๊ฒƒ

  • ํ…Œ์ŠคํŒ…์„ ์ž๋™ํ™”ํ•ด์„œ ๋‹จ์ผ ๋ช…๋ น์–ด๋กœ ์–ธ์ œ๋“ ์ง€ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฑด์ „ํ•œ ํ…Œ์ŠคํŠธ ์ˆ˜ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ๊ฒƒ

  • ๋ˆ„๊ตฌ๋‚˜ ํ˜„์žฌ ์‹คํ–‰ ํŒŒ์ผ์„ ์–ป์œผ๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ์™„์ „ํ•œ ์‹คํ–‰ ํŒŒ์ผ์„ ์–ป์—ˆ๋‹ค๋Š” ํ™•์‹ ์„ ํ•˜๊ฒŒ ํ•  ๊ฒƒ

โ†’์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ…Œ์ŠคํŒ… ์ž๋™ํ™”์ด๋‹ค. ์ง€์†์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์—‡๋ณด๋‹ค ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์ „ํ•œ ์ƒํƒœ์ž„์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

Travis CI

travis-ci.org

๋กœ ๋“ค์–ด๊ฐ€์„œ ๊ณ„์ •๋ช… โ†’ setting ๋“ค์–ด๊ฐ€๋ฉด github์•„์ด๋””์™€ ์—ฐ๋™๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด repository๋“ค์ด ๋œจ๊ณ  ๊ฑฐ๊ธฐ์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ repository๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ค๋ฅธ์ชฝ์˜ ์ƒํƒœ๋ฐ”๋ฅผ ํ™œ์„ฑํ™”

์ด๋ ‡๊ฒŒ๊นŒ์ง€๋งŒํ•˜๋ฉด ์›นํŽ˜์ด์ง€์—์„œ ๋‹ค๋ค„์•ผํ•  ๋ถ€๋ถ„์€ ๋๋‚ฌ๊ณ  ์ƒ์„ธํ•œ ์„ค์ •์€ ํ”„๋กœ์ ํŠธ์˜ ymlํŒŒ์ผ๋กœ ์ง„ํ–‰

travis CI ์„ค์ •์€ ํ”„๋กœ์ ํŠธ์— ์กด์žฌํ•˜๋Š” .travis.yml ํŒŒ์ผ๋กœ ํ•œ๋‹ค

.yml์ด๋ž€?

  • YAML(์•ผ๋ฏˆ)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด ํŒŒ์ผ ํ™•์žฅ์ž๋Š” JSON์—์„œ ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•œ ๊ฒƒ

  • ๊ธฐ๊ณ„์—์„œ ํŒŒ์‹ฑํ•˜๊ธฐ ์‰ฝ๊ฒŒ, ์‚ฌ๋žŒ์ด ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ฒŒ

build.gradle๊ณผ ๊ฐ™์€ ์œ„์น˜์—์„œ .travis.yml์„ ์ƒ์„ฑํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€

language: java
jdk:
	- openjdk8

branches:
	only:
		- master

#Travis CI ์„œ๋ฒ„์˜ Home
cache:
	directories:
		- '$HOME/.m2/repository'
		- '$HOME/.gradle'

script: "./gradlew clean build"

#CI ์‹คํ–‰ ์™„๋ฃŒ์‹œ ๋ฉ”์ผ๋กœ ์•Œ๋ฆผ
notifications:
	email:
		recipients:
			- "kyudo97@naver.com"
  • branches

    • Travis CI๋ฅผ ์–ด๋Š ๋ธŒ๋žœ์น˜๊ฐ€ ํ‘ธ์‹œ๋  ๋•Œ ์ˆ˜ํ–‰ํ• ์ง€ ์ง€์ •

    • ํ˜„์žฌ ์˜ต์…˜์€ ์˜ค์ง master ๋ธŒ๋žœ์น˜์— push ๋  ๋•Œ๋งŒ ์ˆ˜ํ–‰

  • cache

    • ๊ทธ๋ ˆ์ด๋“ค์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค๋ฉด ์ด๋ฅผ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์บ์‹œํ•˜์—ฌ, ๊ฐ™์€ ์˜์กด์„ฑ์€ ๋‹ค์Œ ๋ฐฐํฌ ๋•Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ •

  • script

    • master ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋˜์—ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด

    • ์—ฌ๊ธฐ์„œ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ๋‘” gradlew์„ ํ†ตํ•ด clean & build์„ ์ˆ˜ํ–‰

  • notifications

    • Travis CI ์‹คํ–‰ ์™„๋ฃŒ์‹œ ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์ด ๊ฐ€๋„๋ก ์„ค์ •

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not complete execution for Gradle Test Executor 1.

๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ travis์—์„œ๋„ ์—๋Ÿฌ๊ฐ€๋‚ฌ๋‹ค.. ์ด๊ฑด ๋‹ค์‹œ ๋งŒ๋“ค๋˜๊ฐ€ํ•ด์•ผํ• ๋“ฏ?

S3๋ž€?

AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ํŒŒ์ผ ์„œ๋ฒ„

์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋น„๋กฏํ•œ ์ •์  ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ง€๊ธˆ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ฐฐํฌ ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ง€์›. - ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ S3์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

S3 + AWS + Travis CI ๋ฅผ ์—ฐ๋™ํ•˜๊ฒŒ ๋œ ๊ทธ๋ฆผ

Travis CI ์™€ S3์„ ์—ฐ๋™ : ์‹ค์ œ ๋ฐฐํฌ๋Š” AWS CodeDeploy๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ S3์˜ ์—ฐ๋™์ด ๋จผ์ €๋‹ค ์ด์œ ๋Š” Jar ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

CodeDeploy๋Š” ์ €์žฅ๊ธฐ๋Šฅ์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ Travis CI๊ฐ€ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ›์•„์„œ CodeDeploy๊ฐ€ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ํ•„์š”ํ•œ๋ฐ ์ด๊ฒƒ์€ S3์„ ์ด์šฉ

  • CodeDeploy๊ฐ€ ๋นŒ๋“œ๋„ ํ•˜๊ณ  ๋ฐฐํฌ๋„ํ• ์ˆ˜๋Š” ์žˆ์Œ. CodeDeploy์—์„œ๋Š” ๊นƒํ—™ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ๋•Œ ๋นŒ๋“œ ์—†์ด ๋ฐฐํฌ๋งŒ ํ•„์š”ํ•  ๋•Œ ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์›€

  • ๋นŒ๋“œ์™€ ๋ฐฐํฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ์˜ˆ์ „์— ๋นŒ๋“œ๋˜์–ด ๋งŒ๋“ค์–ด์ง„ Jar์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, CodeDeploy๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๊ฒŒ ๋  ๋• ํ•ญ์ƒ ๋นŒ๋“œ๋ฅผ ํ•˜๊ฒŒ ๋˜๋‹ˆ ํ™•์žฅ์„ฑ์ด ๋งŽ์ด ๋–จ์–ด์ง ๋”ฐ๋ผ์„œ ๋นŒ๋“œ์™€ ๋ฐฐํฌ๋Š” ๋ถ„๋ฆฌํ•ด์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

Travis CI์™€ AWS S3์—ฐ๋™

  1. AWS Key ๋ฐœ๊ธ‰

์ผ๋ฐ˜์ ์œผ๋กœ AWS ์„œ๋น„์Šค์— ์™ธ๋ถ€ ์„œ๋น„์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ key๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•จ. AWS์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ธ์ฆ๊ด€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋กœ IAM(Identity and Access Management)

IAM์€ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์˜ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•œ๋‹ค. IAM์„ ํ†ตํ•ด์„œ Travis CI ๊ฐ€ AWS์˜ S3์™€ CodeDeploy์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•จ

IAM์„ ๊ฒ€์ƒ‰ํ•ด์„œ ๋“ค์–ด๊ฐ€์„œ ์‚ฌ์šฉ์ž๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€

์ด๋ฆ„์„ ์„ค์ •ํ•˜๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์•ก์„ธ์Šค ์นธ์„ ์ฒดํฌํ•ด์ฃผ๊ณ  ๋‹ค์Œ

๊ธฐ์กด ์ •์ฑ… ์ง์ ‘ ์—ฐ๊ฒฐ์„ ๋ˆ„๋ฅด๊ณ 

  • AWSCodeDeployFullAccess

  • AmazonS3FullAccess

์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ๋‹ค์Œ

(์‹ค์ œ ์„œ๋น„์Šค ํšŒ์‚ฌ์—์„œ๋Š” ๊ถŒํ•œ๋„ S3์™€ CodeDeploy๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‘˜์„ ํ•ฉ์ณ์„œ ๊ด€๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 2๊ฐœ์˜ ๊ถŒํ•œ์ด ์„ค์ •๋˜์—ˆ์œผ๋ฉด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ)

ํ‚ค-๊ฐ’ํ˜•ํƒœ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ

ํ‚ค : name

๊ฐ’ : freelec-travis-deploy

๋ฉ”๋ชจ ์•ฑ์— ์•ก์„ธ์Šคํ‚ค๋ž‘ ๋น„๋ฐ€์•ก์„ธ์Šคํ‚ค๋ฅผ ๊ธฐ๋กํ•ด๋‘ 

์ด์ œ๋Š” Travis CI์— ์—‘์„ธ์Šคํ‚ค์™€ ๋น„๋ฐ€์—‘์„ธ์Šคํ‚ค๋ฅผ ์—ฌ๊ธฐ์— ๋“ฑ๋กํ•˜๊ณ  ๋“ฑ๋ก๋œ ๊ฐ’๋“ค์„ .travis.yml์— $AWS_ACCESS_KEY, $AWS_SECRET_KEY๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค

S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ

AWS์˜ S3 ์„œ๋น„์Šค๋Š” ์ผ์ข…์˜ ํŒŒ์ผ ์„œ๋ฒ„์ด๋‹ค. ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ด€๋ฆฌ, ๊ฒ€์ƒ‰ ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ํŒŒ์ผ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

S3๋Š” ๋ณดํ†ต ๊ฒŒ์‹œ๊ธ€์„ ์“ธ ๋•Œ ๋‚˜์˜ค๋Š” ์ฒจ๋ถ€ํŒŒ์ผ ๋“ฑ๋ก์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์ด์šฉํ•จ. ํŒŒ์ผ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, Travis CI์—์„œ ์ƒ์„ฑ๋œ Build ํŒŒ์ผ์„ ์ €์žฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ๊ฒƒ์ด๋‹ค. S3์—์„œ ์ €์žฅ๋œ BuildํŒŒ์ผ์€ ์ดํ›„ AWS์˜ CodeDeploy์—์„œ ๋ฐฐํฌํ•  ํŒŒ์ผ๋กœ ๊ฐ€์ ธ๊ฐ€๋„๋ก ๊ตฌ์„ฑํ•  ์˜ˆ์ •

์ด์ œ๋Š” ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด ๋ฒ„ํ‚ท์— ๋ฐฐํฌํ•  Zip ํŒŒ์ผ์ด ๋ชจ์—ฌ์žˆ๋Š” ์žฅ์†Œ์ž„์„ ์˜๋ฏธํ•˜๋„๋ก ์ง“๋Š” ๊ฒƒ์„ ์ถ”์ฒœ

freelec-springboot-build

๋ผ๋Š” ์ด๋ฆ„, ๋ชจ๋“  ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ์ด ๊ธฐ๋ณธ์œผ๋กœ ์ฒดํฌ๋˜์–ด์žˆ๋Š”๋ฐ ์ž˜ ์ฒดํฌ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ

  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฏธ ๊นƒํ—™์— ์˜คํ”ˆ์†Œ์Šค๋กœ ํ’€๋ ค์žˆ์œผ๋‹ˆ ๋ฌธ์ œํ•˜์—†์ง€๋งŒ, ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํ•  ๋•Œ๋Š” Jar ํŒŒ์ผ์ด ํผ๋ธ”๋ฆญ์ผ ๊ฒฝ์šฐ, ๋ˆ„๊ตฌ๋‚˜ ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๋‚˜ ์„ค์ •๊ฐ’, ์ฃผ์š” ํ‚ค ๊ฐ’๋“ค์ด ๋‹ค ํƒˆ์ทจ ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

  • ํผ๋ธ”๋ฆญ์ด ์•„๋‹ˆ๋”๋ผ๋„ ์šฐ๋ฆฌ๋Š” IAM ์‚ฌ์šฉ์ž๋กœ ๋ฐœ๊ธ‰๋ฐ›์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ• ๊ฒƒ์ด๋‹ˆ๊นŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์„ค์ •์— ์ฒดํฌ

.travis.yml

before_deploy:
  - zip -r freelec-springboot2-webservice *
  - mkdir -p deploy
  - mv freelec-springboot2-webservice.zip deploy/freelec-springboot2-webservice.zip

deploy:
  - provider: s3
    access_key_id: $AWS_SECRET_KEY # Travis repo settings์— ์„ค์ •๋œ ๊ฐ’
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings์— ์„ค์ •๋œ ๊ฐ’
    bucket: freelec-springboot-build # S3 ๋ฒ„ํ‚ท
    region: ap-northeast-2
    skip_cleanup: true
    acl: private #zip ํŒŒ์ผ ์ ‘๊ทผ์„ private ์œผ๋กœ
    local_dir: deploy #before_deploy์—์„œ ์ƒ์„ฑํ•œ ๋””๋ ‰ํ† ๋ฆฌ 
    wait-until-deployed: true
  • before_deploy

    • deploy ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰

    • CodeDeploy๋Š” Jar ํŒŒ์ผ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ Jar+๊ธฐํƒ€ ์„ค์ • ํŒŒ์ผ๋“ค์„ ๋ชจ์•„ ์••์ถ•

  • zip -r freelec-springboot2-webservice

    • ํ˜„์žฌ ์œ„์น˜์˜ ๋ชจ๋“  ํŒŒ์ผ์„ freelec-springboot2-webservice ์ด๋ฆ„์œผ๋กœ ์••์ถ•

    • ๋ช…๋ น์–ด์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋Š” ๋ณธ์ธ์˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์ด์–ด์•ผ ํ•จ

  • mkdir -p deploy

    • deploy๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ Travis CI๊ฐ€ ์‹คํ–‰์ค‘์ธ ์œ„์น˜๊ฐ€ ์ƒ์„ฑ

  • mv freelec-springboot2-webservice.zip delpoy/freelec-springboot2-webservice.zip

  • deploy

    • S3๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ํ˜น์€ CodeDeploy๋กœ ๋ฐฐํฌ ๋“ฑ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๋™๋  ํ–‰์œ„๋“ค์„ ์„ ์–ธ

  • local_dir: deploy

    • ์•ž์—์„œ ์ƒ์„ฑํ•œ deploy ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •

    • ํ•ด๋‹น ์œ„์น˜์˜ ํŒŒ์ผ๋“ค๋งŒ S3๋กœ ์ „์†ก

์ด๋ ‡๊ฒŒ .travis.yml์„ ์ˆ˜์ •ํ•ด์ฃผ๊ณ  ๋‚˜์„œ ๊นƒํ—™์— ์ž๋™์œผ๋กœ ํ‘ธ์‰ฌํ•˜๋ฉด ์ž๋™์œผ๋กœ EC2์—๋„ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ  ์ž๋™์œผ๋กœ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

Last updated

Was this helpful?