CodeStates์์ ์์ฑํ๋ ๊ณตํต ๋ฆฐํธ ๊ท์น ๋ชจ์์ ๋๋ค.
.github
โโโ workflows
โ โโโ *.yaml
โโโ CODEOWNERS
rules (๊ฐ๋ฐ์ ์ปค์คํ
๋ฃฐ ๊ท์น ๋ชจ์)
โโโ typescript (ํ์
์คํฌ๋ฆฝํธ ๋ฃฐ)
โ โโโ *.js
โโโ base.js (eslint ๊ธฐ๋ณธ ๋ฃฐ)
โโโ import.js (๋ชจ๋ import/export ๊ด๋ จ ๋ฃฐ)
โโโ jsx-a11y.js (์ ๊ทผ์ฑ ๊ด๋ จ ๋ฃฐ)
โโโ prettier.js (prettier ๊ด๋ จ ๋ฃฐ)
โโโ promise.js (promise ๊ด๋ จ ๋ฃฐ)
โโโ react-hooks.js (react hooks ๊ด๋ จ ๋ฃฐ)
โโโ react.js (react ๊ด๋ จ ๋ฃฐ)
scripts (์คํฌ๋ฆฝํธ)
โโโ canary-publish.sh (์นด๋๋ฆฌ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ)
test (๋ฆฐํธ ํ
์คํธ ๋ชจ์)
โโโ * (๊ฐ ํ๊ฒฝ๋ณ ํ
์คํธ ๋๋ ํ ๋ฆฌ)
โโโ .eslintrc
โโโ *.{js,ts,tsx}
frontend.js (ํ๋ก ํธ์๋ ์ ์ฉ ๋ฆฐํธ ๋ชจ๋)
index.js (๋ฆฐํธ ๋ชจ๋)
prettierrc.js (ํ๋ฆฌํฐ์ด ๋ชจ๋)
stylelint.js (์คํ์ผ๋ฆฐํธ ๋ชจ๋)
tsconfig.json
- ํ๋ก์ ํธ ๋ฃจํธ์
.npmrcํ์ผ์ ์์ฑํฉ๋๋ค. - ์์ฑํ ํ์ผ์ ์๋์ ๊ฐ์ด ์ ๋ ฅํฉ๋๋ค.
//npm.pkg.github.com/:_authToken=${CSE_NPM_TOKEN}
@codestates-engineering:registry=https://npm.pkg.github.com/- ๊ฐ ํจํค์ง ๋งค๋์ ๋ฅผ ํตํด ์ค์นํฉ๋๋ค.
npm install --save-dev @codestates-engineering/eslint-config-codestatesyarn add -D @codestates-engineering/eslint-config-codestates- ์ฌ์ฉํ๋ ํ๋ก์ ํธ์
package.jsonscripts ์์ฑ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
{
"lint": "eslint './src/**/*.{js,ts,tsx}'",
"lint:fix": "npm run lint -- --fix"
}- ํ๋ก์ ํธ ๋ฃจํธ์
.eslintrcํ์ผ์ ๋ง๋ค๊ณ ์ถ๊ฐํ ๋ฆฐํธ ์์กด์ฑ์ ์์ฑํฉ๋๋ค.
๋ง์ฝ ์ถ๊ฐ, ํ์ฅํ ์ค์ ์ด ์๋ค๋ฉด ์ฃผ์ ๋ถ๋ถ์ ์ถ๊ฐํฉ๋๋ค.
{
"extends": [
"@codestates-engineering/eslint-config-codestates"
// ํ์ฅํ ๊ท์น ์์ฑ
],
"rules": {
// ์ถ๊ฐํ ๊ท์น ์์ฑ
}
}React ๊ธฐ๋ฐ์ ํ๋ก ํธ์๋ ํ๋ก์ ํธ๋ผ๋ฉด ์๋์ ๊ฐ์ด .eslintrc ํ์ผ์ ์์ฑํฉ๋๋ค.
{
"extends": ["@codestates-engineering/eslint-config-codestates/frontend"]
}- ์ฌ์ฉํ๋ ํ๋ก์ ํธ์
package.jsonscripts ์์ฑ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
{
"prettier": "prettier './src/*.{json,yaml,md,js,ts,tsx}' --check",
"prettier:fix": "prettier './src/*.{json,yaml,md,js,ts,tsx}' --write"
}- ํ๋ก์ ํธ ๋ฃจํธ์
.prettierrcํ์ผ์ ๋ง๋ค๊ณ ์ถ๊ฐํ ์์กด์ฑ์ ์์ฑํฉ๋๋ค.
'@codestates-engineering/eslint-config-codestates/prettierrc';- ์ฌ์ฉํ๋ ํ๋ก์ ํธ์
package.jsonscripts ์์ฑ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
{
"lint:style": "stylelint './src/**/*.{js,ts,tsx}'",
"lint:style:fix": "stylelint './src/**/*.{js,ts,tsx}' --fix"
}- ํ๋ก์ ํธ ๋ฃจํธ์
.stylelintrcํ์ผ์ ๋ง๋ค๊ณ ์ถ๊ฐํ ์์กด์ฑ์ ์์ฑํฉ๋๋ค.
{
"extends": ["@codestates-engineering/eslint-config-codestates/stylelint"]
}Semantic Versioning์ ์ฌ์ฉํฉ๋๋ค.
MAJOR์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ ๋ฐฉ์์ผ๋ก ์์ ๋ ๊ฒฝ์ฐMINOR์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐPATCH์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ๋ฒ๊ทธ๋ฅผ ์์ ํ ๊ฒฝ์ฐ
Github Actions๋ฅผ ํตํด CI/CD๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ ์ Release์ ํ ์คํธ๋ฅผ ์ํ Canary๊ฐ ์์ต๋๋ค.
feature/**๋ธ๋์น๋ฅผ push ํ๋ฉด ์๋์ผ๋ก Canary ๋ฐฐํฌ๋ฅผ ์งํํฉ๋๋ค.feature/**๋ธ๋์น์์ Commit Message ์์ฑ์skip canary๋ฌธ์ฅ์ ํฌํจ์ํค๋ฉด Canary ๋ฐฐํฌ๋ฅผ ์๋ตํฉ๋๋ค.main๋ธ๋์น์ pushํ๋ฉด ์๋์ผ๋ก ์ ์ ๋ฒ์ ์ด ๋ฐฐํฌ๋ฉ๋๋ค.
Git-flow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ํฉ๋๋ค.
- main: ๋ฐฐํฌ๊น์ง ๋ง๋ฌด๋ฆฌ๊ฐ ๋ ์ต์ข ์ฝ๋๊ฐ ์๋ ๋ธ๋์น
- develop: main์ ๊ธฐ์ค์ผ๋ก ์ต์ ํ๋ ๋ค์ ๋ฒ์ ์ ๊ฐ๋ฐํ ๋ธ๋์น
- feature: ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น
- release/**: ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์๋ฃํ๊ณ ๋ฐฐํฌํ ๋ธ๋์น
- ์ต์ ํ๋
develop๋ธ๋์น๋ฅผ ๊ธฐ์ค์ผ๋กfeature/**๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. - ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ๊ฐ๋ฐ์ ๋ํ CHANGELOG๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ๋ฐ์ด ์๋ฃ๋
feature๋ธ๋์น๋ฅผ pushํฉ๋๋ค. - target branch๋ฅผ
develop๋ธ๋์น๋ก ์ค์ ํ๊ณ PR์ ์์ฒญํฉ๋๋ค.- ์ด ๋ ๊ฐ๋ฐํ ๊ธฐ๋ฅ์ ๋ํด์ ์๋์ผ๋ก Canary ๋ฐฐํฌ๊ฐ ์คํ๋ฉ๋๋ค.
- ๋ง์ฝ, Canary ๋ฐฐํฌ๊ฐ ํ์ํ์ง ์๋ค๋ฉด ์ปค๋ฐ ๋ฉ์์ง์
skip canary๋ฅผ ํฌํจ์ํต๋๋ค. - ์ด ๋ Canary ๋ฐฐํฌ์ ํ์๋ ๋ช ๋ฒ์ด๋ ์๊ด ์์ต๋๋ค.
- ๋ฐฐํฌ๋ Canary ๋ฒ์ ์ ํตํด ํ
์คํธ๋ฅผ ์งํ ํ ๋ฌธ์ ๊ฐ ์๊ณ ๋ฆฌ๋ทฐ๊ฐ ์๋ฃ๋์๋ค๋ฉด
develop๋ธ๋์น์ ๋ณํฉํฉ๋๋ค. - Local
develop๋ธ๋์น๋ฅผ ์ต์ ํํฉ๋๋ค.
- ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋
develop๋ธ๋์น๊ฐ ์ต์ ํ ๋์๋์ง ํ์ธํฉ๋๋ค. develop๋ธ๋์น์์ ๋ฐฐํฌํ ๋ฒ์ ์release/v${๋ฐฐํฌํ _๋ฒ์ }๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค.- ๋ฐฐํฌํ ๋ฒ์ ์ ๋ง๊ฒ ๋ฒ์ ์ ์์ฑํฉ๋๋ค.
MAJORnpm version majorMINORnpm version minorPATCHnpm version patch
- PR์ ์์ฒญํ๊ณ target branch๋ฅผ
main๋ธ๋์น๋ก ์ค์ ํฉ๋๋ค. - CI๊ฐ ์งํ๋๊ณ ์ด์์ด ์๋ค๋ฉด
main๋ธ๋์น์ ๋ณํฉํฉ๋๋ค. - ๋ณํฉ์ ์๋์ผ๋ก CD๊ฐ ์งํ๋ฉ๋๋ค.
- CD ์งํ ์ดํ ์๋์ผ๋ก Release Tag๊ฐ ์์ฑ๋๋ฉฐ ์์ฑ๋ Tag์ ๋ฐฐํฌ๋ ๋ฒ์ ์ ๋ณ๊ฒฝ์ฌํญ์ ์์ฑํฉ๋๋ค.
- CD ์ดํ
develop๋ธ๋์น๋ฅผ ์ต์ ํํฉ๋๋ค.
vscode ํ๊ฒฝ์์ ํ์ผ ์ ์ฅ์ AutoFix๊ฐ ๋์ํ์ง ์๋ ๊ฒฝ์ฐ settings.json์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
"editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.stylelint": true, "source.fixAll.eslint": true }, "stylelint.validate": [ "css", "scss", "less", "postcss", "typescriptreact", "typescript", "javascript", "javascriptreact" ], "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },