์์ฝ
SUMMARY
Deck์ Go๋ก ๋ง๋ค๋ฉฐ CLI ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๊ณต๋ถํ๋ค๊ฐ spf13/cobra๋ฅผ ์ ํ๋ค. ์๋ธ์ปค๋งจ๋ ํธ๋ฆฌยทํ๋๊ทธ ํ์ฑยท
--helpยท์๋์์ฑ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์ ๊ณต๋๋ค๋ ๊ฒ์ ํ์ธํ ๋ค์์ผ, ์์ ์ ์์ ์์คํฌ๋ฆฝํธ๋ก CLI๋ฅผ ๋ง๋ค ๋ helpยท๋ฐ์ํ ์ฒ๋ฆฌยท๋ก๊ทธ ํฌ๋งท์ ์ง์ ์์ฑํ๋๋ผ ๊ณ ์ํ์ผ๋ฉด์๋ ์คํ์์ค CLI๋งํผ ์์ฑ๋๊ฐ ๋์ค์ง ์์๋ ์ด์ ๊ฐ ๋ฉ๋๋์๋ค.kubectlยทhelmยทkubeadm์ด ์ฌ์ฉํ๋ ๋ฐ๋ก ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์์คํฌ๋ฆฝํธ๋ก CLI๋ฅผ ํ๋ด ๋ด๋ ์์ ์๋ ์์ฑ๋๊ฐ ๋ ์์ฌ์ ๋๋ฐ, ๋์๋ณด๋ฉด ๊ทธ๊ฒ์ด ์จ์ ํ ๋ด ์ค๋ ฅ ํ๋ง์ ์๋์๋ค.
1. ์์คํฌ๋ฆฝํธ๋ก CLI ๋ง๋ค ๋ ์๊ฐ์ ์๋ ๊ฒ๋ค
๊ทธ๋์ ์์ํ ์ด์ ๋๊ตฌ๋ ์์คํฌ๋ฆฝํธ๋ก CLI ํํ๋ฅผ ๋ง๋ค์ด ์๋ค. case "$1" in ... ๊ตฌ๋ฌธ์ผ๋ก ์๋ธ์ปค๋งจ๋๋ฅผ ๋๋๊ณ , ๋๋ฆ ์์ฑ๋ ์๊ฒ ๋ง๋ค๋ ค๊ณ ์ ๋ฅผ ์ผ๋ค. ํ์ง๋ง CLI๋ต๊ฒ ๋ง๋ค๋ ค๋ ๋
ธ๋ ฅ์ ์๋น ๋ถ๋ถ์ด ์ ์ ๋ณธ์ง๊ณผ ๋ฌด๊ดํ ๊ณณ์ ๋ค์ด๊ฐ๋ค.
- help.
--help์ถ๋ ฅ์ ์ํด ์ฌ์ฉ๋ฒ์echo๋ก ์ง์ ์ฐ์๋ค. ๋ช ๋ น์ ์์ ํ ๋๋ง๋ค ๊ทธecho๋ ํจ๊ป ์์ ํด์ผ ํ๊ณ , ์์ ํ์ง ์์ผ๋ฉด ๋ฌธ์์ ์ค์ ๋์์ด ์ด๊ธ๋ฌ๋ค. - ๋ฐ์ํ(interactive). ๊ฐ์ ๋ฌผ์ด๋ณด๊ณ ํ์ธ๋ฐ๋ ํ๋กฌํํธ์ ์๋ชป๋ ์
๋ ฅ ์ฌํ์ธ ๊ฐ์ ๊ธฐ๋ฅ์
read์while๋ก ์ง์ ์์ฑํ๋ค. ์ํฐ ์ ๋ ฅ๊ณผ ๊ธฐ๋ณธ๊ฐ, ์ทจ์ ์ฒ๋ฆฌ๋ฅผ ๋งค๋ฒ ์๋ก ๋ง๋ค์๋ค. - ๋ก๊ทธ ํฌ๋งท. ๋ ๋ฒจ(info/warn/error)์ ๋ฐ๋ผ ์์ ์
ํ๊ณ ์ ๋์ฌ๋ฅผ ๋ถ์ด๋ ๊ธฐ๋ฅ์
printf์ ANSI ์ฝ๋๋ก ์ง์ ๊ตฌํํ๋ค. ๋๊ตฌ๋ง๋ค ํฌ๋งท์ด ๋ฏธ๋ฌํ๊ฒ ๋ฌ๋ผ์ก๋ค. - ํ๋๊ทธ ํ์ฑ.
--root,--dry-run์ต์ ํ๋๋ฅผ ๋ฐ์ผ๋ ค๊ณwhile [[ $#--gt-0-| -gt 0 ]]; do case ...๊ตฌ๋ฌธ์ ๋ช ๋ น๋ง๋ค ๋ณต์ฌํด์ ๋ถ์๋ค. ์ถ์ฝํ(-n) ์ง์์ด๋ ์ธ์ ์์ ๋ฌด๊ด ์ฒ๋ฆฌ๋ ์๋์ผ๋ก ๋์ง ์์๋ค. - ์๋ธ์ปค๋งจ๋ ํธ๋ฆฌ. 2๋จ๊ณ(
tool sub action)๋ง ๋ผ๋case์์case๋ฅผ ์ค์ฒฉํด์ผ ํ๋ค.
๊ฐ ํญ๋ชฉ์ ๊ฐ๋ณ์ ์ผ๋ก ํด๋ผ ์ ์๋ ์์
์ด๋ค. ๋ฌธ์ ๋ ์ด ๋ชจ๋ ๊ฒ์ ๋๊ตฌ๋ง๋ค, ๊ทธ๋ฆฌ๊ณ ๋ช
๋ น์ด ๋์ด๋ ๋๋ง๋ค ๊ณ์ ์์ผ๋ก ์ ์งํด์ผ ํ๋ค๋ ์ ์ด๋ค. ๊ทธ๋ ๊ฒ ๋ง์ ์๊ฐ์ ๋ค์๋๋ฐ๋ ์์ฑ๋๋ kubectl ๊ฐ์ ์คํ์์ค CLI ๊ทผ์ฒ์๋ ๋ฏธ์น์ง ๋ชปํ๋ค. ๊ทธ๋๋ โ๋ด๊ฐ ๋ถ์กฑํด์โ๋ผ๊ณ ๋ง ์๊ฐํ๋ค.
2. Cobra๋ฅผ ๋ณด๊ณ ์ด์ ๋ฅผ ์์๋ค
Deck์ Go๋ก ์์ฑํ๋ฉฐ Cobra๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋, ์์ ์์ผ๋ก ๋ง๋ค๋ ๊ธฐ๋ฅ๋ค์ด ์ ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ์ผ๋ก ํฌํจ๋์ด ์์๋ค. ๋ด๊ฐ ๋ถ์กฑํ๋ ๊ฒ์ด ์๋๋ผ, ์์คํฌ๋ฆฝํธ์๋ ๊ทธ ์ญํ ์ ๋์ ํด ์ค ๊ณ์ธต์ด ์์์ ๋ฟ์ด์๋ค.
- ์๋ธ์ปค๋งจ๋ ํธ๋ฆฌ โ ๋ช
๋ น ํ๋๊ฐ
*cobra.Command๊ตฌ์กฐ์ฒด์ด๊ณ ,AddCommand๋ก ๋ถ๋ชจ์ ๋ถ์ด๋ฉดdeck bundle verify๊ฐ์ ๊ฒฝ๋ก๊ฐ ์ ์ ๋ก ์๊ธด๋ค. - ํ๋๊ทธ ํ์ฑ โ
cmd.Flags().Bool("dry-run", false, "...")ํ ์ค. ์ถ์ฝยท์์ ๋ฌด๊ดยทํ์ ๊ฒ์ฆ๊น์ง pflag๊ฐ ์ฒ๋ฆฌํ๋ค. --help/Usageโ ๋ช ๋ น์Short/Longํ๋์ ์ค๋ช ์ ์ ์ผ๋ฉด help ์ถ๋ ฅ์ด ์๋ ์์ฑ๋๋ค. ์ค๋ช ์ด ์ฝ๋ ์์ ์์ผ๋ฏ๋ก ์ด๊ธ๋ ์ผ์ด ์๋ค.- ์ ธ ์๋์์ฑ โ ๋ช ๋ น ํธ๋ฆฌ์์ bash/zsh/fish/powershell ์คํฌ๋ฆฝํธ๋ฅผ ์๋ ์์ฑํ๋ค.
๋ด๊ฐ ์์ฑํด์ผ ํ๋ ๊ฒ์ โ์ด ๋ช
๋ น์ด ์ด๋ค ์ผ์ ํ๋๊ฐโ์ ํด๋นํ๋ (RunE ํจ์)๋ฟ์ด๊ณ , CLI๋ก์์ ํ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฑ์ ์ค๋ค. ์์คํฌ๋ฆฝํธ ์์ ์ค์ ๋ก ๋ฌด๊ฑฐ์ ๋ ๋ถ๋ถ์ด ์ด ํ์ ์ ์ง์๋ค๋ ๊ฒ์ Go๋ก ์ฎ๊ธฐ๊ณ ๋์์ผ ์์๋ค. (๋ฐ์ํ ํ๋กฌํํธ๋ ์ปฌ๋ฌ ๋ก๊ทธ๋ Go ์ํ๊ณ์๋ surveyยทfatih/color ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ด์, ์๋ก ์ง์ ๋ง๋ค๋ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ ์กฐ๋ฆฝ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.)
3. K8s ์ง์๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ์
Cobra๋ฅผ ๋ง์ ํธํ ์ ํํ๋ ๋ฐ๋ ์ด์ ๊ฐ ํ๋ ๋ ์์๋ค. ๋ด๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ๋๊ตฌ๋ค์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค์ด์ก๋ค๋ ์ ์ด๋ค. kubectl, helm, kubeadm์ด ๋ชจ๋ spf13/cobra ๊ธฐ๋ฐ์ด๋ฉฐ, ๊ทธ ์ธ์๋ dockerยทghยทhugo๊ฐ ๊ฐ์ ๊ณ์ด์ด๋ค. (Kubernetes ์ง์์ด ์๋ ๋๋ฆฌ ์ฌ์ฉํด์ Go CLI์ ์ฌ์ค์ ํ์ค์ฒ๋ผ ์๋ฆฌ ์ก์๋ค.)
๋๋ถ์ ๋ด ๋๊ตฌ์ ์ฌ์ฉ๊ฐ์ด ๊ทธ ๋๊ตฌ๋ค๊ณผ ๊ฒฐ์ ๋ง์ถ๊ฒ ๋๋ค. kubectl <cmd> --help, kubectl completion zsh๊ฐ ๋์ํ๋ฏ deck <cmd> --help, deck completion zsh๋ ๋๊ฐ์ด ๋์ํ๋ค. ์ฌ์ฉ์๊ฐ ์๋ก ์ตํ ๊ฒ์ด ์๊ณ , ๋ ์ญ์ โkubectl์ ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์ง?โ๋ผ๊ณ ์ฐธ๊ณ ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค. ์์ ์์คํฌ๋ฆฝํธ๋ก๋ ์ด๋ฐ ์ผ๊ด์ฑ ํ๋ณด ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
4. ๋ช ๋ น ํธ๋ฆฌ๋ฅผ ์ฝ๋๋ก ์ธ์ฐ๊ธฐ
Deck์ ๋ช ๋ น ํธ๋ฆฌ๋ ๋๋ต ๋ค์์ฒ๋ผ ๊ตฌ์ฑํ๋ค. ๋ฃจํธ ์๋์ ๋์ฌ ํํ์ ๋ช ๋ น(apply/bundle/state/โฆ)์ ๋ฐฐ์นํ๊ณ , ํ์ํ ๊ฒ๋ง 2๋จ๊ณ๋ก ๋ ๋๋์๋ค.
deck
โโโ apply # ์ํฌํ๋ก์ฐ(apply ํ์ผ)๋ฅผ ๋ฒ๋ค์ ๋ํด ์คํ
โโโ plan # ์คํ ์ ๊ณํ์ ๋ณด์ฌ์ค (vars ํ์: ์ ํจ ๋ณ์ยท์ปจํ
์คํธ ํ์ธ)
โโโ bundle
โ โโโ verify # ๋ฒ๋ค ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ
โ โโโ build # ๋ฒ๋ค ์์ฑ
โโโ state
โ โโโ show # ์ ์ฅ๋ apply ์ํ ์กฐํ
โ โโโ list # ์ํ ํ์ผ ๋ชฉ๋ก
โ โโโ clear # ์ํ ์ญ์
โโโ cache # ์บ์ ๊ด๋ฆฌ
โโโ serve # ๋ฐ๋ชฌ/์๋ฒ ๋ชจ๋
โโโ ask # AI ๋ณด์กฐ (login/logout/status ํ์)
โโโ completion # ์
ธ ์๋์์ฑ ์คํฌ๋ฆฝํธ ์์ฑ
โโโ version์ฝ๋๋ก๋ ๋ถ๋ชจ ๋ช ๋ น์ ๋ง๋ค๊ณ ์์์ ๋ถ์ด๋ ๊ฒ ์ ๋ถ๋ค.
// state ๋ ๊ทธ ์์ฒด๋ก ์คํํ๋ ๊ฒ ์๋๋ผ ํ์ ๋ช
๋ น์ ๊ทธ๋ฃน์ด๋ค.
stateCmd := &cobra.Command{
Use: "state",
Short: "Inspect and clear saved apply state",
}
stateCmd.AddCommand(
newStateShowCmd(), // deck state show
newStateListCmd(), // deck state list
newStateClearCmd(), // deck state clear
)
rootCmd.AddCommand(stateCmd)case ์ค์ฒฉ์ด ์ฌ๋ผ์ง๊ณ ๋ช
๋ น ํ๋๊ฐ ํ์ผ ํ๋์ ๋์๋๋ค. ์ ๋ช
๋ น ์ถ๊ฐ๊ฐ โํจ์ ํ๋๋ฅผ ์์ฑํ๊ณ AddCommand ํ ์ค์ ์ถ๊ฐํ๊ธฐโ๊ฐ ๋์์ผ๋ ๋๊ตฌ๋ฅผ ํค์ฐ๋ ๋ถ๋ด์ด ํฌ๊ฒ ์ค์๋ค. ์์คํฌ๋ฆฝํธ ์์ case ๊ตฌ์กฐ๊ฐ ๋ถ๋ด์ค๋ฌ์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฒ๊ณผ ์ ๋ฐ๋์ ๊ฒฝํ์ด๋ค.
5. helpยท์๋์์ฑยท๋ฌธ์๋ฅผ ๊ณต์ง๋ก ์ป๊ธฐ
Cobra๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฐ์ฅ ์ด๋์ ๋ณธ ๋ถ๋ถ์ ๋ถ์์ ์ผ๋ก ํจ๊ป ์ป๊ฒ ๋ ๊ธฐ๋ฅ๋ค์ด์๋ค.
์๋์์ฑ. deck completion <bash|zsh|fish|powershell> ๋ช
๋ น์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์๋ค. ์ฌ์ฉ์๊ฐ ๊ทธ ์คํฌ๋ฆฝํธ๋ฅผ ์
ธ์ ๋ฑ๋กํ๋ฉด deck sta<Tab> โ state ์ฒ๋ผ ์๋์์ฑ์ด ๋์ํ๋ค. ๋ด๊ฐ completion ๋ก์ง์ ์์ฑํ ๊ฒ์ด ์๋๋ผ, ๋ช
๋ น์ ํธ๋ฆฌ๋ก ์ ์ํ๋๋ Cobra๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด ์ค ๊ฒ์ด๋ค.
๋ฌธ์ ์์ฑ. Cobra์๋ ๋ช ๋ น ํธ๋ฆฌ๋ฅผ ๋งํฌ๋ค์ด์ผ๋ก ์ถ๋ ฅํด ์ฃผ๋ ๊ธฐ๋ฅ(cobra/doc)์ด ์๋ค. Deck์๋ ์ด ๊ธฐ๋ฅ์ ๊ฐ์ผ ๋ด๋ถ ๋ช ๋ น์ ๋๊ณ , CLI ๋ ํผ๋ฐ์ค๋ฅผ ๋ช ๋ น ์ ์์์ ์๋ ์์ฑํ๋ค. ๋ช ๋ น์ ์์ ํ๋ฉด ๋ฌธ์๋ฅผ ๋ค์ ์์ฑํ๋ฉด ๋๋ฏ๋ก โ์ฝ๋๋ ๋ฐ๋์๋๋ฐ ๋ฌธ์๋ ์๋ ๊ทธ๋๋กโ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. (์ด ์๋ ์์ฑ ๋ฌธ์๋ฅผ ๋ฌธ์ ์ฌ์ดํธ์ ๊ทธ๋๋ก ํ์ฉํ๋ค.)
์์คํฌ๋ฆฝํธ CLI๊ฐ ์คํ์์ค ์์ค์ ์์ฑ๋์ ๋ฏธ์น์ง ๋ชปํ๋ ๊ฒ์ ์ค๋ ฅ ํ์ด๋ผ๊ธฐ๋ณด๋ค, ๋ช ๋ น ํธ๋ฆฌยทํ๋๊ทธ ํ์ฑยทhelpยท์๋์์ฑยท๋ก๊ทธยท๋ ํผ๋ฐ์ค ๋ฌธ์๋ผ๋ ํ์์ ๋งจ์์ผ๋ก ์ ๋ถ ๊ฐ๋นํด์ผ ํ๋ ํ์ด ์ปธ๋ค. Cobra๋ก ์ฎ๊ธด ๋ค์๋ ๋ด๊ฐ ๊ด๋ฆฌํ๋ ๋ฒ์๊ฐ โ๊ฐ ๋ช ๋ น์ด ํ๋ ์ผโ๋ก ์ขํ์ก๋ค.