Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рдирдорд╕реНрдХрд╛рд░! рдЕрд▓реАрдХрдбреЗ, рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╡рд░ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд░реАрдЪ рдЫрд╛рди рдСрдЯреЛрдореЗрд╢рди рд╕рд╛рдзрдиреЗ рд╕реЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗрдд. рдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд, рдореА рдЧрд┐рдЯрд▓реЕрдмрд╕рд╣ рдЦреЗрд│рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛, рддреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдорддрд╛рдВрдЪрд╛ рд╕рдЦреЛрд▓ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓рд╛ рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдХреЗрд▓реА.

рдпрд╛ рдХрд╛рдорд╛рдЪреА рдкреНрд░реЗрд░рдгрд╛ рд╕рдВрдХреЗрддрд╕реНрдерд│рд╛рд╡рд░реВрди рдорд┐рд│рд╛рд▓реА kubernetes.io, рдЬреЗ рдкрд╛рд╕реВрди рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ, рдЖрдгрд┐ рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреВрд▓ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА, рд░реЛрдмреЛрдЯ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рддреБрдордЪреНрдпрд╛ рдмрджрд▓рд╛рдВрд╕рд╣ рд╕рд╛рдЗрдЯрдЪреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЖрд╡реГрддреНрддреА рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЛ.

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

рд▓реЗрдЦ рдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рд╕рд╛рдзрдирд╛рдВрд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрд▓:
рд╣реНрдпреБрдЧреЛ, qbec, рдХрдирд┐рдХреЛ, git-рдХреНрд░рд┐рдкреНрдЯ ╨╕ рдЧрд┐рдЯрд▓рд╛рдм рд╕реАрдЖрдп рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреНрдпрд╛ рдирд┐рд░реНрдорд┐рддреАрд╕рд╣.

рд╕рд╛рдордЧреНрд░реА

  1. рд╣реНрдпреВрдЧреЛрд▓рд╛ рднреЗрдЯрд╛
  2. рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдд рдЖрд╣реЗ
  3. рдХрдирд┐рдХреЛрд▓рд╛ рдЬрд╛рдгреВрди рдШреЗрдгреЗ
  4. qbec рдЬрд╛рдгреВрди рдШреЗрдгреЗ
  5. Kubernetes-executor рд╕рд╣ Gitlab-рдзрд╛рд╡рдгрд╛рд░рд╛ рдкреНрд░рдпрддреНрди рдХрд░рдд рдЖрд╣реЗ
  6. qbec рд╕рд╣ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рддреИрдирд╛рдд рдХрд░рдгреЗ
  7. Git-crypt рд╕рд╛рджрд░ рдХрд░рдд рдЖрд╣реЗ
  8. рдЯреВрд▓рдмреЙрдХреНрд╕ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ
  9. рдЖрдордЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрдгрд┐ рдЯреЕрдЧрджреНрд╡рд╛рд░реЗ рдкреНрд░рддрд┐рдорд╛рдВрдЪреА рдЕрд╕реЗрдВрдмреНрд▓реА
  10. рдЙрдкрдпреЛрдЬрди рдСрдЯреЛрдореЗрд╢рди
  11. рдХрд▓рд╛рдХреГрддреА рдЖрдгрд┐ рдЕрд╕реЗрдВрдмреНрд▓реА рдЬреЗрд╡реНрд╣рд╛ рдорд╛рд╕реНрдЯрд░рдХрдбреЗ рдврдХрд▓рдгреЗ
  12. рдбрд╛рдпрдиреЕрдорд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг
  13. рдЕреЕрдкреНрд╕рдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░рд╛

1. рд╣реНрдпреВрдЧреЛрд▓рд╛ рдЬрд╛рдгреВрди рдШреЗрдгреЗ

рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рд╣реНрдпреВрдЧреЛрд╡рд░ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдкреНрд░рдХрд╛рд╢рди рд╕рд╛рдЗрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ. рд╣реНрдпреВрдЧреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдЬрдирд░реЗрдЯрд░ рдЖрд╣реЗ.

рдЬреЗ рд╕реНрдерд┐рд░ рдЬрдирд░реЗрдЯрд░рд╢реА рдкрд░рд┐рдЪрд┐рдд рдирд╛рд╣реАрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рдереЛрдбреЗ рдЕрдзрд┐рдХ рд╕рд╛рдВрдЧреЗрди. рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдХрд╛рд╣реА PHP рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЗрдВрдЬрд┐рдирдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рдЬреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рд╡рд┐рдирдВрддреА рдХреЗрд▓реНрдпрд╛рд╡рд░, рдлреНрд▓рд╛рдпрд╡рд░ рдкреГрд╖реНрдареЗ рддрдпрд╛рд░ рдХрд░рддрд╛рдд, рд╕реНрдерд┐рд░ рдЬрдирд░реЗрдЯрд░ рдереЛрдбреНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрддреНрд░реЛрдд рдШреЗрдгреНрдпрд╛рд╕ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд, рд╕рд╛рдорд╛рдиреНрдпрдд: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдЖрдгрд┐ рдереАрдо рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рдордзреАрд▓ рдлрд╛рдпрд▓реАрдВрдЪрд╛ рд╕рдВрдЪ, рдирдВрддрд░ рддреНрдпрд╛рдВрдирд╛ рдкреВрд░реНрдгрдкрдгреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯрдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛.

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

рддреБрдореНрд╣реА рд╕реНрдерд╛рдирд┐рдХрд░рд┐рддреНрдпрд╛ рд╣реНрдпреВрдЧреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛:

рдирд╡реАрди рд╕рд╛рдЗрдЯ рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЗ:

hugo new site docs.example.org

рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реА git рд░реЗрдкреЙрдЬрд┐рдЯрд░реА:

cd docs.example.org
git init

рдЖрддрд╛рдкрд░реНрдпрдВрдд, рдЖрдордЪреА рд╕рд╛рдЗрдЯ рдореВрд│ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо рдереАрдо рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ; рдереАрдо рд╣рд╛ рдлрдХреНрдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдЖрдгрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рдпрдорд╛рдВрдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ рдЬреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдЖрдордЪреА рд╕рд╛рдЗрдЯ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддреЗ.

