1 DAY DEPLOY ๐Ÿ˜‚

์กฐ๋ณ‘๊ทผยท2020๋…„ 8์›” 23์ผ
0
post-thumbnail

build - deploy ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ๋ฐฐํฌ๋ฅผ ํ•œ๋‹ค.

  • build๋Š” ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ(์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ)๋ฅผ ์‹ค์ œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ์ž‘์—….
  • deploy๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์— ๋ฐฐ์น˜์‹œํ‚ค๋Š” ์ž‘์—….

Front-end deploy

Netlify ๋ฅผ์ด์šฉํ•ด GitHub๊ณผ ์—ฐ๋™ํ•ด์„œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • GitHub ๊ณ„์ •๊ณผ ์—ฐ๋™ํ•ด, ์–ด๋–ค repo๋ฅผ deployํ•  ์ง€ ์„ ํƒ๊ฐ€๋Šฅํ•˜๋‹ค.
  • master branch๋กœ push๋œ ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ์™€์„œ build, deploy ํ•ด์ค€๋‹ค. pushํ•  ๋•Œ๋งˆ๋‹ค build, deploy ํ•ด์คŒ.

๊ธฐ๋ณธ build ๋ช…๋ น์–ด์ธ yarn build๊ฐ€ ์‹คํ–‰๋˜๋ฉด build ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

...
7:29:32 PM: Post processing - HTML
7:29:32 PM: Post processing - header rules
7:29:32 PM: Post processing - redirect rules
7:29:32 PM: Post processing done
7:29:32 PM: Site is live

Deploy log์— Site is live ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•œ ๊ฒƒ์ด๋‹ค.

๋! Front-end ๋Š” ์‰ฝ๋‹ค!


Back-end deploy

ํ• ์ผ ์š”์•ฝ

  • Heroku๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋“ค(src ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Œ)์„ babel์„ ์ด์šฉํ•ด ์ปดํŒŒ์ผ ํ•ด์„œ build๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ๊ธฐ.
  • babel์€ src ํด๋”์— ์žˆ๋Š” graphql ํŒŒ์ผ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋ณต์‚ฌํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด ์ž‘์„ฑ.
  • .gitignore์— ์žˆ๋Š” generated ํด๋”์™€ prisma.yml ๋•Œ๋ฌธ์— Heroku์—์„œ ๋ฐฐํฌํ•  ๋•Œ ๋‚˜๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ

Heroku๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐํฌํ•œ๋‹ค.

์ด ๋•Œ๊นŒ์ง€ ์“ด ์ฝ”๋“œ๋“ค์„ babel์„ ์ด์šฉํ•ด ์ปดํŒŒ์ผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. pacakge.json์˜ scripts์— build๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

"scripts": {
	...
	"build": "babel src -d build"
}

$ yarn add @babel/cli
...
$ yarn build

src์— ์žˆ๋˜ ์ฝ”๋“œ๋“ค์„ build๋ผ๋Š” ํด๋”์— ์ปดํŒŒ์ผํ•ด์„œ ๋„ฃ์–ด์ค€๋‹ค.

ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์„ค์น˜ํ•˜์ž.

$ yarn add @babel/plugin-transtorm-runtime -D
$ yarn add @babel/runtime

.babelrc

{
	...
	"plugins": ["@babel/plugin-transform-runtime"]
}

babel์€ jsํŒŒ์ผ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— graphqlํŒŒ์ผ์€ ๋ณ„๋„๋กœ buildํด๋”์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ copy ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

$ yarn add copy
"scripts": {
	...
	"build": "babel src -d build",
	"postbuild": "cd src && npx copy \"api/**/*.graphql\" \"../build/api/\"",
}

์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋„ ์ถ”๊ฐ€ํ•˜์ž.

"scripts": {
	...
	"build": "babel src -d build",
	"postbuild": "cd src && npx copy \"api/**/*.graphql\" \"../build/api/\"",
	"start": "node build/server.js"
}

