Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

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

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

рдореИрд▓реЗ рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ, рддрд░ рдкреВрд░реНрдг рд░реВрдкрдорд╛ Gitlab CI рд░ рдирд┐: рд╢реБрд▓реНрдХ рдЙрдкрдХрд░рдгрд╣рд░реВрдорд╛ рдмрдирд╛рдЗрдПрдХреЛ рдЫ рдЬреБрди рдо рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреБред рдЖрдЬ рдо рдЕрдиреНрддрдорд╛ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдмрддрд╛рдЙрдиреЗрдЫреБред

рд▓реЗрдЦрд▓реЗ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрд▓рдлрд▓ рдЧрд░реНрдиреЗрдЫ рдЬрд╕реНрддреИ:
рд╣реНрдпреВрдЧреЛ, qbec, рдХрдирд┐рдХреЛ, git-crypt ╨╕ GitLab рд╕реАрдЖрдИ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдирд┐рд░реНрдорд╛рдг рд╕рдВрдЧред

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

  1. рд╣реНрдпреБрдЧреЛрд▓рд╛рдИ рднреЗрдЯреНрдиреБрд╣реЛрд╕реН
  2. Dockerfile рддрдпрд╛рд░реА рдЧрд░реНрджреИ
  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 submodule:

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. рдХрдирд┐рдХреЛ рдЪрд┐рдиреНрдиреЗ

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

рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди, рдХреЗрд╡рд▓ рдХрдиреНрдЯреЗрдирд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рдХрдирд┐рдХреЛ рдХрд╛рд░реНрдпрдХрд╛рд░реА рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рд▓рдХреЛ рдирд┐рд░реНрдорд╛рдг рд╕рдиреНрджрд░реНрдн рдкрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН; рдпреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдкрдирд┐ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдбрдХрд░ рдорд╛рд░реНрдлрдд:

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, рдЬрд╣рд╛рдБ рдпрд╕рд▓реЗ рдЙрдиреАрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдХрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рднрдиреЗрд░ рднрдиреНрдЫред

рдЕрд░реНрдХреЛ рд╣рд╛рдореА рджреБрдИ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВ рджреЗрдЦреНрдЫреМрдВ:

  • рдШрдЯрдХ / - рд╣рд╛рдореНрд░реЛ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ manifests рдпрд╣рд╛рдБ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫ; рддрд┐рдиреАрд╣рд░реВ 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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

рдпрд╕ рдлрд╛рдЗрд▓рдорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдХреИрдЪреЛрдЯрд┐ рддреАрдирд╡рдЯрд╛ Kubernetes рд╕рдВрд╕реНрдерд╛рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рдпреА рд╣реБрдиреН: рддреИрдирд╛рде, рд╕реЗрд╡рд╛ ╨╕ рдЖрдХреНрд░рд╛рдордХред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЪрд╛рд╣реЗрдХреЛ рднрдП, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХрд╣рд░реВрдорд╛ рд░рд╛рдЦреНрди рд╕рдХреНрдЫреМрдВ, рддрд░ рдпрд╕ рдЪрд░рдгрдорд╛ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реБрдиреЗрдЫред

рд╡рд┐рдиреНрдпрд╛рд╕ jsonnet рдирд┐рдпрдорд┐рдд json рд╕рдБрдЧ рдзреЗрд░реИ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫ, рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдирд┐рдпрдорд┐рдд json рдкрд╣рд┐рд▓реЗ рдиреИ рдорд╛рдиреНрдп jsonnet рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╕реБрд░реБрдорд╛ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЕрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рд╣реБрди рд╕рдХреНрдЫред yaml2json рддрдкрд╛рдИрдВрдХреЛ рд╕рд╛рдорд╛рдиреНрдп yaml рд▓рд╛рдИ json рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди, рд╡рд╛, рдпрджрд┐ рддрдкрд╛рдИрдВрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдорд╛ рдХреБрдиреИ рдЪрд░ рд╕рдорд╛рд╡реЗрд╢ рдЫреИрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдирд┐рдпрдорд┐рдд yaml рдХреЛ рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛ jsonnet рдо рддрдкрд╛рдИрдХреЛ рд╕рдореНрдкрд╛рджрдХрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫреБ

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

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

рд╣рд╛рдореАрд▓реЗ рдХреЗ рдкрд╛рдпреМрдВ рднрдиреЗрд░ рд╣реЗрд░реНрди, рджреМрдбреМрдВ:

qbec show default

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

рд░рд╛рдореНрд░реЛ, рдЕрдм рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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- рдзрд╛рд╡рдХ Kubernetes рдорд╛ рд╕реАрдзрд╛ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рднрд╛рдЧ рдХреЛ рд░реВрдк рдорд╛ред

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

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

рдердкрд┐рдПрдХреЛ рдзрд╛рд╡рдХрдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

