рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдирдорд╕реНрддреЗ! рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдХрдИ рд╢рд╛рдирджрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВрдиреЗ GitLab рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ, рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЧрд╣рди рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдпрд╣ рдХрд╛рд░реНрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ Kubernetes.io, рдЬреЛ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ, рдФрд░ рднреЗрдЬреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдкреВрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд░реЛрдмреЛрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдЯ рдХрд╛ рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ рдФрд░ рдореБрдлреНрдд рдЯреВрд▓ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рдерд╛ред рдЖрдЬ рдореИрдВ рдЕрдВрддрддрдГ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрддрд╛рдКрдВрдЧрд╛ред

рд▓реЗрдЦ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреВрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА:
рд╣реНрдпреВрдЧреЛ, рдХреНрдпреВрдмреЗрдХ, рдХрдирд┐рдХреЛ, git-рдХреНрд░рд┐рдкреНрдЯ ╨╕ рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде.

рдЕрдВрддрд░реНрд╡рд╕реНрддреБ

  1. рд╣реНрдпреВрдЧреЛ рд╕реЗ рдорд┐рд▓реЗрдВ
  2. рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛
  3. рдХрдирд┐рдХреЛ рдХреЛ рдЬрд╛рдирдирд╛
  4. рдХреНрдпреВрдмреЗрдХ рдХреЛ рдЬрд╛рдирдирд╛
  5. Kubernetes-рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде Gitlab-рдзрд╛рд╡рдХ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
  6. рдХреНрдпреВрдмреЗрдХ рдХреЗ рд╕рд╛рде рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рддреИрдирд╛рдд рдХрд░рдирд╛
  7. рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдЪрдп
  8. рдЯреВрд▓рдмреЙрдХреНрд╕ рдЫрд╡рд┐ рдмрдирд╛рдирд╛
  9. рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди
  10. рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрд╡рдЪрд╛рд▓рди
  11. рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрдмрд╛рд╡ рдбрд╛рд▓рддреЗ рд╕рдордп рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рдФрд░ рд╕рдВрдпреЛрдЬрди
  12. рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг
  13. рдРрдкреНрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ

1. рд╣реНрдпреВрдЧреЛ рдХреЛ рдЬрд╛рдирдирд╛

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╣реНрдпреВрдЧреЛ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреНрд░рдХрд╛рд╢рди рд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╣реНрдпреВрдЧреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдЬрдирд░реЗрдЯрд░ рд╣реИред

рдЬреЛ рд▓реЛрдЧ рд╕реНрдереИрддрд┐рдХ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрддрд╛рдКрдВрдЧрд╛ред рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдХреБрдЫ PHP рд╡рд╛рд▓реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рддреБрд░рдВрдд рдкреЗрдЬ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдереИрддрд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдФрд░ рдереАрдо рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╛рдиреА, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ HTML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рд╕реНрддреЗ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рд╣реНрдпреВрдЧреЛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдХ рдирдИ рд╕рд╛рдЗрдЯ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛:

hugo new site docs.example.org

рдФрд░ рдЙрд╕реА рд╕рдордп git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА:

cd docs.example.org
git init

рдЕрдм рддрдХ, рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдкреНрд░рд╛рдЪреАрди рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдереАрдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдПрдХ рдереАрдо рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред

рдереАрдо рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рд╕реАрдЦрдирд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЙрдкрдпреБрдХреНрдд рд╣реИред

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдереАрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЧрд┐рдЯ рд╕рдмрдореЙрдбреНрдпреВрд▓:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

рдЗрд╕ рддрд░рд╣, рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреЗрд╡рд▓ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА, рдФрд░ рдХрдиреЗрдХреНрдЯреЗрдб рдереАрдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реЗрдЧреА, рдпрд╛рдиреА, рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдореВрд▓ рд╕реНрд░реЛрдд рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдбрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛.

рдЖрдЗрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдареАрдХ рдХрд░реЗрдВ config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЖрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

hugo server

рдФрд░ рдкрддреЗ рдкрд░ http://localhost:1313/ рд╣рдорд╛рд░реА рдирд╡ рдирд┐рд░реНрдорд┐рдд рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреБрд▓реЗ рдкреГрд╖реНрда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ!

рдЖрдЗрдП рдПрдХ рдХрд╡рд░ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рд╕рд╛рдордЧреНрд░реА/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

рдирд╡ рдирд┐рд░реНрдорд┐рдд рдкреГрд╖реНрда рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдПрдХ рд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЪрд▓рд╛рдПрдБ:

hugo

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рд╛рдордЧреНрд░реА рдЬрдирддрд╛/ рдФрд░ рдЖрдкрдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрдЧреА.
рд╣рд╛рдБ, рд╡реИрд╕реЗ, рдЖрдЗрдП рдЗрд╕реЗ рддреБрд░рдВрдд рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ .рдЧрд░рд┐рдЧреНрдиреЛрд░:

echo /public > .gitignore

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .
git commit -m "New site created"

2. рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛

рдЕрдм рд╣рдорд╛рд░реЗ рднрдВрдбрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

.
тФЬтФАтФА deploy
тФВ   тФЬтФАтФА app1
тФВ   тФФтФАтФА app2
тФФтФАтФА dockerfiles
    тФЬтФАтФА image1
    тФФтФАтФА image2

  • dockerfiles/ - рдЗрд╕рдореЗрдВ Dockerfiles рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рдФрд░ рд╣рдорд╛рд░реА Docker рдЫрд╡рд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
  • рддреИрдирд╛рдд рдХрд░рдирд╛/ - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрде рдкрд░ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ dockerfiles/рд╡реЗрдмрд╕рд╛рдЗрдЯ/Dockerfile

FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src

FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Dockerfile рдореЗрдВ рджреЛ рд╣реИрдВ рд╕реЗ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рдбреЙрдХрд░ рдЫрд╡рд┐ рд╕реЗ рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЕрдБрдзреЗрд░рд╛httpd (рд╣рд▓реНрдХреЗ HTTP рд╕рд░реНрд╡рд░) рдФрд░ рдЬрдирддрд╛/ - рд╣рдорд╛рд░реА рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реАред

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. рдХрдирд┐рдХреЛ рдХреЛ рдЬрд╛рдирдирд╛

рдбреЙрдХрд░ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрдирд┐рдХреЛ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдбреЗрдореЙрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╕реНрд╡рдпрдВ рдХрд┐рд╕реА рднреА рдорд╢реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреИрд╢ рдХреЛ рд╕реАрдзреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░реНрдг-рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЪрд▓рд╛рдПрдВ рдХрдирд┐рдХреЛ рдирд┐рд╖реНрдкрд╛рджрдХ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдмрд┐рд▓реНрдб рд╕рдВрджрд░реНрдн рдкрд╛рд╕ рдХрд░реЗрдВ; рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдбреЙрдХрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

рдЬрд╣рд╛рдБ рд░рдЬрд┐рд╕реНрдЯреНрд░реА.gitlab.com/kvaps/docs.example.org/website - рдЖрдкрдХреА рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо; рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреНрд░рд╛рдЪрд▓ --рдХреИрд╢ рдЖрдкрдХреЛ рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрд░рддреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА.gitlab.com/kvaps/docs.example.org/website/cache, рд▓реЗрдХрд┐рди рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рдЕрдиреНрдп рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ --рдХреИрд╢-рд░реЗрдкреЛ.

рдбреЙрдХрд░-рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

4. рдХреНрдпреВрдмреЗрдХ рдХреЛ рдЬрд╛рдирдирд╛

рдХреНрдпреВрдмреЗрдХ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХрд╛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Jsonnet рдХреЛ рдореБрдЦреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЧрд┐рдЯ рдореЗрдВ рдЙрдирдХрд╛ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХреНрдпреВрдмреЗрдХ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреА рддрд░рд╣ рд╣реА рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЙрдирдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪрд╛рд░реНрдЯрдореНрдпреВрдЬрд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╛рдиреА, рдЖрдк рдЪрд╛рд░реНрдЯ рдХреЛ рд╕реАрдзреЗ git рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╣рдо рд╕рднреА рддреИрдирд╛рддреА рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рддреИрдирд╛рдд рдХрд░рдирд╛/:

mkdir deploy
cd deploy

рдЖрдЗрдП рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

qbec init website
cd website

рдЕрдм рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

.
тФЬтФАтФА components
тФЬтФАтФА environments
тФВ   тФЬтФАтФА base.libsonnet
тФВ   тФФтФАтФА default.libsonnet
тФЬтФАтФА params.libsonnet
тФФтФАтФА qbec.yaml

рдЖрдЗрдП рдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВ qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