์ด์ œ Heroku๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌํ•ด๋ณด์ž.

New - Create new app์„ ํ†ตํ•ด ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , heroku CLI๋ฅผ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

$ npm install -g heroku

์„ค์น˜ํ™•์ธ์€:

$ heroku --version

์„ค์น˜๋ฅผ ํ–ˆ๋‹ค๋ฉด CLI์—์„œ ๋กœ๊ทธ์ธ์„ ํ•ด์ค€๋‹ค

$ heroku login

์ด๋ฏธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ Git repo๋ฅผ ๋งŒ๋“ค์–ด ๋†จ๊ธฐ ๋•Œ๋ฌธ์— git init์€ ์•ˆ ํ•ด์ค˜๋„ ๋œ๋‹ค.

$ heroku git:remote -a pack-easy-backend
$ git push heroku master

push๋ฅผ ํ†ตํ•ด refresh๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.(Netlify์ฒ˜๋Ÿผ)

app์„ ์—ด์–ด์ฃผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด์œ ๋Š” generated๋ฅผ repo์— ์—…๋กœ๋“œํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (.gitignore)

Heroku๋Š” Git๊ณผ ์—ฐ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— Heroku์— ๋ญ”๊ฐ€ ์˜ฌ๋ฆฌ๋ ค๋ฉด push๋ฅผ ํ†ตํ•ด ์˜ฌ๋ ค์•ผ ํ•˜๋Š”๋ฐ, .gitignore์ด ํŒŒ์ผ๋“ค์„ ๋ฌด์‹œํ•ด์„œ GitHub repo์— ์—†์œผ๋‹ˆ๊นŒ ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š” ๊ฑฐ๋‹ค.

์ฆ‰, generated ํด๋”๋ฅผ ์—…๋กœ๋“œ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„์— prisma client๋ฅผ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

"scripts": {
	...
	"prebuild": "yarn run deploy && yarn run generate" // prisma client๋ฅผ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์ฃผ๋Š” ๊ณผ์ •
	"build": "babel src -d build",
	"postbuild": "cd src && npx copy \"api/**/*.graphql\" \"../build/api/\"",
	"start": "node build/server.js"
}

๋‚˜์˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” prisma.yml ํŒŒ์ผ๋„ .gitignoreํŒŒ์ผ์— ์žˆ๋‹ค. ์ฆ‰ git์— ์—…๋กœ๋“œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Heroku์—์„œ๋„ ์ธ์‹ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ prisma.yml์— ์žˆ๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด(endpoint url)๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋‘๊ณ , ๊ทธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์‹์œผ๋กœ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ณ , .gitignore์—์„œ ์ง€์›Œ์คฌ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” Heroku ์„ค์ •์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

"scripts": {
	...
	"prebuild": "yarn run deploy && yarn run generate",
	"build": "babel src -d build",
	"postbuild": "cd src && npx copy \"api/**/*.graphql\" \"../build/api/\"",
	"start": "node build/server.js"
}

๋‚ด๊ฐ€ ๋ฐ”๊พผ ์ฝ”๋“œ๋ฅผ Heroku์— ๋ฐ˜์˜ํ•˜๋ ค๋ฉด git push heroku master์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

pushํ•˜๊ธฐ ์ „์— ๋งค๋ฒˆ commit ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์‹ซ๋‹ค๋ฉด git commit --amend --no-edit์„ ํ•˜๋ฉด ๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ git push heroku master์„ ํ•ด์ฃผ๋ฉด

remote: -----> Compressing...
remote:        Done: 64.5M
remote: -----> Launching...
remote:        Released v11
remote:        https://๐Ÿค.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/๐Ÿค.git
   9f1b4cb..c029b42  master -> master

deploy๋œ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