рдХреЗ рдпреЛ рд╕рд░рд▓ рдЫ? - рд╣реЛ, рдпреЛ рдПрдХрджрдо рд╕рд░рд▓ рдЫ! рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдзрд╛рд╡рдХрд╣рд░реВ рджрд░реНрддрд╛ рдЧрд░реНрди рдЕрдм рдХреБрдиреИ рдЭрдиреНрдЭрдЯ рдЫреИрди, рдЕрдмрджреЗрдЦрд┐ рдзрд╛рд╡рдХрд╣рд░реВ рд╕реНрд╡рддрдГ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдирд╖реНрдЯ рд╣реБрдиреЗрдЫрдиреНред

6. QBEC рд╕рдБрдЧ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореАрд▓реЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдкрдЫрд┐ gitlab- рдзрд╛рд╡рдХ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдЕрдВрд╢, рдпреЛ рд╣рд╛рдореНрд░реЛ Git рднрдгреНрдбрд╛рд░рдорд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛред

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

cd deploy
qbec init gitlab-runner
cd gitlab-runner

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

Git submodule рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдЬрдбрд╛рди рдЧрд░реМрдВ:

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

рдЕрдм рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛ / gitlab-рдзрд╛рд╡рдХ рд╣рд╛рдореАрд╕рдБрдЧ 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,
  }
)

рдХреЛ рд▓рд╛рдЧрд┐ рдкрд╣рд┐рд▓реЛ рддрд░реНрдХ рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╣рд╛рдореА рдЪрд╛рд░реНрдЯрдорд╛ рдмрд╛рдЯреЛ рдкрд╛рд╕ рдЧрд░реНрдЫреМрдВ, рддреНрдпрд╕рдкрдЫрд┐ 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. git-crypt рдХреЛ рдкрд░рд┐рдЪрдп

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

рдпрд╕ рд╕рдордпрдорд╛, gitlab-runner рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореНрд░реЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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

рддрд░ Git рдорд╛ рдЧреЛрдкреНрдп рднрдгреНрдбрд╛рд░рдг рд╕реБрд░рдХреНрд╖рд┐рдд рдЫреИрди, рдпреЛ рд╣реЛ? рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд░рд╛рдореНрд░рд░реА рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

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

рдпрд╕рдмрд╛рд╣реЗрдХ, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдпрд╕реНрддреЛ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрддрд╛рдЙрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреИрди git-crypt.

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

рд╕реНрдерд╛рдкрдирд╛ рдкрдЫрд┐ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ git-crypt рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рднрдгреНрдбрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

git crypt init

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ PGP рдХреБрдЮреНрдЬреА рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рддреБрд░реБрдиреНрддреИ рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╣рдпреЛрдЧреАрдХреЛ рд░реВрдкрдорд╛ рдЖрдлреВрд▓рд╛рдИ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рддрдкрд╛рдЗрдБ рд╕рдзреИрдБ рддрдкрд╛рдЗрдБрдХреЛ рдирд┐рдЬреА рдХреБрдЮреНрдЬреА рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпреЛ рднрдгреНрдбрд╛рд░ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ PGP рдХреБрдЮреНрдЬреА рдЫреИрди рд░ рдпреЛ рдЖрд╢рд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрди рднрдиреЗ, рддрдкрд╛рдЗрдБ рдЕрд░реНрдХреЛ рддрд░рд┐рдХрд╛рдорд╛ рдЬрд╛рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреБрдЮреНрдЬреА рдирд┐рд░реНрдпрд╛рдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

git crypt export-key /path/to/keyfile

рдпрд╕рд░реА, рдЬреЛ рдХреЛрд╣реА рдПрдХ рдирд┐рд░реНрдпрд╛рдд рдЫ рдХреБрдЮреНрдЬреА рдлрд╛рдЗрд▓ рдЖрдлреНрдиреЛ рднрдгреНрдбрд╛рд░ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫред

рдпреЛ рд╣рд╛рдореНрд░реЛ рдкрд╣рд┐рд▓реЛ рдЧреЛрдкреНрдп рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛред
рдорд▓рд╛рдИ рд╕рдореНрдЭрд╛рдЙрди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╣рд╛рдореА рдЕрдЭреИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдорд╛ рдЫреМрдВ deploy/gitlab-runner/рдЬрд╣рд╛рдБ рд╣рд╛рдореАрд╕рдБрдЧ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдЫ рд░рд╣рд╕реНрдп/, рдпрд╕рдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рдлрд╛рдЗрд▓рд╣рд░реВ рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реМрдВ, рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рд░рд╣рд╕реНрдп/gitattributes рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рд╕рдВрдЧ:

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

рд╕рд╛рдордЧреНрд░реАрдмрд╛рдЯ рджреЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫ, рд╕рдмреИ рдлрд╛рдЗрд▓рд╣рд░реВ рдорд╛рд╕реНрдХ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН * рдорд╛рд░реНрдлрдд рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реБрдиреЗрдЫ git-crypt, рдзреЗрд░реИ рдмрд╛рд╣реЗрдХ .gitaрд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ

рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдЪрд▓рд╛рдПрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ:

git crypt status -e

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

рдпрддрд┐ рдорд╛рддреНрд░реИ рд╣реЛ, рдЕрдм рд╣рд╛рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рд╣рд╛рдореНрд░рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ:

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

рднрдгреНрдбрд╛рд░ рдмреНрд▓рдХ рдЧрд░реНрди, рдХреЗрд╡рд▓ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

git crypt lock

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

git crypt unlock

8. рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рдмрд╛рдХрд╕ рдЫрд╡рд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

рдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ, рдПрдЙрдЯрд╛ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ dockerfiles/toolbox/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, рддрд░ рддрдкрд╛рдИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯрдЕрдк рдЪрд░рдгрдХреЛ рд╕рдордпрдорд╛ рдпрд╕рдХреЛ рд╡рд░рд┐рдкрд░рд┐ рдЦреЗрд▓реНрди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫред

рд╕рд╛рдереИ, Kubernetes рд╕рдБрдЧ рд╕рдЮреНрдЪрд╛рд░ рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ gitlab-runner рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкреЛрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднреВрдорд┐рдХрд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, 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 рдмреБрдЭрд╛рдЙрдБрдЫ рдирд╛рдо рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреА rbac

рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рднрдпреЛ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ:

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. рддреИрдирд╛рддреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рди

Gitlab-runner рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдЧреЛрдкреНрдп рдХреБрд░рд╛рд╣рд░реВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░ рдХреБрдЮреНрдЬреА рдирд┐рд░реНрдпрд╛рдд рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ 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"

рд░ рдкрдЫреА git рдзрдХреНрдХрд╛ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдХрд╕рд░реА рддреИрдирд╛рдд рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗрд░ рд╣реЗрд░реНрдиреЗрдЫреМрдВ:

рджреЛрд╕реНрд░реЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

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"

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

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

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

рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓рд╛рдИ рдлрд╛рдЗрд▓рдорд╛ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдЫрд╡рд┐ рдмрдЪрдд рдЧрд░реНрди рдХрд╛рдирд┐рдХреЛрдХреЛ рдХреНрд╖рдорддрд╛рд▓реЗ рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ (рд╡рд┐рдХрд▓реНрдк --digest-рдлрд╛рдЗрд▓)
рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпреЛ рдлрд╛рдЗрд▓ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдордпрдорд╛ рдкрдвреНрдиреЗрдЫреМрдВред

рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реМрдВ 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"

рд╣рд╛рдореА рдкрдЫрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗрдЫреМрдВ git рдзрдХреНрдХрд╛ рд╣рд╛рдореАрд▓реЗ рдпреЛ рдЬрд╕реНрддреИ рдХреЗрд╣рд┐ рд╣реЗрд░реНрдиреБ рдкрд░реНрдЫ:

рдорд╛рд╕реНрдЯрд░рдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

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"

git рдзрдХреНрдХрд╛, рддреНрдпреЛ рд░рд╛рдореНрд░реЛ рдЫ:

рдЕрдкрдбреЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

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

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

рдкрд╣рд┐рд▓реЗ, рдХрд╛рдо рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реМрдВ build_website рд╣рд╛рдореНрд░реЛ рдорд╛ 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-tag - рдпрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдбрд┐рдкреНрд▓реЛрдЗрдб рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдЯреНрдпрд╛рдЧ рдЧрд░реНрди рд░ рдпреЛ рдЯреНрдпрд╛рдЧ рднрд┐рддреНрд░ рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ; Kubernetes рдорд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рд░ рдирд╖реНрдЯ рдЧрд░реНрджрд╛, 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',
    },
  },
}

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

рд╣рд╛рдореНрд░рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН:

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

git рдзрдХреНрдХрд╛, git checkout -b рдкрд░реАрдХреНрд╖рдг, git рдкреБрд╢ рдЙрддреНрдкрддреНрддрд┐ рдкрд░реАрдХреНрд╖рдг, рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

Gitlab рдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╡рд╛рддрд╛рд╡рд░рдгрдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

рд╕рдмреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ? - рд░рд╛рдореНрд░реЛ, рд╣рд╛рдореНрд░реЛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдЦрд╛ рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН: git рдЪреЗрдХрдЖрдЙрдЯ рдорд╛рд╕реНрдЯрд░, 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"

git рдзрдХреНрдХрд╛, рд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рд╕рдореАрдХреНрд╖рд╛ рдПрдк рдмрдЯрдирдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ

Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

рдХрд╛рдо рд╕рдХрд┐рдпреЛ!

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

рддрдкрд╛рдЗрдБрдХреЛ рдзреНрдпрд╛рди рдХреЛ рд▓рд╛рдЧреА рдзрдиреНрдпрд╡рд╛рдж, рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рдордирдкрд░реНрдЫ Kubernetes рдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди