github-actions-tutorial
๐ CI/CD
: ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋จ๊ณ๋ถํฐ ๋ฐฐํฌ๋๊น์ง ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ํํ๋ ๊ณผ์
๐ฒ Point (ํฐ ํ๋ก ๋จผ์ ์๊ฐํ๊ธฐ)
- CI - ์๋ก์ด ๋ณ๊ฒฝ ์ฌํญ ๋จธ์ง, ๋น๋, ํ ์คํธ ์๋ํ
-
CD - ๋ฐฐํฌ ์๋ํ (with AWS S3)
- github actions: ์๋ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํ๋์ ๊ฐ์ ์ปดํจํฐ
โช CI (Continuos Integration) - ์ง์์ ์ธ ํตํฉ
: ์๋ก์ด ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋น๋ ๋ฐ ํ ์คํธ ๋์ด ๊ณต์ ๋ ํฌ์งํ ๋ฆฌ์ ์ง์์ ์ผ๋ก(=์๋์ ์ผ๋ก)ํตํฉ๋๋ ๊ฒ
-
์ฝ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋น๋ฒํ๊ฒ ๋จธ์งํด์ผ ํ๋ค. = ์์ ๋จ์๋ก ๋๋์ด ๋จธ์ง๋ฅผ ์งํํ๋ค.
-
CI๋ฅผ ์ํด ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ํ ์คํธ์ ๊ณผ์ ์ด ์๋์ผ๋ก ์งํ๋๋ค.
โช CD (Continuous Delivery(or Deployment)) - ์ง์์ ์ธ ์ ๊ณต(or ๋ฐฐํฌ)
- Continuous Delivery๋ ๊ฐ๋ฐํ๊ฒฝ ๋ฐฐํฌ๊น์ง ์๋ํ,
- Continuous Deployment๋ Production ๋ ๋ฒจ๊น์ง ์๋์ผ๋ก deploy ํ๋ ๊ฒ์ ์๋ฏธ
- CD๋ ๊ฐ๋ฐ์์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋์ด, ๊ณ ๊ฐ์ ํ๋ก๋์ (Production) ํ๊ฒฝ๊น์ง ๋ฆด๋ฆฌ์ฆ ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CI/CD๋ฅผ ์ํด ํ๋ซํผ์ ์ฌ์ฉํ๋๋ฐ ์ค์นํ๊ณผ ํด๋ผ์ฐ๋ํ์ด ์๋ค.
๋ํ์ ์ธ ์ค์นํ ํ๋ซํผ์ Jenkins, ํด๋ผ์ฐ๋ํ CI/CD ํ๋ซํผ์ Github Actions๊ฐ ์๋ค.
ํด๋ผ์ฐ๋ ์๋น์ค? ํ์ฌ ์ ๊ณต์ ์ฒด๊ฐ ํธ์คํ ํ์ฌ ์ธํฐ๋ท์ ํตํด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์ธํ๋ผ, ํ๋ซํผ ๋๋ ์ํํธ์จ์ด
โช ์ CI/CD๋ฅผ ๊ตฌ์ถํ ๊น? (CI/CD์ ์ฅ์ )
- ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฅ์ ์์ผ์ค๋ค.
- ๋ฌธ์ ์ ์ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ ์ ์๋ค.
-
๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ๋ฅผ ๋น ๋ฅด๊ฒ ์์ ๋ํ ๊ฐ๋ฅํ๋ค.
- ์ฝ๋์ ํ๋ฆฌํฐ ํฅ์ > ์ฝ๋์ ์ ๋ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
๐ What is Github Actions !
: Github์์ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ํ CI/CD ํด
๐ฒ Point (์ฌ์ฉ ์ด์ ๋ฅผ ๋ช ํํ ์ดํดํ๊ธฐ)
- CI/CD ์๋ํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
- ์๋ํ๋ฅผ ์ํด github ์์ ์ ๊ณตํ๋ ํ๋์ ๊ฐ์ ์ปดํจํฐ
โช ์ฅ์
- ํด(ex. Jekins)์ ๋ฐ๋ก ์ค์นํ์ง ์๊ณ Repository์์ ๊ด๋ฆฌ
- ์ฌ์ด ์ค์
โช ์์์ผ ํ ๊ฐ๋ 5๊ฐ์ง
name: CI/CD
on:
push: // push event
branches:
- main
pull_request: // pr event
branches:
- main
workflow_dispatch: // github actions ํ์ด์ง์์ workflow๋ฅผ ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ด๋ฒคํธ
jobs:
helloWorld:
runs-on: ubuntu-latest // runner
steps:
- run: echo HelloWorld
- uses: actions/checkout@master
-
Workflows
- ํน์ ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ค ์ผ์ ์ํํ๋ ์ง ์๋ ค์ฃผ๋ ์๋ํ๋ ํ๋ก์ธ์ค
- ์ฌ๋ฌ Job์ผ๋ก ๊ตฌ์ฑ
-
Events
- github์์ ๋ฐ์ํ ์ ์๋ ์ด๋ฒคํธ(main ๋ธ๋์น๋ก ๋จธ์ง, ์ปค๋ฐ์ ํธ์ฌ)
-
Jobs
-
ํ๋์ Runner์์ ์คํ๋ ์ฌ๋ฌ step ๋ชจ์, workflow์ job๋ค์ ๋์์ ์คํ(๋ณ๋ ฌ๋ก ์คํ), step์ ์์ฐจ์ ์ผ๋ก ์คํ
- ์ฌ๋ฌ step์ผ๋ก ๊ตฌ์ฑ๋์ด ์์.
- ๋ค๋ฅธ Job์ ์์กดํ ์ ์๊ณ , ๋ ๋ฆฝ์ ๋๋ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ ๊ฐ๋ฅ.
-
-
Actions
- github workflow ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋จ๋ค์ด ๋ง๋ค์ด๋ ์ผ๋ จ์ step๋ค์ ๊ฐ์ ธ๋ค ์.
use
ํค์๋๋ฅผ ์ฌ์ฉmarketplace์ ์ค์ ๋ actions๊ฐ ๋ง์. ๊ฐ์ ธ๋ค์ฐ๋ฉด ๋๋ค.
์ง์ ์ฝ๋ ์์ ์์๋ ํ์ธ๊ฐ๋ฅ
-
Runners
- ๋ด๊ฐ ์ง์ Job์ ์คํ์ํฌ ํ์ ์์ด Job์ ์คํ์ํค๋ VM ๋จธ์ (๊ฐ์ ์ปดํจํฐ)
-
workflow dispatch
๐ GitHub Actions์ผ๋ก CI ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ
CRA์๋ ๋ณ๋์ test ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ jest์ ๊ฐ์ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ํ์๊ฐ ์๋ค.
- App.js
import "./App.css";
function App() {
return <h1>Hello, World</h1>;
}
export default App;
- App.test.js (ํ ์คํธ์ฝ๋ ์์)
import { render, screen } from "@testing-library/react";
import App from "./App";
test("renders learn react link", () => {
render(<App />); // App.js๊ฐ ๋ ๋๋ง ๋๋์ง ํ์ธ
// h1 ํ๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ
์คํธ
const heading = screen.getByRole("heading");
expect(heading).toBeInTheDocument();
// App.js๊ฐ Hello, Deploy๋ผ๋ ๊ธ์๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ
์คํธ
expect(heading.textContent).toBe("Hello, Deploy");
});
- CICD.yml
ํ๋ก์ ํธ ๊ฒฝ๋ก์
.github\workflows
๋ผ๋ ํด๋๋ฅผ ๋ง๋ค์ดyml
ํ์ผ์ ์์ฑํ๋ค.
name: CI/CD
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
jobs:
helloWorld:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- run: npm ci // clean install์ ์ฝ์, npm package๋ฅผ ์ค์นํ๋ค.
- run: npm run test
- run: echo SUCCESS
โ ์๋ชป๋ ์ฝ๋๋ก ํ ์คํธ ์๋ํ ํ์ธํด๋ณด๊ธฐ
Hello deploy๋ฅผ Hello World์ผ๋ก ๋ฐ๊พธ์ด ํ ์คํธ.
import "./App.css";
function App() {
return <h1>Hello, World</h1>;
}
export default App;
์ด๋ ๋ถ๋ถ์์ test๋ฅผ ํต๊ณผํ์ง ๋ชปํ๋์ง ํ์ธํ ์ ์๋ค.
โช ์ ์ ์ฝ๋๋ก ํ ์คํธ ์๋ํ ์คํํ๊ธฐ
๋ชจ๋ step์ด ์๋ํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โช PRํ ๋ ์ ๋๋ก test ๋๋์ง ํ์ธํด๋ณด๊ธฐ
- ์ฝ๋๋ฅผ ์์ฑํ ๋ธ๋์น(break-tests)์์ฑ
-
pushํ pr ์์ฑ
๋ฐ๋ก test๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ค. Detail์ ํด๋ฆญํ๋ฉด action์ผ๋ก ๋์ด๊ฐ ํด๋น work flow์์ ์ด๋๊ฐ ์๋ชป๋์๋์ง ํ์ธ ํ ์ ์๋ค.
PR๋ชฉ๋ก์์๋ ํ์ธ ๊ฐ๋ฅํ๋ค.
ํ ์คํธ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์ด๋ก ๋ฑ์ง๊ฐ ๋จ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๐ ์ฐธ๊ณ . github ํ์ด์ง์์ workflow ์์ฑํ๊ธฐ
- CI/CD๋ฅผ ์ ์ฉํ ํ๋ก์ ํธ์ action ํญ์์ node.js ํ
ํ๋ฆฟ์ ์ ํํ๋ค.
- ๊ธฐ๋ณธ์ ์ธ ํ
ํ๋ฆฟ์์ ๊ฐ์ ์ํฉ์ ๋ง๊ฒ ์์ ํ๋ค.
๐ github actions๋ฅผ ์ฌ์ฉํด CD ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ (with AWS S3)
- AWS: ์๋ง์กด์์ ๋ง๋ ํด๋ผ์ฐ๋ ์๋น์ค
- AWS S3: AWS์์ ์ ๊ณตํ๋ ์ธํฐ๋ท ์คํ ๋ฆฌ์ง ์๋น์ค like vercel
1. AWS์์ ํ์๊ฐ์ ํ ๋ฒํท(= ์ ์ฅ์) ๋ง๋ค๊ธฐ
AWS ๋ฆฌ์ : ์ด๋์ ์๋ ์ปดํจํฐ๋ฅผ ๋น๋ ค ์ฐ๋๊ฐ?
๊ฐ์ฒด ์์ ๊ถ - ACL ๋นํ์ฑํ (๊ถ์ฅ)
:star: ์ค์. ํผ๋ธ๋ฆญ ์์ธ์ค ์ฐจ๋จ ํด์ > ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์น์ ๋ชจ๋๊ฐ ์ ๊ทผํ๊ฒ ํ๊ธฐ ์ํด์
์ฃผ์(๋นจ๊ฐ ์ธ๋ชจ)๋ฐ์ค์๋ ์ฒดํฌ.
๋ฒํท ๋ฒ์ ๊ด๋ฆฌ - ๋นํ์ฑํ ์ฒดํฌ
๊ธฐ๋ณธ ์ํธํ - ๋นํ์ฑํ ์ฒดํฌ
๋ฒํท ๋ง๋ค๊ธฐ
2. ํ๋ก์ ํธ build ์คํํ๊ณ ๋ฒํท์ ํ์ผ ์ ๋ก๋ํ๊ธฐ
ํ๋ก์ ํธ build ํด๋์ ์๋ ํ์ผ์ ์ ๋ก๋ ํฉ๋๋ค.
- ์์ฑํญ์์ ์ ์ ์น ์ฌ์ดํธ ํธ์คํ
์ ํ์ฑํ ํฉ๋๋ค.
- ์ ์ ์น ํ์ด์ง: Client Side Rendering๋ฐฉ์์ผ๋ก ์งํ๋๋ ์น ํ์ด์ง (์ด๋ฏธ ์ ์ฅ๋ html ๋ฌธ์๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก)
- ๋์ ์น ํ์ด์ง: Server Side Rendering๋ฐฉ์์ผ๋ก ์งํ๋๋ ์น ํ์ด์ง (์ฌ์ฉ์์ ์์ฒญ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ ํ์ ์ ์๋ HTML๋ฌธ์๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก)
- ๋ฐ๋ผ์ AWS S3 ๊ธฐ๋ฅ์ผ๋ก๋ Next.js๋ก ๋ง๋ ์น ํ์ด์ง๋ฅผ ํธ์คํ ํ ์ ์์. AWS EC2๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ํจ.
-
์ธ๋ฑ์ค ๋ฌธ์ - ํน์ ํ ์น์ฌ์ดํธ๋ก ๋ฒํท์ ์ ์ํ๋ฉด ์ฒ์์ผ๋ก ๋ณด์ฌ์ค ๊ธฐ๋ณธ ํ์ด์ง
ํธ์คํ ์ ํ์ฑํ ํ๋ฉด ์ฃผ์๋ฅผ ๋ฐ์ต๋๋ค.
ํ์ง๋ง ์ฒ์์
403 Forbidden
์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.์? ๋๊ฐ ๋๊ตฐ์ง ์๋๋ฐ ๋ ๊ถํ์ด ์๋ค. ๋ฒํท์์ ์๋ ๊ฐ์ฒด์ ์ ๊ทผํ ๊ถํ์ด ์๋ค.
์ฐจ๋จ ํ์๋๋ฐ ์? ์๊น๋ ์ฐจ๋จ์ ๊ฑฐ๋ ๊ฒ์ ํด์ ํ๊ฒ.
์ฐจ๋จ์ ํ๋ ธ์ง๋ง ๊ถํ์ ๋ฐ๋ก ๋ถ์ฌํด์ฃผ์ด์ผ ํ๋ค.
๊ถํ์ ๋ถ์ฌํ์
3. ์นํ์ด์ง์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ค.
๊ถํ ํญ์ ๋ค์ด๊ฐ์ ๋ฒํท ์ ์ฑ ์ผ๋ก ์ด๋ํ๋ค.
๋ฒํท ์ ์ฑ ์์ ์์ธ์ค ๊ถํ ์ค์ ์ด ๊ฐ๋ฅํ๋ค. Json ํ์ผ๋ก ์ ์
{
"Version": "2012-10-17", // ์ ์ฑ
์ ์ค์ ํ๋ aws๋ฌธ๋ฒ์ ๋ง์ง๋ง ์
๋ฐ์ดํธ
"Statement": [
{
"Sid": "PublicReadGetObject", // ์ฌ์ด๋ ์๋. S์์ด๋์. ๊ณ ์ ํ ID.
"Effect": "Allow", // ๊ถํ์ ํ์ฉํ ์ง ๋ง์์ผํ ์ง
"Principal": "*", // ๋๊ตฌํํ
๊ถํ์ ํ์ฉํ ๊ฒ์ธ์ง
"Action": "s3:GetObject", // ์ด๋ค ํ๋์ ํ๋ฝํ ๊ฒ์ธ์ง
"Resource": "arn:aws:s3:::<bucket-name>/*" // ์ฌ๋ฌ๊ฐ์ง ๋ฒํท ๋๋ ํ์ผ ์ค ๊ถํ์ ํ์ฉํ ๋ฆฌ์์ค
}
]
}
๋ฒํท ์ ์ฑ
์์ ๊ถํ์ ๋ชจ๋์๊ฒ ํ์ฉํ๋ฉด, 403
forbidden error๊ฐ ์ฌ๋ผ์ง๊ณ ์ ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง aws์ ํ์ผ์ ์ฌ๋ ค์ ํ ์๋์ ์ธ ๋ฐฐํฌ!
4. ํฐ๋ฏธ๋์์ AWS S3์ ๋ฐฐํฌํ๊ณ github actions๋ก ์๋ํํ๊ธฐ!
์๋ํํ๊ธฐ ์ํด ํฐ๋ฏธ๋์์ aws๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ก aws CLI๋ฅผ ์ค์นํ๋ค. AWS ๊ณต์ DOC์์ AWS CLI๋ฅผ ์ค์นํ๋ค. ์ค์น ๋ฐฉ๋ฒ: Windows(OS) PC์ AWS CLI ์ค์นํ๊ธฐ
AWS CLI๋? AWS Command Line Interface, ํฐ๋ฏธ๋์์ AWS ์คํ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์คํ ์์ค ๋๊ตฌ
์ ์ ํญ์ ํด๋ฆญํด ๋ณด์์๊ฒฉ์ฆ๋ช
ํ์ด์ง๋ก ๋ค์ด๊ฐ ์์ธ์คํค ๋ง๋ค๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ค.
์์ธ์คํค ๋ง๋ค๊ธฐ ๋ฒํผ์ ๋๋ฌ ๋จ๊ณ๋ฅผ ์งํํ๋ฉด ๋ง๋ค์ด์ง ์์ธ์คํค๋ฅผ ๋ณด์ฌ์ค๋ค.
- ์์ธ์ค ํค = ์ฌ์ฉ์์ ์์ด๋
- ๋น๋ฐ ์์ธ์ค ํค = ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ :star: ์ค์! ๋น๋ฐ ์์ธ์ค ํค๋ ์ฒ์ ๋ง๋ ์ํฉ ์ดํ์๋ ๋ณด์ด์ง ์์ผ๋ ๋ฐ๋ก ์ ์ฅํด ๋์ด์ผ ํ๋ค.
ํฐ๋ฏธ๋์์ aws configure --profile <ํ๋กํ ์ด๋ฆ>
์ ์
๋ ฅํด ํ๋ก์ ํธ ๋ฐฐํฌ์ ์ฌ์ฉ๋ ํ๋กํ์ ์ค์ ํ๋ค.
- Default region name: ap-northeast-2 // ์์ธ
aws configure list-profiles
๋ช
๋ น์ด๋ฅผ ํตํด ์์ฑ๋ ํ๋กํ์ ํ์ธํ ์ ์๋ค.
aws s3 sync build/ s3://<aws ํ์ด์ง์์ ์์ฑํ ๋ฒํท ์ด๋ฆ> --delete --profile <์ฌ์ฉํ ํ๋กํ ์ด๋ฆ>
- aws ํ์ด์ง์์ ์์ฑํ ๋ฒํท์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ง์ฐ๊ณ ํ์ฌ ๋ฃจํธ์ ์๋ buildํ์ผ์ ๋ชจ๋ ์ ๋ก๋ ํ๋ค.
aws ํ์ด์ง์์๋ ํ์ผ๋ค์ด ์ ๋ก๋ ๋๊ฒ์ ํ์ธํ ์ ์๋ค. ํ๋ก์ ํธ์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, buildํ๊ณ ๋ค์ ๋ฒํท์ ํ์ผ์ ์ ๋ก๋ํ๋ฉด ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค.
5. ๋ณธ๊ฒฉ์ ์ผ๋ก CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ
name: CI/CD
on:
push:
branches:
- main
workflow_dispatch:
jobs:
CICD:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- run: npm ci
- run: npm run test
- run: echo SUCCESS
- run: npm run build
- name: deploy to s3
uses: jakejarvis/s3-sync-action@master // ์ด๋ถ๋ถ์ main์ผ๋ก ๋ฐ๊พธ๋ฉด error๋ฐ์
with:
args: --delete // ๋ฒํท์ ์๋ ๋ชจ๋ ๊ฐ์ฒด ์ญ์
env: // ํ๊ฒฝ๋ณ์ ์ธํ
AWS_S3_BUCKET: $
AWS_ACCESS_KEY_ID: $
AWS_SECRET_ACCESS_KEY: $
AWS_REGION: 'ap-northeast-2'
SOURCE_DIR: 'build'
์์ธ์ค ํค ๋น๋ฐ๋ฒํธ๋ฅผ ์จ๊ธฐ๊ธฐ ์ํด ๊นํ์์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
Settings> secrets/Actions > New repository secret
์ค์. ์์ ์ ๊ฐ๋ฅํ์ง๋ง ์๋ ์ ์ฅํ๋ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
ํ๊ฒฝ๋ณ์๋ ์์ฑํ๋ ๋ฒํท ์ด๋ฆ, ID, ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ๋ฉด ๋๋ค.
main ๋ธ๋์น์ push๋ฅผ ๋ ๋ฆฌ๋ฉด
actionsํญ์์ CD๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ์ถ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ ํ์๋ค๊ณผ ํ ๋ก ํ ์
-
develope ๋ธ๋์น์ push & prํ ๋ CI ์๋
-
CD๋ ์ด๋ ์ด๋ฒคํธ์ ์๋ํ๋๋ก ์ค์ ํด์ผ ํ๋์ง?
์ถ์ฒ
-
์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ ํ๋ก ํธ์๋ ์ธํด์ญ ๊ฐ์
- ๋๋ฆผ์ฝ๋ฉ - ์ ๋ฐ ๊นํ๋ธ ์ก์ ๋ชจ๋ฅด๋ ๊ฐ๋ฐ์ ์๊ฒ ํด์ฃผ์ธ์ :star: ์ ๋ฆฌ Good!
- CI/CD๋ ๋ฌด์์ธ๊ฐ
- ์ด์ฉ์ง ์ค๋์ - Github Action ์ฌ์ฉ๋ฒ ์ ๋ฆฌ :star: ์ ๋ฆฌ Good!
- DaleSeo - Jest๋ก ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ์์ฑํ๊ธฐ
- GitHub Docs - Understanding GitHub Actions
๐ฌ ์ต์ ๋๊ธ