graphql playground๊ฐ€ ์žˆ๊ณ  docs๋ฅผ ๋ณด๋ฉด ๋‚ด๊ฐ€ ์งœ๋†จ๋˜ API๋“ค์ด ์ž˜ ์ ์šฉ๋๋‹ค!


Prisma server deploy

์ด์ œ ๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ prisma demo ์„œ๋ฒ„ ๋ง๊ณ , ์ œ๋Œ€๋กœ ๋œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

app.prisma.io๋กœ ๊ฐ€์„œ ์ƒˆ Workspace๋ฅผ ๋งŒ๋“ค๊ณ , ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

์„œ๋ฒ„๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ DB๋ฅผ ์›๋ž˜ ์žˆ๋˜ ๊ฑธ ์‚ฌ์šฉํ• ์ง€, ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์„ ํƒํ•˜๋Š”๋ฐ ์ƒˆ๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด DB๋ฅผ ํ˜ธ์ŠคํŒ…ํ•ด์ค„ provider๊ฐ€ Heroku๋‹ค. ๊ทธ๋ž˜์„œ back-end deploy๋„ Heroku๋ฅผ ์ด์šฉํ•ด์„œ ํ•œ๊ฑฐ๋‹ค.

์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ด์ œ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Prisma CLI์— ๋กœ๊ทธ์ธ ํ•ด์•ผ ํ•œ๋‹ค.

$ prisma login -k <๋ฐœ๊ธ‰๋œ ํ‚ค>

์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ 

https://<server-endpoint>/<service-name>/<stage>

๋ฅผ prisma.yml์˜ endpoint์— ๋„ฃ์–ด์ฃผ๊ณ 

$ prisma deploy

๋ฅผ ํ•ด์ฃผ๋ฉด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜์–ด ์„œ๋น„์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.


Final Setting

deploy๋Š” ๋๋‚ฌ๋‹ค. ์ด์ „์— ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•ด๋†จ๋˜ ์„ค์ •๋“ค ์ค‘์— ๋ฐ”๊ฟ”์ค˜์•ผ ํ•  ๊ฒƒ๋งŒ ๋ฐ”๊ฟ”๋ณด์ž.

Frontend

ApolloClient ๊ด€๋ จํ•œ ์„ค์ •:

export default new ApolloClient({
  uri: process.env.NODE_ENV === "development" ? 'http://localhost:4000' : "https://๐Ÿค.herokuapp.com/",
  clientState: {
    defaults,
    resolvers
  }
});

DEV ์ผ ๋•Œ๋Š” ๋ฐฑ์—”๋“œ ์ฃผ์†Œ๋ฅผ localhost:4000์œผ๋กœ ํ•˜๊ณ  ์•„๋‹ ๋•Œ๋Š” deployํ–ˆ๋˜ ์ฃผ์†Œ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

Backend

prisma.yml์˜ endpoint ์ฃผ์†Œ๋Š” ์•„๊นŒ Heroku์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฐ”๊พผ๋‹ค.

endpoint: ${env:PRISMA_ENDPOINT}

์ฒ˜์Œ์—๋Š” ๋‚ด ์„ค์ •ํŒŒ์ผ .env์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ’์„ ๋„ฃ์–ด๋†จ๋Š”๋ฐ Heroku๊ฐ€ ์ฐพ์ง€๋ฅผ ๋ชปํ–ˆ๋‹ค. ์ด ๊ฒƒ๋„ GitHub repo์— ์•ˆ ์˜ฌ๋ผ๊ฐ”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ generated ํด๋”์— index.js์˜ prisma client์˜ endpoint ์ฃผ์†Œ๊ฐ€ ์›๋ž˜ ์“ฐ๋˜ demo ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋กœ ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ฒƒ๋„ ์ด ํŒŒ์ผ์„ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด์„œ GitHub repo์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Heroku์—์„œ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์•„์˜ˆ rebuild๋ฅผ ํ•ด์„œ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ๋” ํ•ด์•ผ ํ•œ๋‹ค.

