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" },