Git ๋ช ๋ น์ ๋ฐฐ์ ์ง๋ง CI(์ง์์ ํตํฉ)๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ํ๊ณ ์ถ์ผ์ญ๋๊น? ์๋๋ฉด ์ผ์ ํ๋์ ์ต์ ํํ๊ณ ์ถ์ผ์ ๊ฐ์? ์ด ๊ณผ์ ์์๋ GitHub ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ง์์ ์ธ ํตํฉ์ ๋ํ ์ค์ฉ์ ์ธ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ณผ์ ์ ๊ฐ๋จํ ํด๋ฆญํ ์ ์๋ ๋ง๋ฒ์ฌ๊ฐ ์๋๋ผ ์คํ๋ ค ์ฌ๋๋ค์ด ์ค์ ๋ก ์ง์ฅ์์ ํ๋ ๊ฒ๊ณผ ๋์ผํ ์์ ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ํํ๊ฒ ๋ฉ๋๋ค. ๊ด๋ จ๋ ๋จ๊ณ๋ฅผ ์งํํ๋ฉด์ ์ด๋ก ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฌด์์ํด์ผํฉ๋๊น?
์งํํ๋ฉด์ ์ ์ฐจ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ CI ๋จ๊ณ ๋ชฉ๋ก์ ๋ง๋ค ๊ฒ์ด๋ฉฐ, ์ด๋ ์ด ๋ชฉ๋ก์ ๊ธฐ์ตํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฆ, ์ง์์ ์ธ ํตํฉ์ ํ๋ฉด์ ๊ฐ๋ฐ์๊ฐ ์ทจํ๋ ํ๋ ๋ชฉ๋ก, ์ง์์ ์ธ ํตํฉ์ ์ํํ๋ ๊ฒ์ ๋๋ค. ๋ํ CI ํ๋ก์ธ์ค๋ฅผ ์ค์ ํ๋ก์ธ์ค์ ๋ ๊ฐ๊น๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ฐ๋จํ ํ ์คํธ ์ธํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์ด GIF๋ ๊ณผ์ ์ ์งํํ๋ฉด์ ์ ์ฅ์์ ์ปค๋ฐ์ ๊ฐ๋ต์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ๋ณด์๋ค์ํผ ์ฌ๊ธฐ์๋ ๋ณต์กํ ๊ฒ์ด ์์ผ๋ฉฐ ๊ฐ์ฅ ํ์ํ ๊ฒ๋ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ์ค CI ์๋๋ฆฌ์ค๋ฅผ ์งํํ๊ฒ ๋ฉ๋๋ค.
- ๊ธฐ๋ฅ ์์
- ํ์ง์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋ํ๋ ํ ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ์ฐ์ ์์ ์์ ์ ๊ตฌํ
- ๋ธ๋์น ๋ณํฉ ์ ์ถฉ๋ ํด๊ฒฐ(๋ณํฉ ์ถฉ๋)
- ํ๋ก๋์ ํ๊ฒฝ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฌด์์ ๋ฐฐ์ธ ๊ฒ์ธ๊ฐ?
๋น์ ์ ๋ค์ ์ง๋ฌธ์ ๋๋ตํ ์ ์์ ๊ฒ์ ๋๋ค:
- ์ง์์ ํตํฉ(CI)์ด๋ ๋ฌด์์ ๋๊น?
- CI์๋ ์ด๋ค ์ ํ์ ์๋ํ๋ ํ ์คํธ๊ฐ ์ฌ์ฉ๋๋ฉฐ ์ด๋ค ์์ ์ ๋ํ ์๋ต์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๊น?
- ๋์ด์ค๊ธฐ ์์ฒญ์ ๋ฌด์์ด๋ฉฐ ์ธ์ ํ์ํฉ๋๊น?
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD)์ด๋ ๋ฌด์์ด๋ฉฐ CI์ ์ด๋ค ๊ด๋ จ์ด ์๋์?
- ๋ณ๊ฒฝ ์ฌํญ์ ๋ณํฉํ๊ฑฐ๋ ๋ฆฌ๋ฒ ์ด์คํด์ผ ํฉ๋๊น?
- ๋ค์ ๋ฒ์ ์์ ๋กค๋ฐฑํ๊ฑฐ๋ ์์ ํ์๊ฒ ์ต๋๊น?
์ฒ์์๋ "ํ ๋ฆฌํ์คํธ"์ ๊ฐ์ ๊ฒ์ ๋ชจ๋ ๊ณณ์์ ๋ฒ์ญํ์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ํ ์คํธ์ ๊ด๊ธฐ ์ ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ์ผ๋ถ ์ฅ์์์๋ ๋ฌธ๊ตฌ๋ฅผ ์์ด๋ก ๋ฐํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ ๋๋๋ก ์ฌ๋๋ค์ด ์ง์ฅ์์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฉ์ง ๋์ฌ "commit"์ฒ๋ผ "programmer surzhik"์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์ง์์ ํตํฉ์ด๋ ๋ฌด์์ ๋๊น?
์ง์์ ์ธ ํตํฉ, ๋๋ CI๋ ๊ฐ ํ ๊ตฌ์ฑ์์ด ์์ ์ ์ฝ๋๋ฅผ ํ๋ฃจ์ ํ ๋ฒ ์ด์ ๊ณตํต ์ ์ฅ์์ ํตํฉํ๊ณ ๊ฒฐ๊ณผ ์ฝ๋๊ฐ ์ต์ํ ์ค๋ฅ ์์ด ๋น๋๋์ด์ผ ํ๋ ๊ธฐ์ ๊ดํ์ ๋๋ค.
์ด ์ฉ์ด์ ๋ํด์๋ ์๊ฒฌ์ด ๋ถ๋ถํฉ๋๋ค.
๋ ผ์์ ํฌ์ธํธ๋ ํตํฉ ๋น๋์ ๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ํ๋ฃจ์ ํ ๋ฒ๋ง ์ฝ๋๋ฅผ ๋ณํฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ค์ ๋ก ์ง์์ ์ผ๋ก ํตํฉํ๊ธฐ์๋ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ์์นจ์ ์๋ก์ด ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ์ ๋ ์ ํ ๋ฒ ํตํฉํ๋ ํ์ ์๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ด๊ฒ์ด ํฉ๋ฆฌ์ ์ธ ๋ฐ๋์ด๊ธด ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํ๋ฃจ์ ํ ๋ฒ์ด๋ผ๋ ์ ์๋ ํฉ๋ฆฌ์ ์ผ๋ก ์ค์ฉ์ ์ด๊ณ ๊ตฌ์ฒด์ ์ด๋ฉฐ ๋ค์ํ ๊ท๋ชจ์ ํ์ ์ ํฉํ๋ค๊ณ ๋ฏฟ์ด์ง๋๋ค.
๋ ๋ค๋ฅธ ๋ฐ๋ ์๊ฒฌ์ C++๊ฐ ๋ ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์ ์ผํ ์ธ์ด๊ฐ ์๋๋ฉฐ ๋จ์ํ ๊ฒ์ฆ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ฅ ์๋ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ์ฝํ๋ค๋ ๊ฒ์ ๋๋ค. ์ผ๋ถ ํ ์คํธ ์ธํธ(์: ๋ก์ปฌ๋ก ์คํ๋๋ ๋จ์ ํ ์คํธ)๋ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด์ผ ํฉ๋๋ค. ํ์ฌ ์ปค๋ฎค๋ํฐ๋ ์ด๋ฅผ ์๊ตฌ ์ฌํญ์ผ๋ก ๋ง๋๋ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๊ณ ์์ผ๋ฉฐ, ์์ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "๋น๋ + ๋จ์ ํ ์คํธ"๊ฐ ์๋ง๋ ์ผ๋ฐ์ ์ธ ๊ดํ์ด ๋ ๊ฒ์ ๋๋ค.
์ง์์ ์ธ ํตํฉ ๋ค๋ฅธ ์ง์์ ์ธ ์ ๋ฌ (์ง์์ ์ธ ์ ๋ฌ, CD) ๊ฐ ํตํฉ ์ฃผ๊ธฐ ํ์ ๋ฆด๋ฆฌ์ค ํ๋ณด๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ณผ์ ์ ์ฒด์์ ์ฌ์ฉํ ๋จ๊ณ ๋ชฉ๋ก
- ์ต์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค์ธ์. ๋ค์์์ ์ง์ ๋ง๋ค๊ธฐ
master
. ์ผ์ ์์ํ๋ค. - ์ ๋ธ๋์น์ ์ปค๋ฐ์ ์์ฑํ์ธ์. ๋ก์ปฌ์์ ๋น๋ํ๊ณ ํ ์คํธํ์ธ์. ํต๊ณผํ๋ค? ๋ค์ ๋จ๊ณ๋ก ์ด๋ํฉ๋๋ค. ์คํจํ๋ค? ์ค๋ฅ๋ ํ ์คํธ๋ฅผ ์์ ํ๊ณ ๋ค์ ์๋ํ์ธ์.
- ์๊ฒฉ ์ ์ฅ์๋ ์๊ฒฉ ์ง์ ์ผ๋ก ํธ์ํฉ๋๋ค.
- ํ ์์ฒญ์ ์์ฑํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋ ผ์ํ๊ณ ํ ๋ก ์ด ๊ณ์๋จ์ ๋ฐ๋ผ ๋ ๋ง์ ์ปค๋ฐ์ ์ถ๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ ๋ถ๊ธฐ์์ ํ ์คํธ๋ฅผ ํต๊ณผ์ํต๋๋ค.
- ๋ง์คํฐ์์ ์ปค๋ฐ์ ๋ณํฉ/๋ฆฌ๋ฒ ์ด์คํฉ๋๋ค. ๋ณํฉ ๊ฒฐ๊ณผ์ ๋ํ ํ ์คํธ๊ฐ ํต๊ณผ๋๋๋ก ํฉ๋๋ค.
- ๊ธฐ๋ฅ ๋ถ๊ธฐ์์ ํ๋ก๋์ ์ผ๋ก ๋ฐฐํฌํฉ๋๋ค.
- ์ผ์ ๊ธฐ๊ฐ ๋์ ํ๋ก๋์ ์ ๋ชจ๋ ๊ฒ์ด ์ํธํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ง์คํฐ์ ๋ณํฉํฉ๋๋ค.
๏ธ ์ค๋น
์ฌ๋ฐ๋ฅธ ์ํํธ์จ์ด๊ฐ ์๋์ง ํ์ธํ์ธ์.
์ด ๊ฐ์ข๋ฅผ ์๊ฐํ๋ ค๋ฉด ๋ค์์ด ํ์ํฉ๋๋ค.
๋ชจ๋ Git ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์ฌ๊ธฐ์๋ ๋ช ๋ น์ค์ ๋ํ ๋ช ๋ น๋ง ์ ๊ณตํ๊ฒ ์ต๋๋ค.
๋ช ๋ น์ค์ ์ง์ํ๋ Git ํด๋ผ์ด์ธํธ๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์.
๋ช
๋ น์ค์ ์ง์ํ๋ Git ํด๋ผ์ด์ธํธ๊ฐ ์์ง ์๋ค๋ฉด ์ค์น ์ง์นจ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ ์ฅ์ ์ค๋น
๊ฐ์ธ ๋ณต์ฌ๋ณธ(ํฌํฌ)์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์๋ฃ? ๊ธฐ๋ณธ ์ค์ ์ ๋ณ๊ฒฝํ์ง ์์ ๊ฒฝ์ฐ ์ฝ์ค ์ ์ฅ์๊ฐ ํธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. continuous-integration-team-scenarios-students
, GitHub ๊ณ์ ์ ์์ผ๋ฉฐ URL์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://github.com/<ะฒะฐัะต ะธะผั ะฟะพะปะทะพะฒะฐัะตะปั ะฝะฐ GitHub>/continuous-integration-team-scenarios-students
๊ทธ๋ฅ ์ด ์ฃผ์๋ก ์ ํํ ๊ฒ์ <URL ัะตะฟะพะทะธัะพัะธั>
.
๊บพ์ ๊ดํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<ััั>
์ด๋ ํด๋น ํํ์์ ์ ์ ํ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ค์์ ํ์ธํ์ธ์. GitHub ์์ ์ด ์ฝ์ค ์ ์ฅ์์ ํฌํจ๋์ด ์์ต๋๋ค. ํ์ฑํ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ํ์ด์ง ์ค์์ ์๋ ํฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ์ฑํํ์ธ์. GitHub ์ธํฐํ์ด์ค์์ ์์ ์ ํด๋ฆญํ๋ฉด ํด๋น ๋ฒํผ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
GitHub Actions๊ฐ ํ์ฑํ๋์ง ์์ผ๋ฉด ๋ด ์ง์นจ์ ๋ฐ๋ผ ๊ณผ์ ์ ์๋ฃํ ์ ์์ต๋๋ค.
์ธ์ ๋ ์ง GitHub์ Markdown ๋ ๋๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฌ๊ธฐ์์ ์์ฑ ์ค์ธ ๋ชฉ๋ก์ ํ์ฌ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md
๋ต๋ณ์ ๋ํด
์ด ๊ณผ์ ์ ์๋ฃํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง์ ํด๋ณด๋ ๊ฒ์ด์ง๋ง, ๋ช ๊ฐ์ง ์ด๋ ค์์ด ์์ ์ ์์ต๋๋ค.
๋ฌด์์ ํด์ผ ํ ์ง ์ดํด๊ฐ ์ ๋๊ณ ๊ณ์ํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ค๋ ๋๋ฅผ ์ดํด๋ณด์ธ์. solution
, ์ด๋ ์์ ์ ์ฅ์์ ์์ต๋๋ค.
๋ณํฉํ์ง ๋ง์ธ์. solution
ะฒ master
๊ณผ์ ์ค์. Git์ด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด ๋ถ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ํํ ์์
์ ํ์
ํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์์ฑ์์ ์ฝ๋์ ๋น๊ตํ ์ ์์ต๋๋ค. ์์ ํ ๋ถ์ค๋ ๊ฒฝ์ฐ ์ง์ ์ ์์ ํ ๊ต์ฒดํ ์ ์์ต๋๋ค. master
๊ฐ์ง์ solution
๊ทธ๋ฐ ๋ค์ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ํ์ํ ์ฝ์ค ๋จ๊ณ๋ก ์ฌ์ค์ ํ์ธ์.
์ ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ์ธ์
์ฝ๋๋ฅผ ์ปค๋ฐํ์ธ์.
git add .
git commit -m "Backing up my work"
์ด ๋ช ๋ น
- ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
master
ะฒmaster-backup
; - ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
solution
ะฒmaster
; - ์ ์ง์ ์ผ๋ก ๊ฒฐ์
master
์์ ๋๋ ํ ๋ฆฌ์ ๋ด์ฉ์ ๋ค์ ์์ฑํฉ๋๋ค. - ๋์ค์ "์๋ฃจ์ " ๋ถ๊ธฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ "๋ง์คํฐ"(์ด์ ์๋ "์๋ฃจ์ "์)์์ "์๋ฃจ์ " ๋ถ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค.
git branch -m master master-backup
git branch -m solution master
git checkout master -f
git branch solution
์ด ๋จ๊ณ ํ์๋ ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. git log master
์ด๋ค ์ปค๋ฐ์ด ํ์ํ์ง ์์๋ณด์ธ์.
๋ค์๊ณผ ๊ฐ์ด ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ์ด ์ปค๋ฐ์ผ๋ก ์ฌ์ค์ ํ ์ ์์ต๋๋ค.
git reset --hard <the SHA you need>
๊ฒฐ๊ณผ๊ฐ ๋ง์กฑ์ค๋ฌ์ฐ๋ฉด ์ด๋ ์์ ์์๋ ์ ์ฅ์ ๋ฒ์ ์ ์๊ฒฉ ์ ์ฅ์์ ๊ฒ์ํด์ผ ํฉ๋๋ค. ์ด ์์ ์ ์ํํ ๋ ์๊ฒฉ ๋ถ๊ธฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
git push --force origin master
์ฌ์ฉํ๊ณ ์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์ธ์ git push --force
. ์ด ์์
์ ์์ฃผ ์ํํ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ง๋ง ์ฌ๊ธฐ์๋ ์์ ์ด ์ํํ๋ ์์
์ ์ดํดํ๊ณ ์๋ ํ ๋ช
์ ์ ์ฅ์ ์ฌ์ฉ์์ ๋ํ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
์ผ์ ์์ํ๋ค
CI ๋จ๊ณ ๋ชฉ๋ก์ ์ปดํ์ผํด ๋ณด๊ฒ ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๊ฒฉ ์ ์ฅ์์์ ์ต์ ๋ฒ์ ์ ์ฝ๋๋ฅผ ์ฒดํฌ์์ํ์ฌ ์ด ๋จ๊ณ๋ฅผ ์์ํ์ง๋ง ์์ง ๋ก์ปฌ ์ ์ฅ์๊ฐ ์์ผ๋ฏ๋ก ๋์ ์๊ฒฉ ์ ์ฅ์์์ ๋ณต์ ํฉ๋๋ค.
๏ธ ์์
: ๋ก์ปฌ ์ ์ฅ์๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๋ค์์์ ๋ถ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค. master
, ์ผ์ ์์ํ๋ค
- ๋ค์์์ ์ฝ์ค ์ ์ฅ์๋ฅผ ๋ณต์ ํฉ๋๋ค.
<URL ัะตะฟะพะทะธัะพัะธั>
. - ์คํ
npm install
์ฝ์ค ์ ์ฅ์ ๋๋ ํ ๋ฆฌ์ ์์ต๋๋ค. ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉํ๋ Jest๋ฅผ ์ค์นํ๋ ค๋ฉด ์ด๊ฒ์ด ํ์ํฉ๋๋ค. - ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์ด๋ฆ์ ์ง์ ํ์ธ์.
feature
. ์ด ์ค๋ ๋๋ก ์ ํํ์ธ์. -
ํ ์คํธ ์ฝ๋ ์ถ๊ฐ
ci.test.js
๋ํํ ์ด๋ ๊ฒ ํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๋๊ธ๋ค ์ฌ์ด์์.it('1. pull latest code', () => { expect(/.*pull.*/ig.test(fileContents)).toBe(true); }); it('2. add commits', () => { expect(/.*commit.*/ig.test(fileContents)).toBe(true); }); it('3. push to the remote branch with the same name', () => { expect(/.*push.*/ig.test(fileContents)).toBe(true); }); it('4. create a pull request and continue working', () => { expect(/.*pulls+request.*/ig.test(fileContents)).toBe(true); });
- ํ์ผ์ ์ฒ์ 4๋จ๊ณ๋ก ํ
์คํธ ์ถ๊ฐ
ci.md
.1. Pull in the latest code. Create a branch from `master`. Start working. 2. Create commits on your new branch. Build and test locally. Pass? Go to the next step. Fail? Fix errors or tests and try again. 3. Push to your remote repository or remote branch. 4. Create a pull request. Discuss the changes, add more commits as discussion continues. Make tests pass on the feature branch.
ํ
# ะะปะพะฝะธััะนัะต ัะตะฟะพะทะธัะพัะธะน ะบัััะฐ
git clone <repository URL>
cd <repository name>
# ะัะฟะพะปะฝะธัะต npm install ะฒ ะบะฐัะฐะปะพะณะต ัะตะฟะพะทะธัะพัะธั ะบัััะฐ; ะพะฝ ัััะฐะฝะพะฒะธั Jest, ะบะพัะพััะน ะผั ะธัะฟะพะปัะทัะตะผ ะดะปั ะทะฐะฟััะบะฐ ัะตััะพะฒ.
npm install
# ะกะพะทะดะฐะนัะต ะฒะตัะบั ะธ ะฝะฐะทะพะฒะธัะต ะตะต feature. ะะตัะตะบะปััะธัะตัั ะฝะฐ ััั ะฒ ะฒะตัะบั.
git checkout -b feature
# ะััะตะดะฐะบัะธััะนัะต ci.test.js ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒััะต.
# ะััะตะดะฐะบัะธััะนัะต ci.md ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒััะต
์ ๋ธ๋์น์ ์ปค๋ฐ์ ์์ฑํ๊ณ , ๋ก์ปฌ์์ ๋น๋ ๋ฐ ํ ์คํธํ์ธ์.
์ปค๋ฐํ๊ธฐ ์ ์ ์คํํ ํ ์คํธ๋ฅผ ์ค์ ํ ๋ค์ ์ฝ๋๋ฅผ ์ปค๋ฐํ๊ฒ ์ต๋๋ค.
ํ ์คํธ๊ฐ ์๋์ผ๋ก ์คํ๋๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค
- ์ฅ์ ์์์:
- ์ง์์ ์ผ๋ก ๋๋ ์ ์ ํ ์ฝ๋ ๋ณ๊ฒฝ์ ๋์ํ์ฌ
- ์ ์ฅ ์(ํต์ญ ๋๋ JIT ์ปดํ์ผ ์ธ์ด์ ๊ฒฝ์ฐ)
- ์กฐ๋ฆฝ ์ค(์ปดํ์ผ์ด ํ์ํ ๊ฒฝ์ฐ)
- ์ปค๋ฐ ์;
- ๊ณต์ ์ ์ฅ์์ ๊ฒ์ํ๋ ๊ฒฝ์ฐ.
- ๋น๋ ์๋ฒ ๋๋ ๋น๋ ํ๊ฒฝ์์:
- ์ฝ๋๊ฐ ๊ฐ์ธ ๋ธ๋์น/์ ์ฅ์์ ๊ฒ์๋๋ ๊ฒฝ์ฐ.
- ์ด ์ค๋ ๋์ ์ฝ๋๋ ํ ์คํธ ์ค์ ๋๋ค.
- ํฉ๋ณ์ ์ ์ฌ์ ๊ฒฐ๊ณผ๋ ํ
์คํธ๋ฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก
master
). - ์ง์์ ์ธ ํตํฉ ๋จ๊ณ/์ง์์ ์ธ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ
์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ๋๊ตฌ ๋ชจ์์ด ๋ ๋น ๋ฅด๊ฒ ์คํ๋ ์๋ก ๋ ์์ฃผ ์คํํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์คํ ์ด์ง ๋ถํฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋น ๋ฅธ ๋จ์ ํ ์คํธ - ๋น๋ ์ค CI ํ์ดํ๋ผ์ธ์์
- CI ํ์ดํ๋ผ์ธ์์ ๋๋ฆฐ ๋จ์ ํ ์คํธ, ๋น ๋ฅธ ๊ตฌ์ฑ ์์ ๋ฐ ํตํฉ ํ ์คํธ - ์ปค๋ฐ ์
- ๋๋ฆฐ ๊ตฌ์ฑ ์์ ๋ฐ ํตํฉ ํ ์คํธ - CI ํ์ดํ๋ผ์ธ์์
- ๋ณด์ ํ ์คํธ, ๋ก๋ ํ ์คํธ ๋ฐ ๊ธฐํ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ฑฐ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ํ ์คํธ - CI/CD ํ์ดํ๋ผ์ธ์์ ์ํ๋์ง๋ง ๋ฆด๋ฆฌ์ค ํ๋ณด๋ฅผ ์ค๋นํ๊ฑฐ๋ ์๋์ผ๋ก ์คํํ ๋์ ๊ฐ์ด ๋น๋์ ํน์ ๋ชจ๋/๋จ๊ณ/ํ์ดํ๋ผ์ธ์์๋ง ๊ฐ๋ฅํฉ๋๋ค.
๏ธ๊ณผ์
๋จผ์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํ
์คํธ๋ฅผ ์คํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. npm test
. ๊ทธ๋ฐ ๋ค์ ์ปค๋ฐ ์ ํ
์คํธ๋ฅผ ์คํํ๊ธฐ ์ํด git ํํฌ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Git ํํฌ๋ ์ ์ฅ์์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ง ์์ผ๋ฏ๋ก ๋๋จธ์ง ๊ต์ก ์๋ฃ์ ํจ๊ป GitHub์์ ๋ณต์ ํ ์ ์์ต๋๋ค. ํํฌ๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ค์์ ์คํํด์ผ ํฉ๋๋ค. install_hook.sh
์๋๋ฉด ํ์ผ์ ๋ณต์ฌํด์ repo/hooks/pre-commit
๋ก์ปฌ ๋๋ ํ ๋ฆฌ๋ก .git/hooks/
.
์ปค๋ฐํ๋ฉด ํ
์คํธ๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ผ๋ฉฐ ํน์ ํค์๋๊ฐ ๋ชฉ๋ก์ ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ช
๋ น์ ์คํํ์ฌ ์๋์ผ๋ก ํ
์คํธ๋ฅผ ์คํํ์ญ์์ค.
npm test
์ฝ์ค ์ ์ฅ์ ํด๋์ ์์ต๋๋ค. ํ ์คํธ๊ฐ ์๋ฃ๋์๋์ง ํ์ธํฉ๋๋ค. - ๋ค์์ ์คํํ์ฌ ์ปค๋ฐ ํํฌ(์ฌ์ ์ปค๋ฐ ํํฌ)๋ฅผ ์ค์ ํฉ๋๋ค.
install_hook.sh
. - ๋ณ๊ฒฝ ์ฌํญ์ ๋ก์ปฌ ์ ์ฅ์์ ์ปค๋ฐํฉ๋๋ค.
- ์ปค๋ฐํ๊ธฐ ์ ์ ํ ์คํธ๊ฐ ์คํ๋๋์ง ํ์ธํ์ธ์.
๋ค์ ๋จ๊ณ๋ฅผ ์ํํ๋ฉด ์ ์ฅ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค.
ํ
# ะฃััะฐะฝะพะฒะธัะต pre-commit hook ะฒัะฟะพะปะฝะธะฒ install_hook.sh.
# ะะฐะบะพะผะผะธัััะต ะธะทะผะตะฝะตะฝะธั ะฒ ะปะพะบะฐะปัะฝัะน ัะตะฟะพะทะธัะพัะธะน. ะัะฟะพะปัะทัะนัะต "Add first CI steps" ะฒ ะบะฐัะตััะฒะต ัะพะพะฑัะตะฝะธั ะฟัะธ ะบะพะผะผะธัะต.
git add ci.md ci.test.js
git commit -m "Add first CI steps"
# ะฃะฑะตะดะธัะตัั, ััะพ ัะตััั ะทะฐะฟััะบะฐัััั ะฟะตัะตะด ะบะพะผะผะธัะพะผ.
์๊ฒฉ ์ ์ฅ์ ๋๋ ์๊ฒฉ ์ง์ ์ ์ฝ๋ ๊ฒ์
๋ก์ปฌ์์ ์์ ์ ๋ง์น ํ ๊ฐ๋ฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๊ณต๊ฐํ์ฌ ๊ฒฐ๊ตญ ๋์ค๊ณผ ํตํฉ๋ ์ ์๋๋ก ํฉ๋๋ค. GitHub๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ ์ฅ์์ ๊ฐ์ธ ๋ณต์ฌ๋ณธ(๊ฐ์ธ ํฌํฌ)์ด๋ ๊ฐ์ธ ์ง์ ์ ์์ ์ ๊ฒ์ํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ํฌํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ์๊ฒฉ ๊ณต์ ์ ์ฅ์๋ฅผ ๋ณต์ ํ์ฌ ํฌํฌ๋ผ๊ณ ๋ ํ๋ ๊ฐ์ธ ์๊ฒฉ ๋ณต์ฌ๋ณธ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ๊ฐ์ธ ์ ์ฅ์๋ฅผ ๋ณต์ ํ์ฌ ๋ก์ปฌ๋ก ์์
ํฉ๋๋ค. ์์
์ด ์๋ฃ๋๊ณ ์ปค๋ฐ์ด ์ด๋ฃจ์ด์ง๋ฉด ๊ทธ๋ ์ด๋ฅผ ์์ ์ ํฌํฌ์ ํธ์ํฉ๋๋ค. ํฌํฌ์์ ํด๋น ์ปค๋ฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๊ณ ๊ณตํต ์ ์ฅ์์ ํตํฉ๋ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ GitHub์ ์คํ ์์ค ํ๋ก์ ํธ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ด ๊ณ ๊ธ ๊ณผ์ [Git์ ์ฌ์ฉํ ํ์ํฌ ๋ฐ CI]์์๋ ์ฌ์ฉ๋ฉ๋๋ค(
http://devops.redpill.solutions/ ). - ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ํ๋์ ์๊ฒฉ ์ ์ฅ์๋ง ์ฌ์ฉํ๊ณ ๋ถ๊ธฐ๋ง ๊ณ์ฐํ๋ ๊ฒ์
๋๋ค.
master
๊ณต์ ์ ์ฅ์๊ฐ "๋ณดํธ๋จ"์ ๋๋ค. ์ด ์๋๋ฆฌ์ค์์ ๊ฐ๋ณ ๊ฐ๋ฐ์๋ ๋ค๋ฅธ ์ฌ๋์ด ์ด ์ฝ๋๋ฅผ ๋ณผ ์ ์๋๋ก ์๊ฒฉ ์ ์ฅ์์ ๋ถ๊ธฐ์ ์์ ์ ์ฝ๋๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ฉด ๋ค์๊ณผ ๋ณํฉํฉ๋๋ค.master
๊ณต์ ์ ์ฅ์.
์ด ํน์ ๊ณผ์ ์์๋ ๋ธ๋์น๋ฅผ ์ฌ์ฉํ๋ ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฝ๋๋ฅผ ๊ณต๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
๏ธ๊ณผ์
- ์์ ์ง์ ๊ณผ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์๊ฒฉ ์ง์ ์ ๋ณ๊ฒฝ ์ฌํญ ๊ฒ์
ํ
git push --set-upstream origin feature
๋์ด์ค๊ธฐ ์์ฒญ ๋ง๋ค๊ธฐ
์ ๋ชฉ์ด ํฌํจ๋ ํ ์์ฒญ ๋ง๋ค๊ธฐ ๋จ๊ณ ๊ฒํ ... ์ค์น feature
"๋ณธ์ "๊ณผ ๊ฐ์ master
"๊ธฐ๋ณธ ์ง์ "๊ณผ ๊ฐ์ต๋๋ค.
์ค์นํ๋์ง ํ์ธํ์ธ์.
master
๊ทธ์ ์ ์ฅ์๋ฅผ ํฌํฌํ๋ค "๊ธฐ๋ณธ ๋ถ๊ธฐ"๋ก์ ์ ๋ ๊ฐ์ ์๋ฃ ์ ์ฅ์ ๋ณ๊ฒฝ ์์ฒญ์ ์๋ตํ์ง ์์ต๋๋ค.
GitHub ์ฉ์ด์์ "๊ธฐ๋ณธ ๋ถ๊ธฐ"๋ ์์ ์ ๊ธฐ๋ฐ์ด ๋๋ ๋ถ๊ธฐ์ด๊ณ "ํค๋ ๋ถ๊ธฐ"๋ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ ๋ถ๊ธฐ์ ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ํ ๋ก ํ๊ณ , ํ ๋ก ์ด ๊ณ์๋๋ฉด์ ์๋ก์ด ์ปค๋ฐ์ ์ถ๊ฐํ์ธ์.
ํ ๋ฆฌํ์คํธ(ํ๋ณด)
ํ ๋ฆฌํ์คํธ(ํ๋ณด) ์ฝ๋๋ฅผ ๋ ผ์ํ๊ณ ๋ฌธ์ํํ ๋ฟ๋ง ์๋๋ผ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ ์์ฒญ์ ์ด๋ฆ์ ๊ฐ๋ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฒด ์ฝ๋์ ํตํฉํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ ๋ช ๋ช ๋์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋์ ํ๋ก์ ํธ์ ์๊ฒฉ ๊ณต์ ์ ์ฅ์๋ฅผ ๋ณต์ ํ๊ณ ๋ก์ปฌ์์ ์ฝ๋ ์์ ์ ์ํํฉ๋๋ค. ๊ทธ ํ ๊ทธ๋ ์์ ์ ๊ฐ์ธ ์๊ฒฉ ์ ์ฅ์์ ์ฝ๋๋ฅผ ๋ฐฐ์นํ๊ณ ๊ณต์ ์ ์ฅ์ ์ฑ ์์์๊ฒ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์์ฒญํฉ๋๋ค(๋น๊ฒจ) ํด๋น ์ฝ๋๋ฅผ ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅํ์ฌ ๊ฒํ ํ๊ณ ํตํฉํ ์ ์์ต๋๋ค(๋ณํฉ) ๊ทธ์. ์ด ๊ฐ๋ ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค. ๋ณํฉ ์์ฒญ.
์ค์ ๋ก GitHub ๋๋ ์ ์ฌํ ํ๋ซํผ์ ํ ์์ฒญ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ๊ฐ๋ฐํ์ ๋๋ฉด ์ปค๋ฎค๋์ผ์ด์ , ์์ฑ ํตํ, ์ด๋ฉ์ผ ๋ฑ ๋ค๋ฅธ ์ปค๋ฎค๋์ผ์ด์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ฌ์ ํ ํฌ๋ผ ์คํ์ผ ํ ์์ฒญ์ ์ฌ์ฉํ๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํน์ ์ฝ๋ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ์ฒด๊ณ์ ์ธ ํ ๋ก ;
- ์๋ ํ ์คํฐ์ ๋๋ฃ ๋ชจ๋์ ์งํ ์ค์ธ ์์ ์ ๋ํ ํผ๋๋ฐฑ์ ๋ณผ ์ ์๋ ์ฅ์์ ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ์ ๊ณต์ํ;
- ๋์ค์ ์ด ์ฝ๋ ๋๋ ํด๋น ์ฝ๋ ๋ค์ ์จ์ ์ด์ ์ ๊ณ ๋ ค ์ฌํญ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ ผ์ํ๊ฑฐ๋ ํผ๋๋ฐฑ์ ๋ฐ์์ผ ํ ๋ ๋์ด์ค๊ธฐ ์์ฒญ์ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ ๊ธฐ๋ฅ์ ์์ ํ๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ฝ๋ ์ค์ ์์ฑํ๊ธฐ ์ ์ ํ ์์ฒญ์ ์์ฑํ์ฌ ์์ด๋์ด๋ฅผ ๊ณต์ ํ๊ณ ๊ณต๋ ์์ ์์ ๊ณํ์ ๋ ผ์ํ ์ ์์ต๋๋ค. ์์ ์ด ๋ ๊ฐ๋จํ๋ค๋ฉด, ๋ฌด์ธ๊ฐ๊ฐ ์ด๋ฏธ ์๋ฃ๋๊ณ , ์ปค๋ฐ๋๊ณ , ๋ ผ์๋ ์ ์์ ๋ ํ ์์ฒญ์ด ์ด๋ฆฝ๋๋ค. ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ ์๋ํ๋ ํ ์คํธ๋ฅผ ์คํํ๊ฑฐ๋ ์ฝ๋ ๊ฒํ ๋ฅผ ์์ํ๊ธฐ ์ํด ํ์ง ๊ด๋ฆฌ ๋ชฉ์ ์ผ๋ก๋ง PR์ ์ด ์ ์์ต๋๋ค. ๋ฌด์์ ๊ฒฐ์ ํ๋ ๋์ด์ค๊ธฐ ์์ฒญ์์ ์น์ธ์ ์ํ๋ ์ฌ๋๋ค์ @๋ฉ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ผ๋ฐ์ ์ผ๋ก PR์ ๋ง๋ค ๋ ๋ค์์ ์ํํฉ๋๋ค.
- ๋ณ๊ฒฝํ๋ ค๋ ๋ด์ฉ๊ณผ ์์น๋ฅผ ํ์ํ์ญ์์ค.
- ๋ณ๊ฒฝ ๋ชฉ์ ์ ์ค๋ช
ํ๋ ์ค๋ช
์ ์์ฑํฉ๋๋ค. ๋น์ ์ ์ํ ์๋ ์์ต๋๋ค:
- ์ฝ๋์์ ๋ช ํํ์ง ์์ ์ค์ํ ํญ๋ชฉ์ด๋ ๊ด๋ จ #bug ๋ฐ ์ปค๋ฐ ๋ฒํธ์ ๊ฐ์ด ์ปจํ ์คํธ๋ฅผ ์ดํดํ๋ ๋ฐ ์ ์ฉํ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค.
- ํจ๊ป ์์ ์ ์์ํ๊ณ ์ถ์ ์ฌ๋์ @๋ฉ์ ํ๊ฑฐ๋ ๋์ค์ ๋๊ธ์์ @๋ฉ์ ํ ์ ์์ต๋๋ค.
- ๋๋ฃ์๊ฒ ๋์์ ์์ฒญํ๊ฑฐ๋ ๊ตฌ์ฒด์ ์ธ ์ฌํญ์ ํ์ธํ์ธ์.
PR์ ์ด๋ฉด ์ด๋ฌํ ๊ฒฝ์ฐ์ ์คํ๋๋๋ก ๊ตฌ์ฑ๋ ํ ์คํธ๊ฐ ์คํ๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ด๋ ๋ก์ปฌ์์ ์คํํ ๊ฒ๊ณผ ๋์ผํ ํ ์คํธ ์ธํธ์ด์ง๋ง ์ค์ ํ๋ก์ ํธ์์๋ ์ถ๊ฐ ํ ์คํธ ๋ฐ ํ์ธ์ด ์์ ์ ์์ต๋๋ค.
ํ ์คํธ๊ฐ ์๋ฃ๋๋ ๋์ ์ ์ ๊ธฐ๋ค๋ ค ์ฃผ์ญ์์ค. GitHub ์ธํฐํ์ด์ค์ PR ํ ๋ก ํ๋จ์์ ํ ์คํธ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ํ ์คํธ๊ฐ ์๋ฃ๋๋ฉด ๊ณ์ํ์ธ์.
๏ธ CI ๋จ๊ณ ๋ชฉ๋ก์ ๋ฌด์์์ฑ์ ๋ํ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ์ธ์.
์ด ๊ณผ์ ์์ ์ฌ์ฉ๋ ๋ชฉ๋ก์ ์์์ ์ด๊ณ ์ฃผ๊ด์ ์ด๋ฏ๋ก ์ด์ ๋ํด ์ฐธ๊ณ ์ฌํญ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๏ธ ์์ : ์ด ๋๊ธ์ ๋ํ ํ ์์ฒญ ์์ฑ
- ์ง์ ์ผ๋ก ์ ํ
master
. - ๋ผ๋ ์ด๋ฆ์ ์ง์ ์ ๋ง๋ญ๋๋ค.
bugfix
. - ํ์ผ ๋์ ๋ฉ๋ชจ ํ
์คํธ ์ถ๊ฐ
ci.md
.> **GitHub flow** is sometimes used as a nickname to refer to a flavor of trunk-based development when code is deployed straight from feature branches. This list is just an interpretation that I use in my [DevOps courses](http://redpill.solutions). The official tutorial is [here](https://guides.github.com/introduction/flow/).
- ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค.
- ์ค๋ ๋ ๊ฒ์
bugfix
์๊ฒฉ ์ ์ฅ์๋ก. - ๋ผ๋ ์ด๋ฆ์ ํ ์์ฒญ์ ์์ฑํฉ๋๋ค. ๋น๊ณ ์ถ๊ฐ ๋ณธ๋ถ ์ง์ ์ด ์๋
bugfix
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ์ง์ master
.
์ค์นํ๋์ง ํ์ธํ์ธ์.
master
๊ทธ์ ์ ์ฅ์๋ฅผ ํฌํฌํ๋ค "๊ธฐ๋ณธ ๋ถ๊ธฐ"๋ก์ ์ ๋ ๊ฐ์ ์๋ฃ ์ ์ฅ์ ๋ณ๊ฒฝ ์์ฒญ์ ์๋ตํ์ง ์์ต๋๋ค.
์ ์ฅ์๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
ํ
# ะะตัะตะบะปััะธัะตัั ะฝะฐ ะฒะตัะบั master. ะกะพะทะดะฐะนัะต ะฒะตัะบั bugfix.
git checkout master
# ะกะพะทะดะฐะนัะต ะฒะตัะบั bugfix-remark.
git checkout -b bugfix
# ะะพะฑะฐะฒััะต ัะตะบัั ะฟัะธะผะตัะฐะฝะธั ะฒะฝะธะทั ci.md.
# ะะฐะบะพะผะผะธัััะต ะธะทะผะตะฝะตะฝะธั
git add ci.md
git commit -m "Add a remark about the list being opinionated"
# ะะฟัะฑะปะธะบัะนัะต ะฒะตัะบั bugfix ะฒ ัะดะฐะปัะฝะฝัะน ัะตะฟะพะทะธัะพัะธะน.
git push --set-upstream origin bugfix
# ะกะพะทะดะฐะนัะต pull request ะฟัะธ ะฟะพะผะพัะธ ะธะฝัะตััะตะนัะฐ GitHub ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒััะต
ํ ์์ฒญ ์น์ธ "๋น๊ณ ์ถ๊ฐ"
๏ธ๊ณผ์
- ํ ์์ฒญ์ ์์ฑํฉ๋๋ค.
- "ํ ์์ฒญ ๋ณํฉ"์ ํด๋ฆญํ์ธ์.
- "๋ณํฉ ํ์ธ"์ ํด๋ฆญํ์ธ์.
- "๋ธ๋์น ์ญ์ "๋ฅผ ํด๋ฆญํ๋ฉด ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค.
์ด๋ ๋ณํฉ ํ ์ปค๋ฐ์ ๋ณด์ฌ์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ์
๋๋ค.
๏ธ ๊ณ์ ์์ ํ๊ณ ํ ์คํธ๋ฅผ ์ถ๊ฐํ์ธ์
๋์ด์ค๊ธฐ ์์ฒญ์ ๋ํ ๊ณต๋ ์์ ์ผ๋ก ์ธํด ์ถ๊ฐ ์์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ ๊ฒํ ๋๋ ํ ๋ก ์ ๊ฒฐ๊ณผ์ด์ง๋ง, ์ฐ๋ฆฌ ๊ณผ์ ์์๋ CI ๋จ๊ณ ๋ชฉ๋ก์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ๋ชจ๋ธ๋งํ ๊ฒ์ ๋๋ค.
์ง์์ ํตํฉ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ถ ํ ์คํธ ์ ์ฉ ๋ฒ์๊ฐ ํฌํจ๋ฉ๋๋ค. ํ ์คํธ ์ ์ฉ ๋ฒ์ ์๊ตฌ ์ฌํญ์ ๋ค์ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก "๊ธฐ์ฌ ์ง์นจ"๊ณผ ๊ฐ์ ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฐ๋จํ๊ฒ ์ ์งํ๊ณ ์ฒดํฌ๋ฆฌ์คํธ์ ๊ฐ ์ค์ ๋ํ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
ํ ๋น์ ์คํํ ๋ ๋จผ์ ํ
์คํธ๋ฅผ ์ปค๋ฐํด ๋ณด์ธ์. ์ฌ๋ฐ๋ฅด๊ฒ ์ค์นํ๋ค๋ฉด pre-commit
๋ ์ผ์ฐ ํํฌํ๋ฉด ์๋ก ์ถ๊ฐ๋ ํ
์คํธ๊ฐ ์คํ๋๊ณ ์คํจํ๋ฉฐ ์๋ฌด ๊ฒ๋ ์ปค๋ฐ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ํ
์คํธ๊ฐ ์ค์ ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ
์คํธํ๊ณ ์๋ค๋ ๊ฒ์ ์๋ ๋ฐฉ๋ฒ์
๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ํ
์คํธ ์ ์ ์ฝ๋๋ก ์์ํ๋ค๋ฉด ํ
์คํธ๋ฅผ ํต๊ณผํ๋ค๋ ๊ฒ์ ์ฝ๋๊ฐ ์์๋๋ก ์๋ํ๊ฑฐ๋ ํ
์คํธ๊ฐ ์ค์ ๋ก ์๋ฌด๊ฒ๋ ํ
์คํธํ์ง ์์๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ, ์ฐ๋ฆฌ๊ฐ ์ฒ์์ ํ
์คํธ๋ฅผ ์์ฑํ์ง ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ ํ
์คํธ์ ๋ํด ์์ ํ ์์ด๋ฒ๋ ธ์ ๊ฒ์
๋๋ค.
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD)
TDD๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ์์ฑํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. TDD๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ ์คํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ ํ ์คํธ๊ฐ ์คํจํ๋์ง ํ์ธํฉ๋๋ค.
- ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
- ํ ์คํธ๋ฅผ ์คํํ๊ณ ๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํ์ธ์.
- ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ์ธ์.
- ๋ฐ๋ณตํ๋ค.
์คํจํ ํ ์คํธ์ ๊ฒฐ๊ณผ๋ ์ผ๋ฐ์ ์ผ๋ก ๋นจ๊ฐ์์ผ๋ก ํ์๋๊ณ , ํต๊ณผํ ํ ์คํธ์ ๊ฒฐ๊ณผ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ น์์ผ๋ก ํ์๋๋ฏ๋ก ์ด ์ฃผ๊ธฐ๋ฅผ ๋นจ๊ฐ์-๋ น์-๋ฆฌํฉํฐ๋ง์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
๏ธ๊ณผ์
๋จผ์ ํ
์คํธ๋ฅผ ์ปค๋ฐํ๊ณ ์คํจํ๋๋ก ํ ๋ค์ CI ๋จ๊ณ ๋ชฉ๋ก ์์ฒด์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ปค๋ฐํฉ๋๋ค. ํ
์คํธ๊ฐ ํต๊ณผ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค("๋
น์").
๊ทธ๋ฐ ๋ค์ ์ ์ฝ๋๋ฅผ ์๊ฒฉ ์ ์ฅ์์ ๊ฒ์ํ๊ณ ๋์ด์ค๊ธฐ ์์ฒญ ํ ๋ก ํ๋จ์ ์๋ GitHub ์ธํฐํ์ด์ค์์ ํ
์คํธ๊ฐ ์คํ๋๋ ๊ฒ๊ณผ PR ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ดํด๋ณด์ธ์.
- ์ง์ ์ผ๋ก ์ ํ
feature
. -
์ด ํ ์คํธ๋ฅผ ๋ค์์ ์ถ๊ฐํ์ญ์์ค.
ci.test.js
๋ง์ง๋ง ํตํ ํit (...);
.it('5. Merge/rebase commits from master. Make tests pass on the merge result.', () => { expect(/.*merge.*commits.*testss+pass.*/ig.test(fileContents)).toBe(true); }); it('6. Deploy from the feature branch to production.', () => { expect(/.*Deploy.*tos+production.*/ig.test(fileContents)).toBe(true); }); it('7. If everything is good in production for some period of time, merge changes to master.', () => { expect(/.*merge.*tos+master.*/ig.test(fileContents)).toBe(true); });
- ํ
์คํธ๋ฅผ ์ปค๋ฐํด ๋ณด์ธ์. ๋ง์ฝ์
pre-commit
ํํฌ๊ฐ ์ค์น๋์ด ์์ผ๋ฉด ์ปค๋ฐ ์๋๊ฐ ์คํจํฉ๋๋ค. - ๊ทธ๋ฐ ๋ค์ ์ด ํ
์คํธ๋ฅผ
ci.md
.5. Merge/rebase commits from master. Make tests pass on the merge result. 6. Deploy from the feature branch with a sneaky bug to production. 7. If everything is good in production for some period of time, merge changes to master.
- ๋ก์ปฌ์์ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐํฉ๋๋ค.
- ์ง์ ์ ๋ณ๊ฒฝ ์ฌํญ ๊ฒ์
feature
.
์ด์ ์ด๋ฐ ๊ฒ์ด ์์ด์ผํฉ๋๋ค
ํ
# ะะตัะตะบะปััะธัะตะปัะฝะฐ ะฒะตัะบั feature
git checkout feature
# ะะพะฑะฐะฒะธัั ัะตััั ะฒ ci.test.js ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒััะต
# ะะพะฑะฐะฒััะต ะฒ ะธะฝะดะตะบั ci.test.js ััะพะฑั ะฟะพะทะถะต ะทะฐะบะพะผะผะธัะธัั
git add ci.test.js
# ะะพะฟััะฐะนัะตัั ะทะฐะบะพะผะผะธัะธัั ัะตััั. ะัะปะธ pre-commit hook ัััะฐะฝะพะฒะปะตะฝั, ะบะพะผะผะธั ะฝะต ะฟัะพะธะทะพะนะดัั.
git commit
# ะขะตะฟะตัั ะดะพะฑะฐะฒััะต ัะตะบัั ะฒ ci.md ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒััะต
# ะะฝะตัะธัะต ะธะทะผะตะฝะตะฝะธั ะธ ะทะฐะบะพะผะผะธัััะต ะธั
git add ci.md
git commit -m "Add the remaining CI steps"
# ะะฟัะฑะปะธะบัะนัะต ะธะทะผะตะฝะตะฝะธั ะฒ ะฒะตัะบั feature
git push
๋ณํฉ ์ถฉ๋
๋ณ๊ฒฝ์์ฒญ ๋ฐ๋ก๊ฐ๊ธฐ ๋จ๊ณ ๊ฒํ .
์ฐ๋ฆฌ๊ฐ ์๋ชปํ ๊ฒ์ด ์๊ณ ์ฝ๋์ ๋ํ ํ
์คํธ๊ฐ ํต๊ณผ๋์์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋ธ๋์น๋ฅผ ๋ณํฉํ ์ ์์ต๋๋ค. feature
ะธ master
. ๋ค๋ฅธ ์ค๋ ๋ ๋๋ฌธ์ด์์. bugfix
์ ํฉ๋ณ๋์๋ค master
์ฐ๋ฆฌ๊ฐ ์ด PR ์์
์ ํ๋ ๋์.
์ด๋ก ์ธํด ์๊ฒฉ ์ง์ ์ด master
์ฐ๋ฆฌ๊ฐ ๋ธ๋์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฒ์ ๋ณด๋ค ์ต์ ๋ฒ์ ์ด ์์ต๋๋ค. feature
. ์ด ๋๋ฌธ์ HEAD๋ฅผ ๋๊ฐ์ ์๋ ์์ต๋๋ค. master
์ค๋ ๋ ๋๊น์ง feature
. ์ด ์ํฉ์์๋ ์ปค๋ฐ์ ๋ณํฉํ๊ฑฐ๋ ์ ์ฉํด์ผ ํฉ๋๋ค. feature
๋ฆฌ๋ฒ ์ด์ค master
. GitHub๋ ์ถฉ๋์ด ์์ผ๋ฉด ์ค์ ๋ก ์๋ ๋ณํฉ์ ์ํํ ์ ์์ต๋๋ค. ์์ฝ๊ฒ๋ ์ฐ๋ฆฌ ์ํฉ์์๋ ๋ ๋ธ๋์น ๋ชจ๋ ํ์ผ์ ๊ฒฝ์์ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. ci.md
. ์ด๋ฌํ ์ํฉ์ ๋ณํฉ ์ถฉ๋์ด๋ผ๊ณ ํ๋ฉฐ ์๋์ผ๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๋ณํฉ ๋๋ ๋ฆฌ๋ฒ ์ด์ค
๋ณํฉ
- ์ถ๊ฐ ๋ณํฉ ์ปค๋ฐ์ ์์ฑํ๊ณ ์์
๊ธฐ๋ก์ ์ ์ฅํฉ๋๋ค.
- ์๋ ํ์์คํฌํ ๋ฐ ์์ฑ์์ ํจ๊ป ๋ธ๋์น์ ์๋ ์ปค๋ฐ์ ๋ณด์กดํฉ๋๋ค.
- ๋ณ๊ฒฝ ์์ฒญ ํ ๋ก ์์ ์ปค๋ฐ์ SHA์ ์ด์ ๋ํ ๋งํฌ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์ผํ์ฑ ์ถฉ๋ ํด๊ฒฐ์ด ํ์ํฉ๋๋ค.
- ์ด์ผ๊ธฐ๋ฅผ ๋น์ ํ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
- (IDE ์ผ์ด๋ธ์ ์ฐ์์ํค๋) ๋ถ๊ธฐ ์๊ฐ ๋ง์ ์คํ ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์๋ ๋๋ฒ๊น
์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
git bisect
๋ ์ ์ฉํฉ๋๋ค. ๋ณํฉ ์ปค๋ฐ๋ง ์ฐพ์ต๋๋ค.
๋ฆฌ๋ฒ ์ด์ค
- ๊ธฐ๋ณธ ๋ถ๊ธฐ ์์ ํ์ฌ ๋ถ๊ธฐ์ ์ปค๋ฐ์ ์ฐจ๋ก๋ก ์ฌ์ํฉ๋๋ค.
- ์๋ก์ด SHA๊ฐ ํฌํจ๋ ์๋ก์ด ์ปค๋ฐ์ด ์์ฑ๋์ด GitHub์ ์ปค๋ฐ์ด ์๋ ๋์ด์ค๊ธฐ ์์ฒญ๊ณผ ์ผ์นํ์ง๋ง ํด๋น ์ฃผ์์ ์ผ์นํ์ง ์์ต๋๋ค.
- ์ปค๋ฐ์ ํ๋ก์ธ์ค์์ ๋ค์ ๊ฒฐํฉ ๋ฐ ์์ ๋๊ฑฐ๋ ํ๋๋ก ๋ณํฉ๋ ์๋ ์์ต๋๋ค.
- ์ฌ๋ฌ ์ถฉ๋์ ํด๊ฒฐํด์ผ ํ ์๋ ์์ต๋๋ค.
- ์ ํ์ ์ธ ์คํ ๋ฆฌ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
- ํฉ๋ฆฌ์ ์ธ ์ด์ ์์ด ๋๋ฌด ๊ธธ์ง ์๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ ์ฝ๊ธฐ ์ฌ์ธ ์๋ ์์ต๋๋ค.
- ์๋ ๋๋ฒ๊น
๋ฐ ๋ฌธ์ ํด๊ฒฐ์ด ์กฐ๊ธ ๋ ์ฌ์์ง๋๋ค.
git bisect
, ์๋ ๋กค๋ฐฑ์ ๋ ๋ช ํํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ํ๋๊ทธ๊ฐ ์๋ ๋ง์ด๊ทธ๋ ์ด์
๋ ์ปค๋ฐ์ด ์๋ ๋ธ๋์น๋ฅผ ๊ฒ์ํด์ผ ํฉ๋๋ค.
--force
ํ ์์ฒญ๊ณผ ํจ๊ป ์ฌ์ฉ๋ ๋.
์ผ๋ฐ์ ์ผ๋ก ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณํฉํด์ผ ํ ๋ ํญ์ ๋์ผํ ์ ๋ต์ ์ฌ์ฉํ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ด๋ "์์ํ" ๋ณํฉ ๋๋ ์๋จ์ "์์ํ" ์ปค๋ฐ์ผ ์๋ ์๊ณ , ๋ํ์์ผ๋ก ์๋จ์์ ์ปค๋ฐ์ ์ํํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๊ทธ ์ฌ์ด์ ๊ฒ์ผ ์๋ ์์ต๋๋ค(git rebase -i
) ๊ณต์ฉ ์ ์ฅ์์ ๊ฒ์๋์ง ์์ ๋ถ๊ธฐ์ ๊ฒฝ์ฐ ๋ก์ปฌ์ด์ง๋ง "๊ณต์ฉ" ๋ถ๊ธฐ์ ๊ฒฝ์ฐ ๋ณํฉ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ ๋ณํฉ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๏ธ๊ณผ์
- ์ฝ๋๊ฐ ๋ก์ปฌ ์ง์ ์ ์๋์ง ํ์ธํ์ธ์.
master
์๊ฒฉ ์ ์ฅ์์์ ์ ๋ฐ์ดํธ๋์์ต๋๋ค. - ์ง์ ์ผ๋ก ์ ํ
feature
. - ๋ธ๋์น์ ๋ณํฉ ์์
master
. ๊ฒฝ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ๋ณํฉ ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค.ci.md
. - CI ๋จ๊ณ ๋ชฉ๋ก๊ณผ ๊ทธ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์ด ๋ชจ๋ ํ ์คํธ์ ๋จ์ ์๋๋ก ์ถฉ๋์ ํด๊ฒฐํฉ๋๋ค.
- ์๊ฒฉ ๋ธ๋์น์ ๋ณํฉ ์ปค๋ฐ ๊ฒ์
feature
. - GitHub UI์์ ํ ์์ฒญ ์ํ๋ฅผ ํ์ธํ๊ณ ๋ณํฉ์ด ํด๊ฒฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
ํ
# ะฃะฑะตะดะธัะตัั, ััะพ ะบะพะด ะฒ ะปะพะบะฐะปัะฝะพะต ะฒะตัะบะต `master` ะพะฑะฝะพะฒะปัะฝ ะธะท ัะดะฐะปัะฝะฝะพะณะพ ัะตะฟะพะทะธัะพัะธั.
git checkout master
git pull
# ะะตัะตะบะปััะธัะตัั ะฝะฐ ะฒะตัะบั feature
git checkout feature
# ะะฝะธัะธะธััะนัะต ัะปะธัะฝะธะต ั ะฒะตัะบะพะน master
git merge master
# A merge conflict related to concurrent changes to ci.md will be reported
# => Auto-merging ci.md
# CONFLICT (content): Merge conflict in ci.md
# Automatic merge failed; fix conflicts and then commit the result.
# ะ ะฐะทัะตัะธัะต ะบะพะฝัะปะธะบั ัะฐะบ, ััะพะฑั ะธ ะฝะฐั ัะฟะธัะพะบ ัะฐะณะพะฒ CI, ะธ ะทะฐะผะตัะฐะฝะธะต ะพ ะฝะตะผ ะพััะฐะปะธัั ะฒ ัะตะบััะต.
# ะพััะตะดะฐะบัะธััะนัะต ci.md ััะพะฑ ะพะฝ ะฝะต ัะพะดะตัะถะฐะป ะผะฐัะบะตัะพะฒ ะบะพะฝัะปะธะบัะฐ ัะปะธัะฝะธั
git add ci.md
git merge --continue
# ะฟัะธ ะบะพะผะผะธัะต ะผะพะถะตัะต ะพััะฐะฒะธัั ัะพะพะฑัะตะฝะธะต ะฟะพ ัะผะพะปัะฐะฝะธั
# ะะฟัะฑะปะธะบัะนัะต ะบะพะผะผะธั ัะปะธัะฝะธั ะฒ ัะดะฐะปะตะฝะฝัั ะฒะตัะบั feature.
git push
# ะัะพะฒะตัััะต ััะฐััั ะทะฐะฟัะพัะฐ ะฝะฐ ะธะทะผะตะฝะตะฝะธั ะฒ ะฟะพะปัะทะพะฒะฐัะตะปััะบะพะผ ะธะฝัะตััะตะนัะต GitHub, ะดะพะถะดะธัะตัั ะฟะพะบะฐ ัะปะธัะฝะธะต ะฝะต ะฑัะดะตั ัะฐะทัะตัะตะฝะพ.
์ ํ์ด!
๋ชฉ๋ก ์์
์ด ์๋ฃ๋์์ผ๋ฉฐ ์ด์ ๋์ด์ค๊ธฐ ์์ฒญ์ ์น์ธํด์ผ ํฉ๋๋ค. master
.
๏ธ ์์ : ํ ์์ฒญ ์น์ธ "๋จ๊ณ ๊ฒํ "
- ๋์ด์ค๊ธฐ ์์ฒญ์ ์ฝ๋๋ค.
- "ํ ์์ฒญ ๋ณํฉ"์ ํด๋ฆญํ์ธ์.
- "๋ณํฉ ํ์ธ"์ ํด๋ฆญํ์ธ์.
- ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก "๋ธ๋์น ์ญ์ "๋ฅผ ํด๋ฆญํ์ธ์.
ํ์ฌ ๊ทํ์ ์ ์ฅ์์
๋๋ค.
์ ํ ์ค๋ฅ
"ํ ์คํธ๋ฅผ ํตํด ์ค๋ฅ๊ฐ ์์์ ๋ณด์ฌ์ค ์๋ ์์ง๋ง ์ค๋ฅ๊ฐ ์์์ ๋ณด์ฌ์ค ์๋ ์์ต๋๋ค." ํ ์คํธ๋ฅผ ํ๊ณ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์์๋ ๋ถ๊ตฌํ๊ณ ๊ตํํ ๋ฒ๊ทธ๊ฐ ํ๋ก๋์ ์ ์นจํฌํ์ต๋๋ค.
์ด์ ๊ฐ์ ์๋๋ฆฌ์ค์์๋ ๋ค์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ํ๋ก๋์ ์ ๋ฐฐํฌ๋๋ ํญ๋ชฉ
- ์ค๋ ๋์ ์ฝ๋
master
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ์์ ์ ์์ํ ์ ์์ต๋๋ค.
๋ค์ ๋ฒ์ ์์ ๋กค๋ฐฑํด์ผ ํ ๊น์, ์๋๋ฉด ์์ ํด์ผ ํ ๊น์?
๋กค๋ฐฑ์ ์๋ ค์ง ์ํธํ ์ด์ ๋ฒ์ ์ ํ๋ก๋์
์ ๋ฐฐํฌํ๊ณ ์ค๋ฅ๊ฐ ํฌํจ๋ ์ปค๋ฐ์ ๋๋๋ฆฌ๋ ํ๋ก์ธ์ค์
๋๋ค. "์์ผ๋ก ์์ "์ ๋ค์์ ์์ ์ฌํญ์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. master
๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ ๋ฒ์ ์ ๋ฐฐํฌํ์ธ์. API์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ์ฝ๋๊ฐ ํ๋ก๋์
์ ๋ฐฐํฌ๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ณ ์ง์์ ์ธ ์ ๋ฌ๊ณผ ์ฐ์ํ ํ
์คํธ ์ ์ฉ ๋ฒ์๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋กค๋ฐฑ์ ๋ค์ ๋ฒ์ ์์ ์์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ด๋ ต๊ณ ์ํํฉ๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋กค๋ฐฑ์ ์ํ์ ์๋ฐํ์ง ์์ผ๋ฏ๋ก ์ด ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๊ฒ ์ต๋๋ค.
- ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ ํ์ ์ค๋ฅ๋ฅผ ์์ ํ์ญ์์ค.
- ์ฝ๋๋ฅผ ์์ฑํ๋ค
master
์๋ก์ด ์ผ์ ์์ํ๋ ๋ฐ ์ฆ์ ์ ํฉํฉ๋๋ค.
๏ธ๊ณผ์
- ์ง์ ์ผ๋ก ์ ํ
master
์ฅ์ ์์์ - ์๊ฒฉ ์ ์ฅ์์์ ๋ก์ปฌ ์ ์ฅ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- PR ๋ณํฉ ์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ ๋จ๊ณ ๊ฒํ ะฒ
master
. - ์๊ฒฉ ์ ์ฅ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ํฉ๋๋ค.
๋ณํฉ ์ปค๋ฐ์ ๋๋๋ฆฐ ์ ์ฅ์์ ๊ธฐ๋ก์
๋๋ค.
ํ
# ะะตัะตะบะปััะธัะตัั ะฝะฐ ะฒะตัะบั master.
git checkout master
# ะะฑะฝะพะฒะธัะต ะปะพะบะฐะปัะฝัะน ัะตะฟะพะทะธัะพัะธะน ะธะท ัะดะฐะปัะฝะฝะพะณะพ ัะตะฟะพะทะธัะพัะธั.
git pull
# ะัะผะตะฝะธัะต ะบะพะผะผะธั ัะปะธัะฝะธั PR Steps review ะฒ master.
# ะั ะพัะผะตะฝัะตะผ ะบะพะผะผะธั ัะปะธัะฝะธั, ะฟะพััะพะผั ะฝะฐะผ ะฝัะถะฝะพ ะฒัะฑัะฐัั ะฒะตัะบั ะธััะพัะธะธ, ะบะพัะพััั ะผั ะทะฐั
ะพัะธะผ ะพััะฐะฒะธัั
git show HEAD
# ะฟัะตะดะฟะพะปะพะถะธะผ, ััะพ ะบะพะผะผะธั, ะบะพัะพััะน ะฑัะป ะฟะพัะปะตะดะฝะธะผ ะฒ ะฒะตัะบะต master ะดะพ ัะปะธัะฝะธั, ะฑัะป ะพัะพะฑัะฐะถัะฝ ะฟัะตะดัะดััะตะน ะบะพะผะฐะฝะดะพะน ะฟะตัะฒัะผ
git revert HEAD -m 1
# ะผะพะถะตัะต ะฝะต ะผะตะฝััั ัะพะพะฑัะตะฝะธั ะบะพะผะผะธัะพะฒ
# ะะฟัะฑะปะธะบัะนัะต ะธะทะผะตะฝะตะฝะธั ะฒ ัะดะฐะปัะฝะฝัะน ัะตะฟะพะทะธัะพัะธะน
git push
๏ธ ์๊ฐ ํ ์คํธ
ํ์ธ ci.md
๋ณํฉ ์ปค๋ฐ์ ๋๋๋ฆฐ ํ ๋ ์ด์ "sneaky bug"๋ผ๋ ํ
์คํธ๊ฐ ํฌํจ๋์ง ์์ต๋๋ค.
CI ๋จ๊ณ ๋ชฉ๋ก์ ์์ ํ์ฌ ๋ง์คํฐ๋ก ๋ฐํ
์ฐ๋ฆฌ๋ ๋ธ๋์น์ ๋ณํฉ ์ปค๋ฐ์ ์์ ํ ๋๋๋ ธ์ต๋๋ค. feature
. ์ข์ ์์์ ์ด์ ์ค๋ฅ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. master
. ๋์ ์์์ ์ฐ๋ฆฌ์ ์์คํ ์ง์์ ํตํฉ ๋จ๊ณ ๋ชฉ๋ก๋ ์ฌ๋ผ์ก๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด์์ ์ผ๋ก๋ ๋ค์์ ์ปค๋ฐ์ ์์ ์ฌํญ์ ์ ์ฉํด์ผ ํฉ๋๋ค. feature
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋๋ ค ๋ณด๋ด์ญ์์ค master
์์ ๊ณผ ํจ๊ป.
์ฐ๋ฆฌ๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ์ ๊ทผํ ์ ์์ต๋๋ค:
- ๋ณํฉ์ ์ทจ์ํ๋ ์ปค๋ฐ์ ๋๋๋ฆฌ๊ธฐ
feature
ัmaster
; - ์ด์ ์์ ์ปค๋ฐ์ ์ด๋ํฉ๋๋ค.
feature
.
์ด ๊ฒฝ์ฐ ๊ฐ๋ฐ ํ๋ง๋ค ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ง ์ ์ฉํ ์ปค๋ฐ์ ๋ณ๋์ ๋ธ๋์น๋ก ์ด๋ํ๊ณ ์ด ์ ๋ธ๋์น์ ๋ํ ๋ณ๋์ ํ ์์ฒญ์ ์์ฑํฉ๋๋ค.
๏ธ๊ณผ์
- ๋ผ๋ ์ค๋ ๋๋ฅผ ๋ง๋ญ๋๋ค.
feature-fix
๊ทธ๊ฒ์ผ๋ก ์ ํํ์ญ์์ค. -
์ด์ ๋ถ๊ธฐ์์ ๋ชจ๋ ์ปค๋ฐ ๋ง์ด๊ทธ๋ ์ด์
feature
์๋ก์ด ์ค๋ ๋๋ก. ๋ง์ด๊ทธ๋ ์ด์ ์ค์ ๋ฐ์ํ ๋ณํฉ ์ถฉ๋์ ํด๊ฒฐํฉ๋๋ค. -
ํ๊ท ํ ์คํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
ci.test.js
:it('does not contain the sneaky bug', () => { expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false); });
- ๋ก์ปฌ์์ ํ ์คํธ๋ฅผ ์คํํ์ฌ ์คํจํ์ง ์๋์ง ํ์ธํ์ธ์.
- "๋น๋ฐํ ๋ฒ๊ทธ ํฌํจ"์ด๋ผ๋ ํ
์คํธ๋ฅผ ์ ๊ฑฐํ์ธ์.
ci.md
. - ํ ์คํธ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๋จ๊ณ ๋ชฉ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ธ๋ฑ์ค์ ์ถ๊ฐํ๊ณ ์ปค๋ฐํฉ๋๋ค.
- ์๊ฒฉ ์ ์ฅ์์ ๋ถ๊ธฐ๋ฅผ ๊ฒ์ํฉ๋๋ค.
๋ค์๊ณผ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์
๋๋ค.
ํ
# ะกะพะทะดะฐะนัะต ะฒะตัะบั ะฟะพะด ะฝะฐะทะฒะฐะฝะธะตะผ feature-fix ะธ ะฟะตัะตะบะปััะธัะตัั ะฝะฐ ะฝะตะต.
git checkout -b feature-fix
# ะะตัะตะฝะตัะธัะต ะฒัะต ะบะพะผะผะธัั ะธะท ะฑัะฒัะตะน ะฒะตัะบะธ feature ะฒ ะฝะพะฒัั ะฒะตัะบั. ะ ะฐะทัะตัะธัะต ะบะพะฝัะปะธะบัั ัะปะธัะฝะธั, ะบะพัะพััะต ะฒะพะทะฝะธะบะปะธ ะฟัะธ ะฟะตัะตะฝะพัะต.
# ะธัะฟะพะปัะทัะนัะต ะธััะพัะธั ััะพะฑั ัะทะฝะฐัั ั
ััะธ ะบะพะผะผะธัะพะฒ:
# - ะฟัะตะดัะตััะฒัััะตะณะพ ะบะพะผะผะธัั ั ะฟะตัะฒะพะน ัะฐัััั ัะฟะธัะบะฐ: C0
# - ะดะพะฑะฐะฒะปัััะตะณะพ ะฟะพัะปะตะดะฝะธะต ัะปะตะผะตะฝัั ัะฟะธัะบะฐ: C2
git log --oneline --graph
git cherry-pick C0..C2
# ัะฐะทัะตัะธัะต ะบะพะฝัะปะธะบัั ัะปะธัะฝะธั
# - ะพััะตะดะฐะบัะธััะนัะต ci.md ะธ/ะธะปะธ ci.test.js
# - ะดะพะฑะฐะฒััะต ัะฐะนะปั ะฒ ะธะฝะดะตะบั
# - ะฒัะฟะพะปะฝะธัะต "git cherry-pick --continue", ะผะพะถะตัะต ะฝะต ะผะตะฝััั ัะพะพะฑัะตะฝะธะต ะบะพะผะผะธัะฐ
# ะะพะฑะฐะฒััะต ัะตะณัะตััะธะพะฝะฝัะน ัะตัั ะฒ ci.test.js
# ะะฐะฟัััะธัะต ัะตััั ะปะพะบะฐะปัะฝะพ, ััะพะฑั ัะฑะตะดะธัััั, ััะพ ะพะฝะธ ะฝะต ะทะฐะฒะตััะฐัััั ััะฟะตัะฝะพ.
# ะฃะดะฐะปะธัะต ัะตะบัั " with a sneaky bug" ะฒ ci.md.
# ะะพะฑะฐะฒััะต ะฒ ะธะฝะดะตะบั ะธะทะผะตะฝะตะฝะธั ัะตััะพะฒ ะธ ะฒ ัะฟะธัะบะต ัะฐะณะพะฒ ะธ ะทะฐะบะพะผะผะธัััะต ะธั
.
git add ci.md ci.test.js
git commit -m "Fix the bug in steps list"
# ะะฟัะฑะปะธะบัะนัะต ะฒะตัะบั ะฒ ัะดะฐะปัะฝะฝัะน ัะตะฟะพะทะธัะพัะธะน.
git push --set-upstream origin feature-fix
ํ ์์ฒญ์ ์์ฑํฉ๋๋ค.
์ ๋ชฉ์ด ํฌํจ๋ ํ ์์ฒญ ๋ง๋ค๊ธฐ ๊ธฐ๋ฅ ์์ ... ์ค์น feature-fix
"๋ณธ์ "๊ณผ ๊ฐ์ master
"๊ธฐ๋ณธ ์ง์ "๊ณผ ๊ฐ์ต๋๋ค.
ํ
์คํธ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค ์ฃผ์ญ์์ค. PR ํ ๋ก ํ๋จ์์ ํ
์คํธ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ค์นํ๋์ง ํ์ธํ์ธ์.
master
๊ทธ์ ์ ์ฅ์๋ฅผ ํฌํฌํ๋ค "๊ธฐ๋ณธ ๋ถ๊ธฐ"๋ก์ ์ ๋ ๊ฐ์ ์๋ฃ ์ ์ฅ์ ๋ณ๊ฒฝ ์์ฒญ์ ์๋ตํ์ง ์์ต๋๋ค.
ํ ์์ฒญ ์น์ธ "๊ธฐ๋ฅ ์์ ์ค"
์์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ๋ณ๊ฒฝ์ฌํญ์ ์น์ธํด ์ฃผ์ธ์. master
ํ ์์ฒญ์์.
๏ธ๊ณผ์
- "ํ ์์ฒญ ๋ณํฉ"์ ํด๋ฆญํ์ธ์.
- "๋ณํฉ ํ์ธ"์ ํด๋ฆญํ์ธ์.
- ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก "๋ธ๋์น ์ญ์ "๋ฅผ ํด๋ฆญํ์ธ์.
์ด๊ฒ์ด ๋ฐ๋ก ์ง๊ธ ๋น์ ์ด ๊ฐ์ ธ์ผ ํ ๊ฒ์
๋๋ค.
์ถํํด!
์ง์์ ํตํฉ ์ค์ ์ฌ๋๋ค์ด ์ผ๋ฐ์ ์ผ๋ก ์ํํ๋ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ฃํ์ต๋๋ค.
๊ฐ์ข์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ๋ค์์์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์ด ์ฃผ์ธ์.
์ถ์ฒ : habr.com