рдпрд╣рд╛рдВ рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛.рд╡рд╛рддрд╛рд╡рд░рдг, qbec рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди kubeconfig рд╕реЗ рд╕рд░реНрд╡рд░ рдкрддрд╛, рд╕рд╛рде рд╣реА рдиреЗрдорд╕реНрдкреЗрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИред
рдЕрдм рдЬрдм рддреИрдирд╛рддреА рд╣реЛ рдЪреВрдХ рдкрд░реНрдпрд╛рд╡рд░рдг, рдХреНрдпреВрдмреЗрдХ рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдорд╕реНрдерд╛рди рдкрд░ рддреИрдирд╛рдд рдХрд░реЗрдЧрд╛, рдпрд╛рдиреА, рдЕрдм рдЖрдкрдХреЛ рддреИрдирд╛рддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднреЛрдВ рдФрд░ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХреЗ рд╕рднреА рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ qbec.yaml, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрд░рд╛рдореНрд╕.libsonnet, рдЬрд╣рд╛рдВ рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЖрдЧреЗ рд╣рдо рджреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рджреЗрдЦрддреЗ рд╣реИрдВ:

  • рдШрдЯрдХ / - рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ; рдЙрдиреНрд╣реЗрдВ jsonnet рдФрд░ рдирд┐рдпрдорд┐рдд yaml рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рд╡рд╛рддрд╛рд╡рд░рдг/ - рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд░ (рдкреИрд░рд╛рдореАрдЯрд░) рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ:

  • рд╡рд╛рддрд╛рд╡рд░рдг/рдмреЗрд╕.libsonnet - рдЗрд╕рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ
  • рд╡рд╛рддрд╛рд╡рд░рдг/default.libsonnet - рдЗрд╕рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЪреВрдХ

рдЪрд▓реЛ, рдЦреЛрд▓реЛ рд╡рд╛рддрд╛рд╡рд░рдг/рдмреЗрд╕.libsonnet рдФрд░ рд╡рд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

рдЖрдЗрдП рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдШрдЯрдХ рднреА рдмрдирд╛рдПрдВ рдШрдЯрдХ/рд╡реЗрдмрд╕рд╛рдЗрдЯ.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдордиреЗ рдПрдХ рд╕рд╛рде рддреАрди Kubernetes рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдпреЗ рд╣реИрдВ: рддреИрдирд╛рддреА, рд╕рд░реНрд╡рд┐рд╕ ╨╕ рдкреНрд░рд╡реЗрд╢. рд╣рдо рдЪрд╛рд╣реЗрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ jsonnet рдирд┐рдпрдорд┐рдд json рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдирд┐рдпрдорд┐рдд json рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрдз jsonnet рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ yaml2json рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп yaml рдХреЛ json рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛, рдпрджрд┐ рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдХреЛрдИ рдЪрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд yaml рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ jsonnet рдореИрдВ рдЖрдкрдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдБ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vim рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╣реИ vim-jsonnet, рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ jsonnet рдПрдлрдПрдордЯреА рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ (jsonnet рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред

рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рд╣рдо рддреИрдирд╛рддреА рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛, рдЖрдЗрдП рджреМрдбрд╝реЗрдВ:

qbec show default

рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЖрдк рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП yaml рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗред

рдмрдврд╝рд┐рдпрд╛, рдЕрдм рдЖрд╡реЗрджрди рдХрд░реЗрдВ:

qbec apply default

рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреВрдмреЗрдХ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ y рдЖрдк рдЕрдкрдиреЗ рдЗрд░рд╛рджреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХреЗрдВрдЧреЗ.

рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдФрд░ рддреИрдирд╛рдд рд╣реИ!

рдпрджрд┐ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

qbec diff default

рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд░реНрддрдорд╛рди рддреИрдирд╛рддреА рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛

рд╣рд╛рд▓ рддрдХ рдореИрдВ рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛ gitlab-рдзрд╛рд╡рдХ рд╢реЗрд▓ рдпрд╛ рдбреЙрдХрд░-рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡-рддреИрдпрд╛рд░ рдорд╢реАрди (рдПрд▓рдПрдХреНрд╕рд╕реА рдХрдВрдЯреЗрдирд░) рдкрд░ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдРрд╕реЗ рдХрдИ рдзрд╛рд╡рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдереЗред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЫрд╡рд┐рдпрд╛рдВ рдПрдХрддреНрд░ рдХреАрдВред

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рджреЛрдиреЛрдВ рд╣реА рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╕рдмрд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд╡рдХреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдФрд░ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗ gitlab-рдзрд╛рд╡рдХ рд╕реАрдзреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВред

рдЧрд┐рдЯрд▓реИрдм рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЛ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдкрдВрдЬреАрдХрд░рдг рдЯреЛрдХрди рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рд░рдирд░ рдФрд░ рдЗрд╕реЗ рдкрддрд╡рд╛рд░ рдХреЛ рд╕реМрдВрдкреЗрдВ:

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

рдХрд╣рд╛рдБ:

  • https://gitlab.com - рдЖрдкрдХреЗ Gitlab рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ред
  • yga8y-jdCusVDn_t4Wxc - рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдЯреЛрдХрдиред
  • rbac.create=рд╕рддреНрдп - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдирд┐рд╖реНрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдб рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд╡рдХ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рдкрдВрдЬреАрдХреГрдд рдзрд╛рд╡рдХ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдзрд╛рд╡рдХреЛрдВ, рдЖрдкрдХреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВред

рдЬреЛрдбрд╝реЗ рдЧрдП рдзрд╛рд╡рдХ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдХреНрдпрд╛ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ? - рд╣рд╛рдБ, рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ! рдзрд╛рд╡рдХреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдм рдХреЛрдИ рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдЕрдм рд╕реЗ рдзрд╛рд╡рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдФрд░ рдирд╖реНрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

6. рдХреНрдпреВрдмреАрдИрд╕реА рдХреЗ рд╕рд╛рде рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рддреИрдирд╛рдд рдХрд░реЗрдВ

рдЪреВрдБрдХрд┐ рд╣рдордиреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ gitlab-рдзрд╛рд╡рдХ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЕрдм рд╣рдорд╛рд░реЗ Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗрдмрд╕рд╛рдЗрдЯ , рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдпрд╛рдБ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрд╣реБрдд рдмрд╛рд░, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд gitlab-рдзрд╛рд╡рдХ, рдЬрд┐рд╕реЗ рдкреНрд░рддрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

рдЗрд╕ рдмрд╛рд░ рд╣рдо рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдПрдХ рддреИрдпрд╛рд░ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рд▓реЗрдВрдЧреЗред рдХреНрдпреВрдмреЗрдХ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЛ рд╕реАрдзреЗ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдЖрдЗрдП рдЗрд╕реЗ git рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

рдЕрдм рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛/рдЬреАрдЯрд▓реИрдм-рдзрд╛рд╡рдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рд╡рд╛рд▓рд╛ рдПрдХ рднрдВрдбрд╛рд░ рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкреВрд░реНрдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪрд╛рд░реНрдЯ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ https://github.com/helm/charts

рдЖрдЗрдП рдШрдЯрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдШрдЯрдХ/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╡рд┐рд╕реНрддрд╛рд░рд╣реЗрд▓реНрдордЯреЗрдореНрдкрд▓реЗрдЯ рдлрд┐рд░, рд╣рдо рдЪрд╛рд░реНрдЯ рдХрд╛ рдкрде рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдкреИрд░рд╛рдореАрдЯрд░.рдорд╛рди, рдЬрд┐рд╕реЗ рд╣рдо рдкрд░реНрдпрд╛рд╡рд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╡рд╕реНрддреБ рдЖрддреА рд╣реИ

  • рдирд╛рдо рдЯреЗрдореНрдкрд▓реЗрдЯ - рд░рд┐рд▓реАрдЬрд╝ рд╢реАрд░реНрд╖рдХ
  • рдирд╛рдо рд╕реНрдерд╛рди - рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рд╣реЗрд▓реНрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛
  • рдпрд╣ рдлрд╝рд╛рдЗрд▓ - рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
  • рд╡рд╛рдЪрд╛рд▓ - рдЖрджреЗрд╢ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдЪрд╛рд░реНрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде

рдЖрдЗрдП рдЕрдм рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рд╡рд╛рддрд╛рд╡рд░рдг/рдмреЗрд╕.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

рдзреНрдпрд╛рди рджреЗрдВ рдзрд╛рд╡рдХ рдкрдВрдЬреАрдХрд░рдгрдЯреЛрдХрди рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ рд░рд╣рд╕реНрдп/рдмреЗрд╕.libsonnet, рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рдПрдВ:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

qbec show default

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рд╣реЗрд▓реНрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдкрд╣рд▓реЗ рд╕реЗ рддреИрдирд╛рдд рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

helm uninstall gitlab-runner

рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рддреИрдирд╛рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреВрдмреЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:

qbec apply default

7. рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдЪрдп

рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдлрд┐рд▓рд╣рд╛рд▓, gitlab-runner рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

.
тФЬтФАтФА components
тФВ   тФЬтФАтФА gitlab-runner.jsonnet
тФЬтФАтФА environments
тФВ   тФЬтФАтФА base.libsonnet
тФВ   тФФтФАтФА default.libsonnet
тФЬтФАтФА params.libsonnet
тФЬтФАтФА qbec.yaml
тФЬтФАтФА secrets
тФВ   тФФтФАтФА base.libsonnet
тФФтФАтФА vendor
    тФФтФАтФА gitlab-runner (submodule)

рд▓реЗрдХрд┐рди Git рдореЗрдВ рд░рд╣рд╕реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд╣рдореЗрд╢рд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреВрдмреЗрдХ рдФрд░ рдЖрдкрдХреЗ рд╕реАрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рднреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХрдИ рдФрд░ рд░рд╣рд╕реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдЙрди рд╕рднреА рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдРрд╕реЗ рдЕрджреНрднреБрдд рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рдкрд╛рдКрдВрдЧрд╛ git-рдХреНрд░рд┐рдкреНрдЯ.

git-рдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ, рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдФрд░ рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо Git рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВред

рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдмрд╛рдд git-рдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

git crypt init

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреАрдЬреАрдкреА рдХреБрдВрдЬреА рд╣реИ, рддреЛ рдЖрдк рддреБрд░рдВрдд рд╕реНрд╡рдпрдВ рдХреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдпреЛрдЧреА рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

git-crypt add-gpg-user [email protected]

рдЗрд╕ рддрд░рд╣ рдЖрдк рдЕрдкрдиреА рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд╣рдореЗрд╢рд╛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреАрдЬреАрдкреА рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреБрдВрдЬреА рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

git crypt export-key /path/to/keyfile

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрдпрд╛рдд рд╣реИ рдХреАрдлрд╛рдЗрд▓ рдЖрдкрдХреЗ рднрдВрдбрд╛рд░ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдпрд╣ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рд░рд╣рд╕реНрдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/gitlab-рдзрд╛рд╡рдХ/, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рд░рд╣рд╕реНрдп/, рдЖрдЗрдП рдЗрд╕рдореЗрдВ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ рд░рд╣рд╕реНрдп/.gitattributes рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рднреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВ * рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ git-рдХреНрд░рд┐рдкреНрдЯ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдЫреЛрдбрд╝рдХрд░ .gitattributes

рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛рдХрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

git crypt status -e

рдЖрдЙрдЯрдкреБрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрди рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреА рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕рдХреНрд╖рдо рд╣реИ

рдмрд╕, рдЕрдм рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

рдХрд┐рд╕реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЪрд▓рд╛рдПрдБ:

git crypt lock

рдФрд░ рддреБрд░рдВрдд рд╕рднреА рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреА, рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд╛рдПрдБ:

git crypt unlock

8. рдПрдХ рдЯреВрд▓рдмреЙрдХреНрд╕ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ

рдЯреВрд▓рдмреЙрдХреНрд╕ рдЫрд╡рд┐ рдЙрди рд╕рднреА рдЯреВрд▓ рд╡рд╛рд▓реА рдПрдХ рдЫрд╡рд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрд┐рдЯрд▓реИрдм рд░рдирд░ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЖрдЗрдП рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ dockerfiles/рдЯреВрд▓рдмреЙрдХреНрд╕/Dockerfile рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ рд╣рдо рдЙрди рд╕рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рдереЗред рдЬрдм рддрдХ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ Kubectl, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯрдЕрдк рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣реЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкреЙрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рднреВрдорд┐рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП gitlab-runner рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдБ:

cd deploy/gitlab-runner

рдФрд░ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ рдШрдЯрдХ/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

рд╣рдо рдЗрд╕рдореЗрдВ рдирдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рд╡рд╛рддрд╛рд╡рд░рдг/рдмреЗрд╕.libsonnet, рдЬреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

рдзреНрдпрд╛рди рджреЗрдВ $.components.rbac.name рдХрд╛ рдЕрд░реНрде рд╣реИ рдирд╛рдо рдШрдЯрдХ рдХреЗ рд▓рд┐рдП RBAC

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:

qbec diff default

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

qbec apply default

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, git рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ рд╣рдо рдмрдирд╛рдПрдВрдЧреЗ .gitlab-ci.yml рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ GIT_SUBMODULE_STRATEGY: рд╕рд╛рдорд╛рдиреНрдп рдЙрди рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .gitlab-ci.yml
git commit -m "Automate docker build"

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ v0.0.1 рдФрд░ рдЯреИрдЧ рдЬреЛрдбрд╝реЗрдВ:

git tag v0.0.1

рдЬрдм рднреА рд╣рдореЗрдВ рдХреЛрдИ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╣рдо рдЯреИрдЧ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЯреИрдЧ Git рдЯреИрдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗред рдПрдХ рдирдП рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢ рдЗрд╕ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛ред

рдЪрд▓реЛ рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ рдЧрд┐рдЯ рдкреБрд╢--рдЯреИрдЧ, рдФрд░ рдЖрдЗрдП рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреЗрдЦреЗрдВ:

рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЕрд╕реЗрдВрдмрд▓реА рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЪреВрдБрдХрд┐ рдирдП рдЯреИрдЧ рдкреБрд░рд╛рдиреЗ рдХрдорд┐рдЯреНрд╕ рдХреЛ рд╕реМрдВрдкреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреИрдирд╛рддреА рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЯреИрдЧ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╢рд╛рдЦрд╛ рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдорд╛рд╕реНрдЯрд░, рдЬрд┐рд╕рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд┐рд╡рд░реНрдЯ рдХреЗ рд╕рд╛рде рд░реЛрд▓рдмреИрдХ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдорд╛рд╕реНрдЯрд░-рд╢рд╛рдЦрд╛рдПрдБред

10. рддреИрдирд╛рддреА рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рди

Gitlab-рд░рдирд░ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреБрдВрдЬреА рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ CI рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдкрдВрдХреНрддрд┐ рдХреЛ Gitlab рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ; рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдБ:
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕

рдФрд░ рдЖрдЗрдП рдПрдХ рдирдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВ:

рдкреНрд░рдХрд╛рд░
рдХреБрдВрдЬреА
рд╡реИрд▓реНрдпреВ
рд╕рдВрд░рдХреНрд╖рд┐рдд
рдЕрдирджреЗрдЦрд╛
рд╡рд┐рд╕реНрддрд╛рд░

File
GITCRYPT_KEY
<your string>
true (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ false)
true
All environments

рдЬреЛрдбрд╝реЗ рдЧрдП рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдЕрдм рдЖрдЗрдП рдЕрдкрдирд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ .gitlab-ci.yml рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдирд╛:

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдХреНрдпреВрдмреЗрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рдирдП рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рдХрд┐рдП рд╣реИрдВ:

  • --рдХреБрдЫ/рдРрдк рд░реВрдЯ рдХрд░реЗрдВ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • --рдмрд▓:k8s-рд╕рдВрджрд░реНрдн __incluster__ - рдпрд╣ рдПрдХ рдЬрд╛рджреБрдИ рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рддреИрдирд╛рддреА рдЙрд╕реА рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ gtilab-runner рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ qbec рдЖрдкрдХреЗ kubeconfig рдореЗрдВ рдПрдХ рдЙрдкрдпреБрдХреНрдд Kubernetes рд╕рд░реНрд╡рд░ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛
  • --рдЗрдВрддрдЬрд╝рд╛рд░ - рдХреНрдпреВрдмреЗрдХ рдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди рддреИрдпрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рди рдЪрд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдПрдХ рд╕рдлрд▓ рдирд┐рдХрд╛рд╕-рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред
  • -рд╣рд╛рдБ - рдмрд╕ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╢реЗрд▓ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддрд╛ рд╣реИ рддреБрдореНрд╣реЗрдВ рдпрдХреАрди рд╣реИ? рдЬрдм рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛.

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .gitlab-ci.yml
git commit -m "Automate deploy"

рдФрд░ рдмрд╛рдж рдореЗрдВ git рдзрдХреНрдХрд╛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:

рджреВрд╕рд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

11. рдорд╛рд╕реНрдЯрд░ рдХреА рдУрд░ рдзрдХреЗрд▓рддреЗ рд╕рдордп рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рдФрд░ рд╕рдВрдпреЛрдЬрди

рдЖрдорддреМрд░ рдкрд░, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЪрд░рдг рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╣рд░ рдмрд╛рд░ рд╕рд╛рдЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреИрдЧ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдорд╛рд░реНрдЧ рдЕрдкрдирд╛рдПрдВрдЧреЗ рдФрд░ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ: рдЕрдм рд╣рдорд╛рд░реА рдЫрд╡рд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕рдореЗрдВ рдзрдХреНрдХрд╛ рджреЗрдВрдЧреЗ рддреЛ рдЗрд╕рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдорд╛рд╕реНрдЯрд░, рдФрд░ рдлрд┐рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Kubernetes рдкрд░ рддреИрдирд╛рдд рдХрд░реЗрдВред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЗрди рджреЛрдиреЛрдВ рдЬреЙрдмреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ .gitlab-ci.yml:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/
  only:
    refs:
      - master
      - tags

deploy_website:
  extends: .deploy_qbec_app
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдереНрд░реЗрдб рдЬреЛрдбрд╝рд╛ рд╣реИ рдорд╛рд╕реНрдЯрд░ ╨║ refs рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб_рд╡реЗрдмрд╕рд╛рдЗрдЯ рдФрд░ рдЕрдм рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ $CI_COMMIT_REF_NAME рдХреЗ рдмрджрд▓реЗ $CI_COMMIT_TAG, рдпрд╛рдиреА, рд╣рдо Git рдореЗрдВ рдЯреИрдЧ рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдм рд╣рдо рдЙрд╕ рдХрдорд┐рдЯ рдмреНрд░рд╛рдВрдЪ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдореЗрдЬ рдкреБрд╢ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдиреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдореЗрдВ рдбреЙрдХрд░-рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдЯ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЬрдм рд╕рд╛рдЗрдЯ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЯреИрдЧ рдХрд╛ рдирд╛рдо рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддрдм рднреА рд╣рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирдИ рдЫрд╡рд┐ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирдЬрд╝рд░ рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХрдЯ.

рд╡рд┐рдХрд▓реНрдк тАФvm:ext-str рдбрд╛рдЗрдЬреЗрд╕реНрдЯ=тАЭ$DIGESTтАЭ рдХреНрдпреВрдмреЗрдХ рдХреЗ рд▓рд┐рдП - рдЖрдкрдХреЛ jsonnet рдкрд░ рдПрдХ рдмрд╛рд╣рд░реА рд╡реЗрд░рд┐рдПрдмрд▓ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреБрдирдГ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЕрдм рдЯреИрдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдм рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрдВрдзреЗ рд░рд╣рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрджрд▓рдиреЗ рдкрд░ рддреИрдирд╛рддреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрдирд┐рдХреЛ рдХреА рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдЫрд╡рд┐ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ (рд╡рд┐рдХрд▓реНрдк) рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА --рдбрд╛рдЗрдЬреЗрд╕реНрдЯ-рдлрд╝рд╛рдЗрд▓)
рдлрд┐рд░ рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреИрдирд╛рддреА рдХреЗ рд╕рдордп рдЗрд╕реЗ рдкрдврд╝реЗрдВрдЧреЗред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/рд╡реЗрдмрд╕рд╛рдЗрдЯ/рд╡рд╛рддрд╛рд╡рд░рдг/base.libsonnet рдЬреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

рд╣реЛ рдЧрдпрд╛, рдЕрдм рдХреЛрдИ рднреА рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рдорд╛рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ рд╡реЗрдмрд╕рд╛рдЗрдЯ , рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рддреИрдирд╛рдд рдХрд░реЗрдВред

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .
git commit -m "Configure dynamic build"

рд╣рдо рдмрд╛рдж рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ git рдзрдХреНрдХрд╛ рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдорд╛рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢ рдХреЗ рд╕рд╛рде рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ .gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

рдкрд░рд┐рд╡рд░реНрддрди рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/gitlab-рдзрд╛рд╡рдХ/ рдФрд░ рд╣рдорд╛рд░рд╛ рдХрд╛рдо рддрднреА рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдЬрдм рдХреЛрдИ рд╣реЛрдЧрд╛

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

git рдзрдХреНрдХрд╛, рд╡рд╣ рдмреЗрд╣рддрд░ рд╣реИ:

рдЕрджреНрдпрддрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

12. рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг

рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рд╡рд┐рдзрддрд╛ рд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХрд╛рд░реНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдВ рдмрд┐рд▓реНрдб_рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣рдорд╛рд░реЗ рдореЗрдВ .gitlab-ci.yml, рдЗрд╕рдореЗрдВ рд╕реЗ рдмреНрд▓реЙрдХ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ рдХреЗрд╡рд▓, рдЬреЛ Gitlab рдХреЛ рдХрд┐рд╕реА рднреА рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдкрд░ рдЗрд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/

