๐ ์์ฝ
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๋ก ์ฎ๊ธฐ๊ณ ๋์ ๋ด๊ฐ ๊ด๋ฆฌํ๋ ๊ฒ โ๊ฐ ๋ช ๋ น์ด ํ๋ ์ผโ๋ก ์ขํ์ก๋ค.