рдереАрдорд╕рд╛рдареА рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ рдЬрд╛рдгреВрди рдШреНрдпрд╛, рдЬреЗ, рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рд╕рд╛рдЗрдЯрд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рдЕрдиреБрдХреВрд▓ рдЖрд╣реЗ.

рдорд▓рд╛ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдХрдбреЗ рд╡рд┐рд╢реЗрд╖ рд▓рдХреНрд╖ рджреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдордзреНрдпреЗ рдереАрдо рдлрд╛рдЗрд▓реНрд╕ рд╕реЗрд╡реНрд╣ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА; рддреНрдпрд╛рдРрд╡рдЬреА, рдЖрдореНрд╣реА рддреЗ рд╡рд╛рдкрд░реВрди рдХрдиреЗрдХреНрдЯ рдХрд░реВ рд╢рдХрддреЛ. git рд╕рдмрдореЙрдбреНрдпреВрд▓:

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/ рдЖрдордЪреА рдирд╡реАрди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рддрдкрд╛рд╕рд╛, рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдХреЗрд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдмрджрд▓ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЙрдШрдбрд▓реЗрд▓реЗ рдкреГрд╖реНрда рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рд╛, рдЕрддрд┐рд╢рдп рд╕реЛрдпреАрд╕реНрдХрд░!

рдордзреНрдпреЗ рдХрд╡реНрд╣рд░ рдкреЗрдЬ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ content/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

рдирд╡реНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреГрд╖реНрдард╛рдЪрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рд╕рд╛рдЗрдЯ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдЪрд╛рд▓рд╡рд╛:

hugo

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рд╛рдордЧреНрд░реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ/ рдЖрдгрд┐ рддреБрдордЪреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЕрд╕реЗрд▓.
рд╣реЛрдп, рддрд╕реЗ, рд▓рдЧреЗрдЪ рддреНрдпрд╛рдд рдЬреЛрдбреВрдпрд╛ .gitignore:

echo /public > .gitignore

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

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

рдЖрдордЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдЪреА рд░рдЪрдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ. рдореА рд╕рд╣рд╕рд╛ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рд╡рд╛рдкрд░рддреЛ:

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

  • рдбреЙрдХрд░рдлрд╛рдИрд▓реНрд╕/ - рдбреЙрдХрд░рдлрд╛рдИрд▓реНрд╕рд╕рд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛.
  • рддреИрдирд╛рдд рдХрд░рдгреЗ/ тАФ Kubernetes рд╡рд░ рдЖрдордЪреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯреАрдд рдЖрд╣реЗ

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣реА рдорд╛рд░реНрдЧрд╛рд╡рд░ рдЖрдордЪреА рдкрд╣рд┐рд▓реА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░реВ рдбреЙрдХрд░рдлрд╛рдИрд▓реНрд╕/рд╡реЗрдмрд╕рд╛рдЗрдЯ/рдбреЙрдХрд░рдлрд╛рдЗрд▓

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" ]

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

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

3. рдХрдирд┐рдХреЛрд▓рд╛ рдУрд│рдЦрдгреЗ

рдбреЙрдХрд░ рдЗрдореЗрдЬ рдмрд┐рд▓реНрдбрд░ рдореНрд╣рдгреВрди рдореА рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рдард░рд╡рд▓реЗ рдХрдирд┐рдХреЛ, рдХрд╛рд░рдг рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирд╕рд╛рдареА рдбреЙрдХрд░ рдбрд┐рдордирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рддреЗ рдЖрдгрд┐ рдмрд┐рд▓реНрдб рд╕реНрд╡рддрдГ рдХреЛрдгрддреНрдпрд╛рд╣реА рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рддреЗ рдЖрдгрд┐ рдХреЕрд╢реЗ рдереЗрдЯ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдкреВрд░реНрдг рд╡рд╛рдвреАрд╡ рдкрд░реНрд╕рд┐рд╕реНрдЯрдВрдЯ рд╕реНрдЯреЛрд░реЗрдЬрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреВрд░ рд╣реЛрддреЗ.

рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡рд╛ kaniko рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯрд░ рдЖрдгрд┐ рддреНрдпрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдмрд┐рд▓реНрдб рд╕рдВрджрд░реНрдн рдкрд╛рд╕ рдХрд░рд╛; рд╣реЗ рдбреЙрдХрд░рджреНрд╡рд╛рд░реЗ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рджреЗрдЦреАрд▓ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

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

рдХреБрдареЗ registry.gitlab.com/kvaps/docs.example.org/website - рддреБрдордЪреНрдпрд╛ рдбреЙрдХрд░ рдЗрдореЗрдЬрдЪреЗ рдирд╛рд╡; рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреЗ рдЖрдкреЛрдЖрдк рдбреЙрдХрд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

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

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

4. qbec рдЬрд╛рдгреВрди рдШреЗрдгреЗ

Qbec рдПрдХ рдЙрдкрдпреЛрдЬрди рд╕рд╛рдзрди рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдореЕрдирд┐рдлреЗрд╕реНрдЯрдЪреЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╡рд░реНрдгрди рдХрд░реВ рджреЗрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рддреИрдирд╛рдд рдХрд░реВ рджреЗрддреЗ. рдореБрдЦреНрдп рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдореНрд╣рдгреВрди Jsonnet рд╡рд╛рдкрд░рдгреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рддреАрд▓ рдлрд░рдХрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕реБрд▓рдн рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ рдЖрдгрд┐ рдХреЛрдбрдЪреА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЬрд╡рд│рдЬрд╡рд│ рдкреВрд░реНрдгрдкрдгреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ.

рд╣реЗ рд╡рд┐рд╢реЗрд╖рдд: рдЕрд╢рд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдЦрд░реЗ рдЕрд╕реВ рд╢рдХрддреЗ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рдЕрдиреЗрдХ рдХреНрд▓рд╕реНрдЯрд░реНрд╕рдордзреНрдпреЗ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ рдЖрдгрд┐ Git рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╡рд░реНрдгрди рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рддреЗ.