$ git commit --allow-empty -m "Nothing" // empty commit
$ git push heroku master

ํ•ด์ฃผ๋ฉด rebuild๋ฅผ ํ•˜๋ฉด์„œ prisma generate๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๊นŒ ๋กœ๊ทธ์ธ ํ–ˆ๋˜ ์„œ๋ฒ„์˜ ์„œ๋น„์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ prisma client๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , endpoint๋„ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.


Test

Netlify์—์„œ ๋ฐฐํฌํ•œ ์‚ฌ์ดํŠธ๋กœ ๊ฐ€๋ณด๋ฉด ์ž˜ ์ž‘๋™ํ•˜๊ณ , ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ณด๋ฉด ์„œ๋ฒ„๋„ ์ž˜ ์ž‘๋™ํ•˜๊ณ  prisma๊ฐ€ DB์™€๋„ ์š”์ฒญ์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!!


Summary

์ด Deployํ•  ๊ฒƒ์ด Front-end, Back-end, Prisma server ์ด ์„ธ ๊ฐœ์˜€๋‹ค.

  • Front-end๋Š” Netlify๋กœ GitHub์˜ repo๋ฅผ ์„ ํƒํ•ด ๋ฐฐํฌํ–ˆ๊ณ 
  • Back-end๋Š” Heroku๋กœ GitHub๊ณผ ์—ฐ๋™ํ•ด์„œ ๋ฐฐํฌํ–ˆ๋‹ค. Netlify์™€ ๋‹ค๋ฅธ ์ ์€ Netlify๋Š” ๋‚ด GitHub ๊ณ„์ •์˜ repo์™€ ์—ฐ๋™ํ•˜์ง€๋งŒ, Heroku๋Š” git.heroku.com์˜ repo๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ๊ฑฐ๊ธฐ์™€ ์—ฐ๋™๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค git push heroku master๋ฅผ ํ†ตํ•ด ์œ„์˜ repo๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ Prisma server๋Š” app.primsa.io๋กœ ๊ฐ€๋ณด๋ฉด ์ƒˆ๋กœ์šด ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ๋•Œ, Heroku๋ฅผ DB provider๋กœ ์‚ฌ์šฉํ•œ๋‹ค. Back-end๋ฅผ ๋ฐฐํฌํ•  ๋•Œ Heroku๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋„ ์ด ๋•Œ๋ฌธ์ด๋‹ค. ์„œ๋ฒ„๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ , ๊ทธ ์œ„์— ์„œ๋น„์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“  ๋’ค, ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด๋†จ๋˜ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ƒˆ๋กœ prisma client๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ์„œ๋ฒ„์ธก์—์„œ DB์™€ prisma client์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ด์šฉํ•ด ์š”์ฒญ / ์‘๋‹ตํ•œ๋‹ค.

๊ผฌ๋ฐ• ํ•˜๋ฃจ๋ฅผ ์จ์„œ ๋ฐฐํฌ์— ์„ฑ๊ณตํ–ˆ๋‹ค.. Back-end๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” ์›Œ๋‚™ ์ž˜ ๋˜์–ด์žˆ์–ด์„œ ๋‚˜๋ฆ„ ๊ดœ์ฐฎ์•˜๋‹ค. ๊ทธ๋ž˜๋„ ํ•œ๋ฒˆ ํ•ด๋†“๊ณ  ๋‚˜๋‹ˆ๊นŒ ๋‹ค์Œ์—๋Š” ๊ฑ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿถ๐Ÿถ will help you : )

๐Ÿš€ Prisma DOCS

https://v1.prisma.io/docs/1.34/get-started/01-setting-up-prisma-demo-server-JAVASCRIPT-a001/

๐Ÿš€ Heroku DOCS

https://devcenter.heroku.com/articles/git

๐Ÿš€ Netlify DOCS

https://docs.netlify.com/site-deploys/create-deploys/#deploy-with-git

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด