๐ Simploy: ๋ฐฐํฌ๊ฐ ์ด๋ ๊ฒ ๊ฐ๋จํ ์ ์๋ค๊ณ ?
๋ณต์กํ ๋ฐฐํฌ ๊ณผ์ ์ ๋ํ ๊ณ ๋ฏผ์์ ๋ง๋ ์ด๊ฐ๋จ CI/CD ๋ฐฐํฌ ๋๊ตฌ Simploy๋ฅผ ์๊ฐํฉ๋๋ค.

ํ ๋ฒ ์ฌ์ฉํด๋ณด์ธ์ :โ)
๋ฐฐํฌ, ์ ์ด๋ ๊ฒ ๋ณต์กํ๊ฐ?#
๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ํ ๋ฒ์ฏค ๊ฒช์ด๋ดค์ ์ํฉ์ด ์์ต๋๋ค. ์ฝ๋๋ ์์ฑํ๋๋ฐ ๋ฐฐํฌํ๋ ๊ณผ์ ์ด ๋๋ฌด ๋ณต์กํด์ ๋ง๋งํ ์๊ฐ ๋ง์ด์์. ํนํ ๊ฐ์ธ ํ๋ก์ ํธ๋ ์๊ท๋ชจ ํ์์ ์ผํ ๋๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
๋ํ CI/CD ๋๊ตฌ๋ค์ ๊ธฐ๋ฅ์ด ํ๋ถํ์ง๋ง ์ค์ ์ด ๋ณต์กํ๊ณ ๋ฌด๊ฒ์ต๋๋ค. Jenkins๋ ์ค์น๋ถํฐ ์ค์ ๊น์ง ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ , GitHub Actions๋ private repository์์ ์ฌ์ฉํ๋ ค๋ฉด ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. GitLab CI๋ ์ข์ง๋ง ๊ฐ์ธ ํ๋ก์ ํธ์๋ ๊ณผํ ๋๋์ด์ฃ .
๊ทธ๋ ๋ค๊ณ ๋งค๋ฒ ์๋์ผ๋ก ํ์ผ์ ์ ์กํ๊ณ ์๋ฒ์ ์ ์ํด์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๊ฒ๋ ๋นํจ์จ์ ์ ๋๋ค. ์ค์๋ก ์๋ชป๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ํ์ผ์ ๋นผ๋จน๋ ๊ฒฝ์ฐ๋ ์ข ์ข ๋ฐ์ํ์ฃ .
์ด๋ฐ ๊ณ ๋ฏผ ๋์ ์ ๋ Simploy๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ๋์์ต๋๋ค. "Simple Deploy"์ ์ค์๋ง๋ก, ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ๋จํ ๋ฐฐํฌ๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
Simploy๋ ๋ฌด์์ธ๊ฐ?#
Simploy๋ ๊ฐ์ธ ํ๋ก์ ํธ๋ ์๊ท๋ชจ ํ์ ์ํ ์ด๊ฐ๋จ CI/CD ๋ฐฐํฌ ๋๊ตฌ์ ๋๋ค. ๋ณต์กํ ์ค์ ์์ด SSH๋ฅผ ํตํด ์๊ฒฉ ์๋ฒ์ ํ์ผ์ ์ ์กํ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์์ต๋๋ค. ํ๊ฒฝ ๋ถ๋ฆฌ์ ๋น๋ฐ ์ ๋ณด ๊ด๋ฆฌ๋ ์ง์ํ๋ฉด์, ์ ๋ง ํ์ํ ๊ธฐ๋ฅ๋ง ๋ด์์ต๋๋ค.
ํต์ฌ ์์ด๋์ด๋ ๊ฐ๋จํฉ๋๋ค. ์ค์ ํ์ผ ํ๋๋ก ํ์ผ์ ์๋ฒ์ ์ ์กํ๊ณ ๋ช ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๊ฒ. ๋ณต์กํ ํ์ดํ๋ผ์ธ์ด๋ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ์ธํ๊ณ , ์ค์ ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ๊ธฐ๋ฅ์๋ง ์ง์คํ์ต๋๋ค.
Simploy์ ์ฃผ์ ํน์ง#
1. ๊ทน๋๋ก ๊ฐ๋จํ ์ค์ #
Simploy์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ค์ ์ ๋จ์ํจ์ ๋๋ค. JSON ํํ์ ์ค์ ํ์ผ์ ์ฌ์ฉํด์ ๋๊ตฌ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ๋ณต์กํ YAML ๋ฌธ๋ฒ์ด๋ ํน๋ณํ DSL์ ๋ฐฐ์ธ ํ์๊ฐ ์์ฃ .
{
"environments": {
"dev": {
"servers": [
{
"name": "web",
"ssh": {
"host": "${DEV_WEB_HOST}",
"port": 22,
"user": "${DEV_WEB_USER}",
"password": "${DEV_WEB_PASSWORD}"
},
"localPath": ".",
"remotePath": "/home/ubuntu/app",
"transferIgnores": ["node_modules", ".git", ".env"],
"shell": [
"cd /home/ubuntu/app",
"npm ci",
"npm start"
]
}
]
}
}
}์ด ์ค์ ๋ง ๋ด๋ ๋ฌด์์ ํ๋์ง ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค. ๋ก์ปฌ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ฒ์ ํน์ ๊ฒฝ๋ก๋ก ์ ์กํ๊ณ , ๊ทธ ํ์ ํ์ํ ๋ช ๋ น์ด๋ค์ ์คํํ๋ ๊ฒ์ ๋๋ค.
2. ํ๊ฒฝ ๋ถ๋ฆฌ์ ๋ค์ค ์๋ฒ ์ง์#
์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๊ฐ๋ฐ, ์คํ ์ด์ง, ํ๋ก๋์ ํ๊ฒฝ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. Simploy๋ ์ด๋ฐ ํ๊ฒฝ ๋ถ๋ฆฌ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ง์ํฉ๋๋ค.
{
"environments": {
"dev": {
"servers": [...]
},
"staging": {
"servers": [...]
},
"production": {
"servers": [...]
}
}
}๊ฐ ํ๊ฒฝ๋ง๋ค ์ฌ๋ฌ ์๋ฒ๋ฅผ ์ค์ ํ ์ ์์ด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํด ์ฌ๋ฌ ๋์ ์๋ฒ์ ๋์์ ๋ฐฐํฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก๋์ ํ๊ฒฝ์์ ์น ์๋ฒ ์ฌ๋ฌ ๋์ ์์ฐจ์ ์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
3. ๋ณด์์ ๊ณ ๋ คํ ๋น๋ฐ ์ ๋ณด ๊ด๋ฆฌ#
๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ์ ๊ฒฝ ์ฐ์ด๋ ๋ถ๋ถ ์ค ํ๋๊ฐ ๋น๋ฐ ์ ๋ณด ๊ด๋ฆฌ์ ๋๋ค. ์๋ฒ ๋น๋ฐ๋ฒํธ, API ํค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ ๋ณด ๋ฑ์ ์ฝ๋์ ํ๋์ฝ๋ฉํ ์๋ ์์ผ๋๊น์.
Simploy๋ ์ด ๋ฌธ์ ๋ฅผ simploy.private.json ํ์ผ๋ก ํด๊ฒฐํฉ๋๋ค. ์ด ํ์ผ์ ๋ชจ๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ฉด, ์๋์ผ๋ก .gitignore์ ์ถ๊ฐ๋์ด์ Git ์ ์ฅ์์ ์ค์๋ก ์ปค๋ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
{
"DEV_WEB_HOST": "your.dev.server.com",
"DEV_WEB_USER": "ubuntu",
"DEV_WEB_PASSWORD": "your-secure-password",
"PROD_DB_PASSWORD": "super-secret-password"
}์ค์ ํ์ผ์์๋ $ ํํ๋ก ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ด์, ๋น๋ฐ ์ ๋ณด์ ์ผ๋ฐ ์ค์ ์ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
4. ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ npx ์ง์#
์์ฆ ๊ฐ๋ฐ ํธ๋ ๋๋ฅผ ๋ณด๋ฉด ์ ์ญ ์ค์น๋ฅผ ํผํ๊ณ npx๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Simploy๋ ์ด๋ฐ ํธ๋ ๋๋ฅผ ๋ฐ์ํด์ npx๋ฅผ ํตํ ์ฆ์ ์ฌ์ฉ์ ์ง์ํฉ๋๋ค.
# ์ ์ญ ์ค์น
pnpm add -g simploy
simploy init
simploy deploy --env dev
# ๋๋ npx๋ก ๋ฐ๋ก ์ฌ์ฉ
npx simploy init
npx simploy deploy --env dev์ ์ญ ์ค์น ์์ด๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ด์, ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๋น ๋ฅด๊ฒ ๋ฐฐํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
5. ์ค๋งํธํ ํ์ผ ์ ์ก#
Simploy๋ ํ์ผ ์ ์ก ์ ์ฌ๋ฌ ์ต์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. transferIgnores ์ต์ ์ผ๋ก ๋ถํ์ํ ํ์ผ๋ค์ ์ ์ธํ ์ ์๊ณ , remoteIgnoresWhenClean ์ต์ ์ผ๋ก ์๋ฒ์์ ์ญ์ ํ์ง ์์ ํ์ผ๋ค์ ์ง์ ํ ์ ์์ต๋๋ค.
{
"transferIgnores": ["node_modules", ".git", ".env", "*.log"],
"remoteIgnoresWhenClean": [".env", "uploads/"]
}์ด๋ ๊ฒ ํ๋ฉด ํ์ํ ํ์ผ๋ง ์ ์กํด์ ์๋๋ฅผ ๋์ด๊ณ , ์๋ฒ์ ์ค์ํ ํ์ผ๋ค์ ๋ณดํธํ ์ ์์ต๋๋ค.
์ค์ ์ฌ์ฉ ์๋๋ฆฌ์ค#
๊ฐ์ธ ๋ธ๋ก๊ทธ๋ ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ#
Next.js, Nuxt.js, React ๋ฑ์ผ๋ก ๊ฐ๋ฐํ ๊ฐ์ธ ์ฌ์ดํธ๋ฅผ VPS์ ๋ฐฐํฌํ ๋ Simploy๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ๋น๋๋ถํฐ ๋ฐฐํฌ๊น์ง ๋ชจ๋ ๊ณผ์ ์ ์๋ํํ ์ ์๊ณ , ๊ธ ํ๋ ์์ ํ ๋๋ง๋ค ๊ฐ๋จํ ๋ช ๋ น์ด ํ๋๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
ํ๋กํ ํ์ ๊ฐ๋ฐ#
๋น ๋ฅธ ํ๋กํ ํ์ ๊ฐ๋ฐ ์์๋ ๋ณต์กํ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์๊ฐ์ด ์์ต๋๋ค. Simploy๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ๋ถ ๋ง์ ๋ฐฐํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ณ , ํ์๋ค๊ณผ ํ๋กํ ํ์ ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ํ๋ก์ ํธ#
ํ๋ฆฌ๋์๋ ์์ด์ ์์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ง์ ๋ฐฐํฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ง๋ค ์๋ฒ ํ๊ฒฝ์ด ๋ค๋ฅด์ง๋ง, Simploy์ ์ค์ ํ์ผ๋ง ์์ ํ๋ฉด ์ฝ๊ฒ ๋์ํ ์ ์์ต๋๋ค.
์๊ท๋ชจ ํ ํ๋ก์ ํธ#
์คํํธ์ ์ด๋ ์๊ท๋ชจ ํ์์๋ ๋ฆฌ์์ค๊ฐ ์ ํ์ ์ด๋ผ ๋ณต์กํ DevOps ๋๊ตฌ๋ฅผ ๋์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค. Simploy๋ ์ต์ํ์ ์ค์ ์ผ๋ก ํ ์ ์ฒด๊ฐ ์ผ๊ด๋ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
์ฌ์ฉ๋ฒ ๊ฐ์ด๋#
1. ์ค์น ๋ฐ ์ด๊ธฐํ#
# ์ ์ญ ์ค์น (๊ถ์ฅ)
npm install -g simploy
# ํ๋ก์ ํธ ์ด๊ธฐํ
simploy initsimploy init ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ ๊ฐ์ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค:
- simploy.json: ๋ฉ์ธ ์ค์ ํ์ผ
- simploy.private.json: ๋น๋ฐ ์ ๋ณด ํ์ผ (์๋์ผ๋ก .gitignore์ ์ถ๊ฐ)
2. ์ค์ ํ์ผ ํธ์ง#
์์ฑ๋ ์ค์ ํ์ผ๋ค์ ํ๋ก์ ํธ์ ๋ง๊ฒ ์์ ํฉ๋๋ค. ์๋ฒ ์ ๋ณด, ๋ฐฐํฌ ๊ฒฝ๋ก, ์คํํ ๋ช ๋ น์ด ๋ฑ์ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
3. ๋ฐฐํฌ ์คํ#
# ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐฐํฌ
simploy deploy --env dev
# ํ๋ก๋์
ํ๊ฒฝ์ ๋ฐฐํฌ
simploy deploy --env production๋ฐฐํฌ ๊ณผ์ ์์ ์งํ ์ํฉ์ด ์ค์๊ฐ์ผ๋ก ํ์๋๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ค ๋จ๊ณ์์ ์คํจํ๋์ง ๋ช ํํ๊ฒ ์ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฐฐํฌ ๋๊ตฌ์์ ๋น๊ต#
vs GitHub Actions#
- GitHub Actions: ๊ฐ๋ ฅํ ์ํฌํ๋ก์ฐ ์์ง, ๋ค์ํ ํตํฉ ์ง์, ํ์ง๋ง private repo์์๋ ์ ๋ฃ
- Simploy: ๊ฐ๋จํ ์ค์ , ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ, ์์ ๋ฌด๋ฃ, ํ์ง๋ง ๊ธฐ๋ฅ์ด ์ ํ์
vs Jenkins#
- Jenkins: ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅ, ํ์ง๋ง ์ค์น/์ค์ ์ด ๋ณต์กํ๊ณ ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋ง์
- Simploy: ์ค์น ์์ด ๋ฐ๋ก ์ฌ์ฉ, ์ต์ํ์ ์ค์ , ํ์ง๋ง ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ถ์กฑ
vs Docker + Docker Compose#
- Docker: ํ๊ฒฝ ์ผ๊ด์ฑ, ํ์ฅ์ฑ, ํ์ง๋ง ํ์ต ๊ณก์ ์ด ์๊ณ ์ค์ ์ด ๋ณต์ก
- Simploy: ๊ธฐ์กด ์๋ฒ ํ๊ฒฝ ๊ทธ๋๋ก ์ฌ์ฉ, ์ฆ์ ์ ์ฉ ๊ฐ๋ฅ, ํ์ง๋ง ํ๊ฒฝ ์ผ๊ด์ฑ์ ๋จ์ด์ง
์ค์น ๋ฐ ์ฌ์ฉ#
# ์ ์ญ ์ค์น
npm install -g simploy
# ๋๋ npx๋ก ๋ฐ๋ก ์ฌ์ฉ
npx simploy init
npx simploy deploy --env devGitHub: https://github.com/JunDev76/simploy
npm: https://www.npmjs.com/package/simploy
์ฌ๋ฌ๋ถ์ ๋ฐฐํฌ ๊ณผ์ ์ด ์กฐ๊ธ์ด๋ผ๋ ํธํด์ก์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ์ฌ์ฉํด๋ณด์๊ณ ํผ๋๋ฐฑ์ด๋ ๊ฐ์ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด ์ธ์ ๋ GitHub์์ ๊ณต์ ํด ์ฃผ์ธ์! ๐