Qbec рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯреНрд╕ рддреНрдпрд╛рдВрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд╛рд╕ рдХрд░реВрди рд░реЗрдВрдбрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдирдВрддрд░ рдирд┐рдпрдорд┐рдд рдореЕрдирд┐рдлреЗрд╕реНрдЯ рдкреНрд░рдорд╛рдгреЗрдЪ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рддреБрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рд╡рд┐рд╡рд┐рдз рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдпрд╛рдореБрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХрддреЗрдкрд╛рд╕реВрди рдореБрдХреНрддрддрд╛ рдорд┐рд│рддреЗ. рдЪрд╛рд░реНрдЯ рдореНрдпреБрдЭрд┐рдпрдо рд╡рд╛рдкрд░рд╛. рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдкрдг рдереЗрдЯ 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: {}

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

рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ qbec.yaml, рдЖрдгрд┐ рдлрд╛рдЗрд▓рдордзреНрдпреЗ params.libsonnet, рдЬрд┐рдереЗ рддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЛрдареЗ рдорд┐рд│рд╡рд╛рдпрдЪреЗ рддреЗ рд╕рд╛рдВрдЧрддреЗ.

рдкреБрдвреЗ рдЖрдкрдг рджреЛрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд╛рд╣рддреЛ:

  • рдШрдЯрдХ/ - рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рдореЕрдирд┐рдлреЗрд╕реНрдЯ рдпреЗрдереЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓; рддреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрдгрди jsonnet рдЖрдгрд┐ рдирд┐рдпрдорд┐рдд yaml рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ
  • рд╡рд╛рддрд╛рд╡рд░рдг/ тАФ рдпреЗрдереЗ рдЖрдкрдг рдЖрдкрд▓реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ (рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕) рдЪреЗ рд╡рд░реНрдгрди рдХрд░реВ.

рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рджреЛрди рдлрд╛рдЗрд▓реНрд╕ рдЖрд╣реЗрдд:

  • рд╡рд╛рддрд╛рд╡рд░рдг/base.libsonnet - рддреНрдпрд╛рдд рд╕рд░реНрд╡ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдп рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрд╕рддреАрд▓
  • рд╡рд╛рддрд╛рд╡рд░рдг/default.libsonnet тАФ рдкрд░реНрдпрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рдЕрдзрд┐рд▓рд┐рдЦрд┐рдд рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕рдорд╛рд╡рд┐рд╖реНрдЯреАрдд рдЖрд╣реЗ рдбреАрдлреЙрд▓реНрдЯ

рдЪрд▓рд╛ рдЙрдШрдбреВрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг/base.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',
    },
  },
}

рдЪрд▓рд╛ рдЖрдкрд▓рд╛ рдкрд╣рд┐рд▓рд╛ рдШрдЯрдХ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХрд░реВрдпрд╛ components/website.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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

рдпрд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рдЖрдореНрд╣реА рдПрдХрд╛рдЪ рд╡реЗрд│реА рддреАрди рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдШрдЯрдХрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ, рддреЗ рдЖрд╣реЗрдд: рддреИрдирд╛рдд рдХрд░рдгреЗ, рд╕реЗрд╡рд╛ ╨╕ рдкреНрд░рд╡реЗрд╢. рдЖрдореНрд╣реА рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдШрдЯрдХрд╛рдВрдордзреНрдпреЗ рдШрд╛рд▓реВ рд╢рдХрддреЛ, рдкрд░рдВрддреБ рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓.

рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ jsonnet рдирд┐рдпрдорд┐рдд json рд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ, рддрддреНрддреНрд╡рддрдГ, рдирд┐рдпрдорд┐рдд json рдЖрдзреАрдкрд╛рд╕реВрди рд╡реИрдз jsonnet рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рдгреЗ рд╕реЛрдкреЗ рд╣реЛрдК рд╢рдХрддреЗ. yaml2json рддреБрдордЪреНтАНрдпрд╛ рдиреЗрд╣рдореАрдЪреНтАНрдпрд╛ yaml рдЪреЗ json рдордзреНтАНрдпреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА, рдХрд┐рдВрд╡рд╛, рдЬрд░ рддреБрдордЪреНтАНрдпрд╛ рдШрдЯрдХрд╛рдВрдордзреНтАНрдпреЗ рдХреЛрдгрддреЗрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдирд╕рд▓реНтАНрдпрд╛рд╕, рддреНтАНрдпрд╛рдВрдЪреЗ рд░реЗрдЧреНрдпреБрд▓рд░ yamlрдЪреНтАНрдпрд╛ рд░реВрдкрд╛рдд рд╡рд░реНрдгрди рдХрд░рддрд╛ рдпреЗрдИрд▓.

рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рддрд╛рдирд╛ jsonnet рдореА рддреБрдордЪреНрдпрд╛ рд╕рдВрдкрд╛рджрдХрд╛рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, vim рд╕рд╛рдареА рдПрдХ рдкреНрд▓рдЧрдЗрди рдЖрд╣реЗ vim-jsonnet, рдЬреЗ рд╕рд┐рдВрдЯреЕрдХреНрд╕ рд╣рд╛рдпрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЪрд╛рд▓реВ рдХрд░рддреЗ рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ jsonnet fmt рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЖрдкрдг рдЬрддрди рдХрд░рд╛ (jsonnet рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ).

рд╕рд░реНрд╡ рдХрд╛рд╣реА рддрдпрд╛рд░ рдЖрд╣реЗ, рдЖрддрд╛ рдЖрдореНрд╣реА рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддреЛ:

рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рдорд┐рд│рд╛рд▓реЗ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА, рдЪрд▓рд╛ рдзрд╛рд╡реВрдпрд╛:

qbec show default

рдЖрдЙрдЯрдкреБрдЯрд╡рд░, рддреБрдореНрд╣рд╛рд▓рд╛ рд░реЗрдВрдбрд░ рдХреЗрд▓реЗрд▓реЗ yaml рдореЕрдирд┐рдлреЗрд╕реНрдЯ рджрд┐рд╕реЗрд▓ рдЬреЗ рдбреАрдлреЙрд▓реНрдЯ рдХреНрд▓рд╕реНрдЯрд░рд╡рд░ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓.

рдЫрд╛рди, рдЖрддрд╛ рдЕрд░реНрдЬ рдХрд░рд╛:

qbec apply default

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

рдЖрдордЪрд╛ рдЕрд░реНрдЬ рддрдпрд╛рд░ рдЖрдгрд┐ рддреИрдирд╛рдд рдЖрд╣реЗ!

рддреБрдореНрд╣реА рдмрджрд▓ рдХреЗрд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдиреЗрд╣рдореА рд╣реЗ рдХрд░реВ рд╢рдХрддрд╛:

qbec diff default

рдпрд╛ рдмрджрд▓рд╛рдВрдЪрд╛ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рддреИрдирд╛рддреАрд╡рд░ рдХрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдИрд▓ рд╣реЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

5. Kubernetes-executor рд╕рд╣ Gitlab-рдзрд╛рд╡рдгрд╛рд░рд╛ рдкреНрд░рдпрддреНрди рдХрд░рдд рдЖрд╣реЗ

рдЕрд▓реАрдХрдбреЗ рдкрд░реНрдпрдВрдд рдореА рдлрдХреНрдд рдирд┐рдпрдорд┐рдд рд╡рд╛рдкрд░рд▓реЗ gitlab-рдзрд╛рд╡рдгрд╛рд░рд╛ рд╢реЗрд▓ рдХрд┐рдВрд╡рд╛ рдбреЙрдХрд░-рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯрд░рд╕рд╣ рдкреВрд░реНрд╡-рддрдпрд╛рд░ рдорд╢реАрдирд╡рд░ (LXC рдХрдВрдЯреЗрдирд░). рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЖрдордЪреНрдпрд╛ рдЧрд┐рдЯрд▓реЕрдмрдордзреНрдпреЗ рдЕрд╕реЗ рдЕрдиреЗрдХ рдзрд╛рд╡рдкрдЯреВ рдЬрд╛рдЧрддрд┐рдХ рд╕реНрддрд░рд╛рд╡рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ. рддреНрдпрд╛рдВрдиреА рд╕рд░реНрд╡ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рдЧреЛрд│рд╛ рдХреЗрд▓реНрдпрд╛.

рдкрд░рдВрддреБ рд╕рд░рд╛рд╡рд╛рдиреЗ рджрд░реНрд╢рд╡рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рд╕рд░реНрд╡рд╛рдд рдЖрджрд░реНрд╢ рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рдзрд╛рд╡рдкрдЯреВ рддреИрдирд╛рдд рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдЖрдгрд┐ рд╡реИрдЪрд╛рд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рдЖрд╣реЗ.

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

рдЧрд┐рдЯрд▓реЕрдм рдХреБрдмрд░рдиреЗрдЯреЗрд╕рд▓рд╛ рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░-рддрдпрд╛рд░ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ рдиреЛрдВрджрдгреА рдЯреЛрдХрди рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рд╕реЗрдЯрд┐рдВрдЧреНрдЬ -> CI / CD -> рдзрд╛рд╡рдкрдЯреВ рдЖрдгрд┐ рддреЗ рд╕реБрдХрд╛рдгреВрдХрдбреЗ рджреНрдпрд╛:

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 - рддреБрдордЪреНрдпрд╛ рдЧрд┐рдЯрд▓реЕрдм рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ рдкрддреНрддрд╛.
  • yga8y-jdCusVDn_t4Wxc - рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдиреЛрдВрджрдгреА рдЯреЛрдХрди.
  • rbac.create=true тАФ kubernetes-executor рд╡рд╛рдкрд░реВрди рдЖрдордЪреА рдХрд╛рд░реНрдпреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреЙрдб рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рдзрд╛рд╡рдкрдЯреВрд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдорд╛рдгрд╛рдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдкрдг рд╡рд┐рднрд╛рдЧрд╛рдд рдиреЛрдВрджрдгреАрдХреГрдд рдзрд╛рд╡рдкрдЯреВ рдкрд╣рд╛рд╡реЗ рдзрд╛рд╡рдкрдЯреВ, рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдк рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ.

рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдзрд╛рд╡рдкрдЯреВрдЪрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рд╣реЗ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ рдХрд╛? - рд╣реЛрдп, рддреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ! рдзрд╛рд╡рдкрдЯреВрдВрдЪреА рдореЕрдиреНрдпреБрдЕрд▓реА рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ рдЖрдгрдЦреА рддреНрд░рд╛рд╕ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА, рдЖрддрд╛рдкрд╛рд╕реВрди рдзрд╛рд╡рдкрдЯреВ рдЖрдкреЛрдЖрдк рддрдпрд╛рд░ рдЖрдгрд┐ рдирд╖реНрдЯ рд╣реЛрддреАрд▓.

6. QBEC рд╕рд╣ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рддреИрдирд╛рдд рдХрд░рд╛

рдЖрдореНрд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓реНрдпрд╛рдкрд╛рд╕реВрди gitlab-рдзрд╛рд╡рдгрд╛рд░рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рдПрдХ рднрд╛рдЧ, рдЖрдордЪреНрдпрд╛ Git рднрд╛рдВрдбрд╛рд░рд╛рдд рддреНрдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.

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

cd deploy
qbec init gitlab-runner
cd gitlab-runner

рдпрд╛рд╡реЗрд│реА рдЖрдореНтАНрд╣реА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдПрдВрдЯрд┐рдЯреАрдЬрдЪреЗ рд╡рд░реНрдгрди рдореЕрдиреНрдпреБрдЕрд▓реА рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рд░реЗрдбреАрдореЗрдб рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдШреЗрдК. qbec рдЪрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рдореНрд╣рдгрдЬреЗ рдереЗрдЯ Git рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреВрди рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рд░реЗрдВрдбрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛.

рдЪрд▓рд╛ git рд╕рдмрдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░реВрди рдХрдиреЗрдХреНрдЯ рдХрд░реВрдпрд╛:

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

рдЖрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛/рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░рд╕рд╛рдареА рдЪрд╛рд░реНрдЯ рдЕрд╕рд▓реЗрд▓реЗ рднрд╛рдВрдбрд╛рд░ рдЖрд╣реЗ.

рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ, рддреБрдореНрд╣реА рдЗрддрд░ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХрдиреЗрдХреНрдЯ рдХрд░реВ рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдВрдкреВрд░реНрдг рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЕрдзрд┐рдХреГрдд рдЪрд╛рд░реНрдЯрд╕рд╣ https://github.com/helm/charts

рдЪрд▓рд╛ рдШрдЯрдХрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░реВрдпрд╛ components/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,
  }
)

рд╕рд╛рдареА рдкрд╣рд┐рд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж expandHelmTemplate рддреНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдЪрд╛рд░реНрдЯрдЪрд╛ рдорд╛рд░реНрдЧ рдкрд╛рд╕ рдХрд░рддреЛ params.values, рдЬреЗ рдЖрдкрдг рдкрд░реНрдпрд╛рд╡рд░рдг рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреВрди рдШреЗрддреЛ, рддреНрдпрд╛рдирдВрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдпреЗрддреЛ

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

рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдЪреНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╡рд░реНрдгрди рдХрд░реВ рд╡рд╛рддрд╛рд╡рд░рдг/base.libsonnet:

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

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

рд▓рдХреНрд╖ рджреНрдпрд╛ рдзрд╛рд╡рдгрд╛рд░рд╛ рдиреЛрдВрджрдгреА рдЯреЛрдХрди рдЖрдореНрд╣реА рдмрд╛рд╣реНрдп рдлрд╛рдЗрд▓рдордзреВрди рдШреЗрддреЛ secrets/base.libsonnet, рдЪрд▓рд╛ рддреЗ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╛рд░реНрдп рдХрд░рддреЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕реВрдпрд╛:

qbec show default

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

helm uninstall gitlab-runner

рдЖрдгрд┐ рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рддреИрдирд╛рдд рдХрд░рд╛, рдкрд░рдВрддреБ qbec рджреНрд╡рд╛рд░реЗ:

qbec apply default

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

рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рд╣реЗ рдПрдХ рд╕рд╛рдзрди рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рд╕рд╛рдареА рдкрд╛рд░рджрд░реНрд╢рдХ рдПрдирдХреНрд░рд┐рдкреНрд╢рди рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

рдпрд╛рдХреНрд╖рдгреА, рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░рд╕рд╛рдареА рдЖрдордЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд░рдЪрдирд╛ рдЕрд╢реА рджрд┐рд╕рддреЗ:

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

рдкрдг рдЧрд┐рдЯрдордзреНрдпреЗ рдЧреБрдкрд┐рддреЗ рд╕рд╛рдард╡рдгреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╛рд╣реА, рдЖрд╣реЗ рдХрд╛? рдореНрд╣рдгреВрди рдЖрдкрдг рддреНрдпрд╛рдВрдирд╛ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╕рд╣рд╕рд╛, рдПрдХрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреНрдпрд╛ рдлрд╛рдпрджреНрдпрд╛рд╕рд╛рдареА, рд╣реЗ рдиреЗрд╣рдореАрдЪ рдЕрд░реНрдердкреВрд░реНрдг рдирд╕рддреЗ. рддреБрдореНрд╣реА рдЧреБрдкрд┐рддреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ qbec рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ CI рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд▓рд╛рдВрджреНрд╡рд╛рд░реЗ.
рдкрд░рдВрддреБ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдЖрдгрдЦреА рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд▓реНрдк рджреЗрдЦреАрд▓ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдЕрдиреЗрдХ рд░рд╣рд╕реНрдпреЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд; рддреЗ рд╕рд░реНрд╡ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд▓рдиреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рдЕрддреНрдпрдВрдд рдХрдареАрдг рд╣реЛрдИрд▓.

рд╢рд┐рд╡рд╛рдп, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╢рд╛ рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХ рд╕рд╛рдзрдирд╛рдмрджреНрджрд▓ рд╕рд╛рдВрдЧреВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА git-рдХреНрд░рд┐рдкреНрдЯ.

git-рдХреНрд░рд┐рдкреНрдЯ рд╣реЗ рджреЗрдЦреАрд▓ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ рдХреА рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рд░рд╣рд╕реНрдпрд╛рдВрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдЬрддрди рдХрд░рдгреНрдпрд╛рд╕, рддрд╕реЗрдЪ рддреБрд▓рдирд╛, рд╡рд┐рд▓реАрди рдЖрдгрд┐ рд╕рдВрдШрд░реНрд╖рд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ рдЬрд╕реЗ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ Git рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдХрд░рдгреНрдпрд╛рдЪреА рд╕рд╡рдп рдЖрд╣реЗ.

рд╕реНрдерд╛рдкрдиреЗрдирдВрддрд░ рдкрд╣рд┐рд▓реА рдЧреЛрд╖реНрдЯ git-рдХреНрд░рд┐рдкреНрдЯ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рд╕рд╛рдареА рдХреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

git crypt init

рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ PGP рдХреА рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣реА рдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рддрддреНрдХрд╛рд│ рд╕реНрд╡рддрдГрд▓рд╛ рд╕рд╣рдпреЛрдЧреА рдореНрд╣рдгреВрди рдЬреЛрдбреВ рд╢рдХрддрд╛:

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

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рддреБрдореНрд╣реА рддреБрдордЪреА рдЦрд╛рдЬрдЧреА рдХреА рд╡рд╛рдкрд░реВрди рд╣реЗ рднрд╛рдВрдбрд╛рд░ рдиреЗрд╣рдореА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реВ рд╢рдХрддрд╛.

рддреБрдордЪреНрдпрд╛рдХрдбреЗ PGP рдХреА рдирд╕реЗрд▓ рдЖрдгрд┐ рддреБрдордЪреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╕реЗрд▓, рддрд░ рддреБрдореНрд╣реА рджреБрд╕рд▒реНрдпрд╛ рдорд╛рд░реНрдЧрд╛рдиреЗ рдЬрд╛рдКрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░реВ рд╢рдХрддрд╛:

git crypt export-key /path/to/keyfile

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЬреЛ рдХреЛрдгреА рдирд┐рд░реНрдпрд╛рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ рдХреА рдлрд╛рдЗрд▓ рддреБрдордЪрд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рдЕрд╕реЗрд▓.

рдЖрдордЪреЗ рдкрд╣рд┐рд▓реЗ рд░рд╣рд╕реНрдп рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.
рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ рдХреА рдЖрдореНрд╣реА рдЕрдЬреВрдирд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдЖрд╣реЛрдд deploy/gitlab-runner/, рдЬрд┐рдереЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрд╣реЗ рдЧреБрдкрд┐рддреЗ/, рддреНрдпрд╛рддреАрд▓ рд╕рд░реНрд╡ рдлрд╛рдИрд▓реНрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реВрдпрд╛, рдпрд╛рд╕рд╛рдареА рдЖрдкрдг рдПрдХ рдлрд╛рдИрд▓ рдмрдирд╡реВ secrets/.gitattributes рдЦрд╛рд▓реАрд▓ рд╕рд╛рдордЧреНрд░реАрд╕рд╣:

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

рд╕рд╛рдордЧреНрд░реАрд╡рд░реВрди рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рд╕рд░реНрд╡ рдлрд╛рдпрд▓реА рдореБрдЦрд╡рдЯрд╛ рдШрд╛рддрд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд * рджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рд╡рд┐рд▓реЗ рдЬрд╛рдИрд▓ git-рдХреНрд░рд┐рдкреНрдЯ, рдмрд╣реБрддреЗрдХ рд╡рдЧрд│рддрд╛ .gitaattributes

рдЖрдореНрд╣реА рд╣реЗ рдЪрд╛рд▓рд╡реВрди рддрдкрд╛рд╕реВ рд╢рдХрддреЛ:

git crypt status -e

рдЖрдЙрдЯрдкреБрдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ рд╕рд░реНрд╡ рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рдЕрд╕реЗрд▓ рдЬреНрдпрд╛рд╕рд╛рдареА рдПрдирдХреНрд░рд┐рдкреНрд╢рди рд╕рдХреНрд╖рдо рдХреЗрд▓реЗ рдЖрд╣реЗ

рдПрд╡рдвреЗрдЪ, рдЖрддрд╛ рдЖрдореНрд╣реА рдЖрдордЪреЗ рдмрджрд▓ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рдХрд░реВ рд╢рдХрддреЛ:

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

рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЕрд╡рд░реЛрдзрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдЪрд╛рд▓рд╡рд╛:

git crypt lock

рдЖрдгрд┐ рддрд╛рдмрдбрддреЛрдм рд╕рд░реНрд╡ рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд╛рдпрд▓реА рдмрд╛рдпрдирд░реАрдордзреНрдпреЗ рдмрджрд▓рддреАрд▓, рддреНрдпрд╛ рд╡рд╛рдЪрдгреЗ рдЕрд╢рдХреНрдп рд╣реЛрдИрд▓.
рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЪрд╛рд▓рд╡рд╛:

git crypt unlock

8. рдЯреВрд▓рдмреЙрдХреНрд╕ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рд╛

рдЯреВрд▓рдмреЙрдХреНрд╕ рдЗрдореЗрдЬ рд╣реА рд╕рд░реНрд╡ рдЯреВрд▓реНрд╕ рдЕрд╕рд▓реЗрд▓реА рдЗрдореЗрдЬ рдЖрд╣реЗ рдЬреА рдЖрдореНрд╣реА рдЖрдордЪрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░реВ. рд╣реЗ рдЧрд┐рдЯрд▓реЕрдм рд░рдирд░рджреНрд╡рд╛рд░реЗ рдард░рд╛рд╡рд┐рдХ рдЙрдкрдпреЛрдЬрди рдХрд╛рд░реНрдпреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдИрд▓.

рдпреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЪрд▓рд╛ рдПрдХ рдирд╡реАрди рддрдпрд╛рд░ рдХрд░реВрдпрд╛ рдбреЙрдХрд░рдлрд╛рдИрд▓реНрд╕/рдЯреВрд▓рдмреЙрдХреНрд╕/рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдЦрд╛рд▓реАрд▓ рд╕рд╛рдордЧреНрд░реАрд╕рд╣:

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

рдЖрдгрд┐ рдПрдХ рдирд╡реАрди рдШрдЯрдХ рдЬреЛрдбрд╛ components/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,
      },
    ],
  },
]

рдЖрдореНрд╣реА рдирд╡реАрди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╡рд░реНрдгрди рджреЗрдЦреАрд▓ рдХрд░реВ рд╡рд╛рддрд╛рд╡рд░рдг/base.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 рд╕рдВрджрд░реНрднрд┐рдд рдирд╛рд╡ рдШрдЯрдХрд╛рд╕рд╛рдареА рдЖрд░рдмреЕрдХ

рдХрд╛рдп рдмрджрд▓рд▓реЗ рдЖрд╣реЗ рддреЗ рддрдкрд╛рд╕реВрдпрд╛:

qbec diff default

рдЖрдгрд┐ рдЖрдордЪреЗ рдмрджрд▓ Kubernetes рд╡рд░ рд▓рд╛рдЧреВ рдХрд░рд╛:

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 рдЯреЕрдЧрд╢реА рдЬреЛрдбрд▓реЗ рдЬрд╛рддреАрд▓. рдирд╡реАрди рдЯреЕрдЧрд╕рд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢ рдпрд╛ рдЯреЕрдЧрд╕рд╣ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрд▓.

рдЪрд▓рд╛ рдХрд░реВрдпрд╛ git push --tags, рдЖрдгрд┐ рдЖрдордЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд╛рд╣реВ:

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЯреЕрдЧрджреНрд╡рд╛рд░реЗ рдЕрд╕реЗрдВрдмреНрд▓реА рдпреЛрдЧреНрдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╛рд╣реА рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдХрдбреЗ рдЖрдкрд▓реЗ рд▓рдХреНрд╖ рд╡реЗрдзреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ. рдЬреБрдиреНрдпрд╛ рдХрдорд┐рдЯрд╛рдВрдирд╛ рдирд╡реАрди рдЯреЕрдЧ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реБрд░реВ рдХреЗрд▓реНрдпрд╛рдиреЗ рдЬреБрдиреА рдЖрд╡реГрддреНрддреА рддреИрдирд╛рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рд╛рдорд╛рдиреНрдпрдд: рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЯреЕрдЧрд╢реА рдмрд╛рдВрдзрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢рд╛рдЦреЗрдд рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдорд╛рд╕реНрдЯрд░, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдкреНрд░рддрд┐рдорд╛рдВрдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛ рд╣рд╛рд░реНрдбрдХреЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдпреЗрдереЗ рддреБрдореНрд╣реА рдПрдХрд╛ рд╕рд╛рдзреНрдпрд╛ рд░рд┐рд╡реНрд╣рд░реНрдЯрд╕рд╣ рд░реЛрд▓рдмреЕрдХ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛ рдорд╛рд╕реНрдЯрд░- рд╢рд╛рдЦрд╛.

10. рддреИрдирд╛рддреАрдЪреЗ рдСрдЯреЛрдореЗрд╢рди

рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░рдиреЗ рдЖрдордЪреА рдЧреБрдкрд┐рддреЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реА рдХреА рдирд┐рд░реНрдпрд╛рдд рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рддреА рдЖрдордЪреНрдпрд╛ CI рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рдЬреЛрдбрд╛рд╡реА рд▓рд╛рдЧреЗрд▓:

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

рдЖрдореНрд╣реА Gitlab рдордзреНрдпреЗ рдкрд░рд┐рдгрд╛рдореА рдУрд│ рдЬрддрди рдХрд░реВ; рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдк рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╡рд░ рдЬрд╛рдКрдпрд╛:
рд╕реЗрдЯрд┐рдВрдЧреНрдЬ -> CI / CD -> рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕

рдЖрдгрд┐ рдПрдХ рдирд╡реАрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:

рдкреНрд░рдХрд╛рд░
рдХреА
рдореВрд▓реНрдп
рд╕рдВрд░рдХреНрд╖рд┐рдд
рдорд╛рд╕реНрдХ рдХреЗрд▓реЗрд▓реЗ
рд╡реНрдпрд╛рдкреНрддреА

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

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рдЖрддрд╛ рдЖрдордЪреЗ рдЕрдкрдбреЗрдЯ рдХрд░реВрдпрд╛ .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

рдпреЗрдереЗ рдЖрдореНрд╣реА qbec рд╕рд╛рдареА рдЕрдиреЗрдХ рдирд╡реАрди рдкрд░реНрдпрд╛рдп рд╕рдХреНрд╖рдо рдХреЗрд▓реЗ рдЖрд╣реЗрдд:

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

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

рдЖрдгрд┐ рдирдВрддрд░ рдЧрд┐рдЯ рдкреБрд╢ рдЖрдордЪреЗ рдЕрд░реНрдЬ рдХрд╕реЗ рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд рддреЗ рдЖрдореНрд╣реА рдкрд╛рд╣реВ:

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

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"

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдЖрдореНрд╣реА рдПрдХ рдзрд╛рдЧрд╛ рдЬреЛрдбрд▓рд╛ рдЖрд╣реЗ рдорд╛рд╕реНрдЯрд░ ╨║ рд░реЗрдлрд░реНрд╕ рдиреЛрдХрд▒реНрдпрд╛рдВрд╕рд╛рдареА рдмрд┐рд▓реНрдб_рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЖрдгрд┐ рдЖрдореНрд╣реА рдЖрддрд╛ рд╡рд╛рдкрд░рддреЛ $CI_COMMIT_REF_NAME рддреНрдпрд╛рдРрд╡рдЬреА $CI_COMMIT_TAG, рдореНрд╣рдгрдЬреЗ, рдЖрдореНрд╣реА Git рдордзреАрд▓ рдЯреЕрдЧреНрдЬрдкрд╛рд╕реВрди рдореБрдХреНрдд рдЭрд╛рд▓реЛ рдЖрд╣реЛрдд рдЖрдгрд┐ рдЖрддрд╛ рдЖрдореНрд╣реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реБрд░реВ рдХрд░рдгрд╛рд▒реНрдпрд╛ рдХрдорд┐рдЯ рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╣ рдкреНрд░рддрд┐рдорд╛ рдкреБрд╢ рдХрд░реВ. рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рд╣реЗ рдЯреЕрдЧрд╕рд╣ рджреЗрдЦреАрд▓ рдХрд╛рд░реНрдп рдХрд░реЗрд▓, рдЬреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░-рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреАрд╕рд╣ рд╕рд╛рдЗрдЯрдЪреЗ рд╕реНрдиреЕрдкрд╢реЙрдЯ рдЬрддрди рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓.

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

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

рдпреЗрдереЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рдбрд╛рдпрдЬреЗрд╕реНрдЯ рдкреНрд░рддрд┐рдорд╛ рдЬрддрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХрдирд┐рдХреЛрдЪреНрдпрд╛ рдХреНрд╖рдорддреЗрджреНрд╡рд╛рд░реЗ рдорджрдд рдХреЗрд▓реА рдЬрд╛рдИрд▓ (рдкрд░реНрдпрд╛рдп --рдбрд╛рдпрдЬреЗрд╕реНрдЯ-рдлрд╛рдЗрд▓)
рдордЧ рдЖрдореНрд╣реА рд╣реА рдлрд╛рдИрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВ рдЖрдгрд┐ рддреИрдирд╛рддреАрдЪреНрдпрд╛ рд╡реЗрд│реА рддреА рд╡рд╛рдЪреВ.

рдЪрд▓рд╛ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░реВрдпрд╛ deploy/website/environments/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',
    },
  },
}

рдкреВрд░реНрдг рдЭрд╛рд▓реЗ, рдЖрддрд╛ рдХреЛрдгрддреАрд╣реА рдХрдорд┐рдЯ рдЗрди рдХрд░рд╛ рдорд╛рд╕реНрдЯрд░ рд╕рд╛рдареА рдбреЙрдХрд░ рдЗрдореЗрдЬрдЪреНрдпрд╛ рдмрд┐рд▓реНрдбрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рддреЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ, рдЖрдгрд┐ рдирдВрддрд░ рддреЗ Kubernetes рд╡рд░ рддреИрдирд╛рдд рдХрд░рд╛.

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

рдЖрдореНрд╣реА рдирдВрддрд░ рддрдкрд╛рд╕реВ рдЧрд┐рдЯ рдкреБрд╢ рдЖрдкрдг рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рдкрд╛рд╣рд┐рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ:

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рддрддреНрд╡рддрдГ, рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢рд╕рд╣ рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░ рдкреБрдиреНрд╣рд╛ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдЬреЛрдкрд░реНрдпрдВрдд, рдЕрд░реНрдерд╛рддрдЪ, рддреНрдпрд╛рдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рдмрджрд▓рд▓реЗрд▓реЗ рдирд╛рд╣реА, рдЪрд▓рд╛ рддреНрдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░реВрдпрд╛. .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/**/*

рдмрджрд▓ рдордзреАрд▓ рдмрджрд▓рд╛рдВрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓ deploy/gitlab-runner/ рдЖрдгрд┐ рдЬрд░ рдХрд╛рд╣реА рдЕрд╕реЗрд▓ рддрд░рдЪ рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрд▓

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

рдЧрд┐рдЯ рдкреБрд╢, рд╣реЗ рдЙрддреНрддрдо рдЭрд╛рд▓реЗ:

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

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

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, рддреЗрдереЗ рдПрдХ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг:

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 рд╕рд╛рдареА рдПрдХ рдирд╡реАрди рдкрд░реНрдпрд╛рдп рдкрд╛рд╣рддреЛ: --app-рдЯреЕрдЧ тАФ рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рдЙрдкрдпреЛрдЬрд┐рдд рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдирд╛ рдЯреЕрдЧ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдлрдХреНрдд рдпрд╛ рдЯреЕрдЧрдордзреНрдпреЗ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ; рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рд╕рдВрд╕рд╛рдзрдиреЗ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдЖрдгрд┐ рдирд╖реНрдЯ рдХрд░рддрд╛рдирд╛, qbec рдлрдХреНрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрд▓.
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрдирд╛рд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдлрдХреНрдд рддреЗрдЪ рдкреБрдирд░реНрд╡рд╛рдкрд░ рдХрд░реВ рд╢рдХрддреЛ.

рдпреЗрдереЗ рдЖрдкрдг рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рддреЛ qbec рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд▓рд╛рдЧреВ рдХрд░рд╛, рдРрд╡рдЬреА qbec рдбреАрдлреЙрд▓реНрдЯ рд▓рд╛рдЧреВ рдХрд░рд╛ - рд╣рд╛рдЪ рдХреНрд╖рдг рдЖрд╣реЗ рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рддреАрд▓ рдлрд░рдХрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ (рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЖрдгрд┐ рдбреАрдлреЙрд▓реНрдЯ):

рдЬреЛрдбреВрдпрд╛ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдордзреНрдпреЗ рд╡рд╛рддрд╛рд╡рд░рдг deploy/website/qbec.yaml

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

рдордЧ рдЖрдореНрд╣реА рддреЗ рдШреЛрд╖рд┐рдд рдХрд░реВ deploy/website/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

рдЖрдгрд┐ рддреНрдпрд╛рдд рд╕рд╛рдиреБрдХреВрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд▓рд┐рд╣рд╛ deploy/website/environments/review.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',
    },
  },
}

рдЪрд▓рд╛ jobu рд╡рд░ рджреЗрдЦреАрд▓ рдЬрд╡рд│реВрди рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛ рдерд╛рдВрдмрд╛_рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди, рдЬреЗрд╡реНрд╣рд╛ рд╢рд╛рдЦрд╛ рд╣рдЯрд╡рд┐рд▓реА рдЬрд╛рдИрд▓ рддреЗрд╡реНрд╣рд╛ рддреЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдореНрд╣рдгреВрди рдЧрд┐рдЯрд▓реЕрдм рдЪреЗрдХрдЖрдЙрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рдирдпреЗ рдореНрд╣рдгреВрди рддреА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдИрд▓ GIT_STRATEGY: рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА, рдирдВрддрд░ рдЖрдореНрд╣реА рдХреНрд▓реЛрди рдХрд░рддреЛ рдорд╛рд╕реНрдЯрд░- рд╢рд╛рдЦрд╛ рдЖрдгрд┐ рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд╣рдЯрд╡рд╛.
рд╣реЗ рдереЛрдбреЗ рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрдгрд╛рд░реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдорд▓рд╛ рдЕрдЬреВрди рд╕реБрдВрджрд░ рдорд╛рд░реНрдЧ рд╕рд╛рдкрдбрд▓рд╛ рдирд╛рд╣реА.
рдкрд░реНрдпрд╛рдпреА рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рд╣реЙрдЯреЗрд▓рдЪреНрдпрд╛ рдиреЗрдорд╕реНрдкреЗрд╕рд╡рд░ рддреИрдирд╛рдд рдХрд░рдгреЗ, рдЬреЗ рдиреЗрд╣рдореА рдкреВрд░реНрдгрдкрдгреЗ рдирд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

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

рдЧрд┐рдЯ рдкреБрд╢, git checkout -b рдЪрд╛рдЪрдгреА, git рдкреБрд╢ рдореВрд│ рдЪрд╛рдЪрдгреА, рддрдкрд╛рд╕рд╛:

Gitlab рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

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

рдпреЗрдереЗ рдореА рддрд╛рдмрдбрддреЛрдм рд╕реНрдкрд╖реНрдЯ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдкреНрд░рдХрд▓реНрдкрд╛рддреАрд▓ рдХреЛрдгрддрд╛рд╣реА рд╡рд┐рдХрд╛рд╕рдХ рд╢рд╛рдЦрд╛ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ, рддреЛ рдмрджрд▓реВ рджреЗрдЦреАрд▓ рд╢рдХрддреЛ .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"

рдЧрд┐рдЯ рдкреБрд╢, рдЖрдгрд┐ рддрдкрд╛рд╕рд╛:

рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЕреЕрдк рдмрдЯрдгрд╛рдЪрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

рдХрд╛рдо рдЭрд╛рд▓реЗ!

рдкреНрд░рдХрд▓реНрдк рд╕реНрд░реЛрдд:

рддреБрдордЪреЗ рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдЖрд╡рдбрд▓реЗ рдЕрд╕реЗрд▓ Kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рдкрд╣рд╛

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