рдлрд┐рд░ рдХрд╛рд░реНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди_рд╡реЗрдмрд╕рд╛рдЗрдЯ, рд╡рд╣рд╛рдВ рдПрдХ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗрдВ рд╡рд╛рддрд╛рд╡рд░рдг:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

рдЗрд╕рд╕реЗ Gitlab рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдп рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреА рдареЗрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдЙрд╕рдХрд╛ рд╕рд╣реА рд▓рд┐рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

рдЖрдЗрдП рдЕрдм рджреЛ рдФрд░ рдиреМрдХрд░рд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

рдЙрдиреНрд╣реЗрдВ рдорд╛рд╕реНрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐рд╕реА рднреА рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреБрд╢ рдХрд░рдиреЗ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рд╛рдЗрдЯ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕рдВрд╕реНрдХрд░рдг рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдХреНрдпреВрдмреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрддреЗ рд╣реИрдВ: --рдРрдк-рдЯреИрдЧ - рдпрд╣ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рддреИрдирд╛рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЯреИрдЧ рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдЯреИрдЧ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдХреНрдпреВрдмреЗрдХ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рддрд░рд╣ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕реА рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╣рдо рднреА рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреВрдмреЗрдХ рд╕рдореАрдХреНрд╖рд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдХреЗ рдмрдЬрд╛рдп рдХреНрдпреВрдмреЗрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдпрд╣реА рд╡рд╣ рдХреНрд╖рдг рд╣реИ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рдкрд░рд┐рд╡реЗрд╢ (рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:

рдЬреЛрдбрд╝рдирд╛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/рд╡реЗрдмрд╕рд╛рдЗрдЯ/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

рдлрд┐рд░ рд╣рдо рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/рд╡реЗрдмрд╕рд╛рдЗрдЯ/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд┐рдЦреЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди/рд╡реЗрдмрд╕рд╛рдЗрдЯ/рд╡рд╛рддрд╛рд╡рд░рдг/рд╕рдореАрдХреНрд╖рд╛.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

рдЖрдЗрдП рдЬреЙрдмреВ рдкрд░ рднреА рдХрд░реАрдм рд╕реЗ рдирдЬрд░ рдбрд╛рд▓реЗрдВ stop_review, рдЬрдм рд╢рд╛рдЦрд╛ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рддреЛ рдпрд╣ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддрд╛рдХрд┐ рдЧрд┐рдЯрд▓реИрдм рдЪреЗрдХрдЖрдЙрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ GIT_STRATEGY: рдХреЛрдИ рдирд╣реАрдВ, рдмрд╛рдж рдореЗрдВ рд╣рдордиреЗ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдорд╛рд╕реНрдЯрд░-рдмреНрд░рд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рд╣рдЯрд╛рдПрдВред
рдпрд╣ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рддрдХ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддреНрдпреЗрдХ рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рд╣реЛрдЯрд▓ рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдкрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .
git commit -m "Enable automatic review"

git рдзрдХреНрдХрд╛, рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ-рдмреА рдЯреЗрд╕реНрдЯ, рдЧрд┐рдЯ рдкреБрд╢ рдореВрд▓ рдкрд░реАрдХреНрд╖рдг, рдЬрд╛рдБрдЪ рдХрд░рдирд╛:

Gitlab рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? - рдмрдврд╝рд┐рдпрд╛, рд╣рдорд╛рд░реА рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдЦрд╛ рд╣рдЯрд╛рдПрдБ: рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ рдорд╛рд╕реНрдЯрд░, рдЧрд┐рдЯ рдкреБрд╢ рдЙрддреНрдкрддреНрддрд┐: рдкрд░реАрдХреНрд╖рдг, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд┐рд▓реЛрдкрди рдХрд╛рд░реНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдореИрдВ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреЛрдИ рднреА рдбреЗрд╡рд▓рдкрд░ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдЦрд╛рдПрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рдмрджрд▓ рднреА рд╕рдХрддрд╛ рд╣реИ .gitlab-ci.yml рдЧреБрдкреНрдд рдЪрд░ рдлрд╝рд╛рдЗрд▓ рдХрд░реЗрдВ рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪреЗрдВред
рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдЯрд░, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдмрдирд╛рдПрдВред

13. рдРрдкреНрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ

рдРрдкреНрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдпрд╣ рдПрдХ GitLab рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рддреИрдирд╛рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕реЗ рддреБрд░рдВрдд рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдЗрди рдмрдЯрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреА рд╣реЛрдЧреА .gitlab/route-map.yml рдФрд░ рдЗрд╕рдореЗрдВ рд╕рднреА рдкрде рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ; рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

git add .gitlab/
git commit -m "Enable review apps"

git рдзрдХреНрдХрд╛, рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

рд╕рдореАрдХреНрд╖рд╛ рдРрдк рдмрдЯрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛!

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд:

рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣реЗ рд╣реИрдВ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