
рдирдорд╕реНрддреЗ! рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХрдИ рд╢рд╛рдВрдд рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдбреЛрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВрдиреЗ рдЧрд┐рдЯрд▓реИрдм рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рд╕рд╛рдЗрдЯ kubernetes.io рдереА , рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЬреЗ рдЧрдП рдкреВрд▓ рдХреЗ рд▓рд┐рдП, рд░реЛрдмреЛрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдЯ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ рдФрд░ рдореБрдлреНрдд рдЯреВрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рдерд╛ред рдЖрдЬ рдореИрдВ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдКрдВрдЧрд╛ред
рд▓реЗрдЦ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛:
рд╣реНрдпреВрдЧреЛ , рдХреНрдпреВрдмреЗрдХ , рдХрд╛рдирд┐рдХреЛ , рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЧрд┐рддрд▓рд╛рдм рд╕реАрдЖрдИ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рдеред
рдЕрдВрддрд░реНрд╡рд╕реНрддреБ
- рдкреЗрд╢ рд╣реИ рд╣реНрдпреВрдЧреЛ
- рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛
- рдХрд╛рдирд┐рдХреЛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛
- рдкреЗрд╢ рд╣реИ рдХреНрдпреВрдмреЗрдХ
- рдХреБрдмреЗрд░рдиреЗрддреНрд╕-рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЧрд┐рдЯрд▓рдм-рд░рдирд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛
- рдХреНрдпреВрдмреЗрдХ рдХреЗ рд╕рд╛рде рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреА рддреИрдирд╛рддреА
- рдкреЗрд╢ рд╣реИ рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ
- рдЯреВрд▓рдмреЙрдХреНрд╕ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ
- рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛
- рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрд╡рдЪрд╛рд▓рди
- рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдФрд░ рдзрдХреНрдХрд╛ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг
- рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг
- рдРрдкреНрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ
1. рд╣реНрдпреВрдЧреЛ рдХрд╛ рдкрд░рд┐рдЪрдп
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╣реНрдпреВрдЧреЛ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рд▓реЗрдЦрди рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рд╣реНрдпреВрдЧреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдЬрдирд░реЗрдЯрд░ рд╣реИред
рдЬреЛ рд▓реЛрдЧ рд╕реНрдереИрддрд┐рдХ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрддрд╛рдКрдВрдЧрд╛ред рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд╛рдЗрдЯ рдЗрдВрдЬрдиреЛрдВ рдФрд░ рдХреБрдЫ php рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдордХреНрдЦреА рдкрд░ рдкреГрд╖реНрда рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдереИрддрд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдФрд░ рдереАрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╕рд╛рдЗрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред
рдпрд╣реА рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ html-files рдХрд╛ рдПрдХ рд╕реЗрдЯ рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕реЗ рдмрд╕ рдХрд┐рд╕реА рднреА рд╕рд╕реНрддреЗ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд░реНрдХрд┐рдВрдЧ рд╕рд╛рдЗрдЯ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
рд╣реНрдпреВрдЧреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдо рдирдИ рд╕рд╛рдЗрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ:
hugo new site docs.example.org
рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА:
cd docs.example.org git init
рдЕрдм рддрдХ, рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдкреНрд░рд╛рдЪреАрди рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рдереАрдо, рдПрдХ рдереАрдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рд╕рд┐рд░реНрдл рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдкреНрд░реАрд╕реЗрдЯ рдирд┐рдпрдо рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдПрдХ рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо Learn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдереАрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЗрд╕реЗ рдЧрд┐рдЯ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рд╣реА рд╣рдорд╛рд░реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реЛрдВрдЧреА, рдФрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╡рд┐рд╖рдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реЗрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ рд╣рдореЗрд╢рд╛ рдореВрд▓ рд╕реНрд░реЛрдд рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдбрд░рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред
Config.toml config рдХреЛ рдареАрдХ рдХрд░реЗрдВ:
baseURL = "http://docs.example.org/" languageCode = "en-us" title = "My Docs Site" theme = "learn"
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
hugo server
рдФрд░ http: // localhost: 1313 рдкрд░ / рд╣рдорд╛рд░реА рдирдИ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдЗрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреБрд▓рд╛ рдкреГрд╖реНрда рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ!
рдЪрд▓рд┐рдП рдХрдВрдЯреЗрдВрдЯ / _index.md рдореЗрдВ рдПрдХ рдХрд╡рд░ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
# My docs site ## Welcome to the docs! You will be very smart :-)
рдирдП рдмрдирд╛рдП рдЧрдП рдкреЗрдЬ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЪрд▓рд╛рдПрдВ:
hugo
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рд╣реЛрдЧреАред
рд╣рд╛рдБ, рд╡реИрд╕реЗ, рддреБрд░рдВрдд рдЗрд╕реЗ .gitignore рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
echo /public > .gitignore
рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
git add . git commit -m "New site created"
2. рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛
рдпрд╣ рд╣рдорд╛рд░реЗ рднрдВрдбрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдореИрдВ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:
. тФЬтФАтФА deploy тФВ тФЬтФАтФА app1 тФВ тФФтФАтФА app2 тФФтФАтФА dockerfiles тФЬтФАтФА image1 тФФтФАтФА image2
- dockerfiles / - Dockerfiles рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ docker рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рддреИрдирд╛рдд / - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрде dockerfiles / рд╡реЗрдмрд╕рд╛рдЗрдЯ / Dockerfile рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ Dockerfile рдмрдирд╛рдПрдВрдЧреЗ
FROM alpine:3.11 as builder ARG HUGO_VERSION=0.62.0 RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin ADD . /src RUN hugo -s /src FROM alpine:3.11 RUN apk add --no-cache darkhttpd COPY --from=builder /src/public /var/www ENTRYPOINT [ "/usr/bin/darkhttpd" ] CMD [ "/var/www" ]
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдореЗрдВ рджреЛ FROM рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо docker рдЫрд╡рд┐ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдХреЗрд╡рд▓ darkhttpd (рдПрдХ рд╣рд▓реНрдХрд╛ HTTP рд╕рд░реНрд╡рд░) рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / - рд╣рдорд╛рд░реА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рд╛рдЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреАред
рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
git add dockerfiles/website git commit -m "Add Dockerfile for website"
3. рдХрд╛рдирд┐рдХреЛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛
Docker рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ kaniko рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП docker рдбреЗрдореЙрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдХрд┐рд╕реА рднреА рдорд╢реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреИрд╢ рдХреЛ рд╕реАрдзреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдкреВрд░реНрдг рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред
рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдирд┐рдХреЛ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ, docker рджреНрд╡рд╛рд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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
рдЬрд╣рд╛рдБ рд░рдЬрд┐рд╕реНрдЯреНрд░реА .itlab.com/kvaps/docs.example.org/website рдЖрдкрдХреА рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо рд╣реИ, рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрд╡рддрдГ рдбреЙрдХрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Thecache рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдкрдХреЛ docker рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрд░рддреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ редgitlab.com/kvaps/docs.example.org/website/cache , рд▓реЗрдХрд┐рди рдЖрдк .cache- рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдФрд░ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд░реЗрдкреЛ ред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдбреЙрдХ-рд░рдЬрд┐рд╕реНрдЯреНрд░реА
4. рдХреНрдпреВрдмреЗрдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд
рдХреНрдпреВрдмреЗрдХ рдПрдХ рддреИрдирд╛рддреА рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЦреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ Jsonnet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорддрднреЗрджреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рднреА рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬреАрдЖрдИрдЯреА рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХреНрдпреВрдмреЗрдХ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдХреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрди рд╡рд┐рднрд┐рдиреНрди рдореНрдпреВрдЯреЗрд╢рдиреЛрдВ рд╕рд╣рд┐рдд рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рдЪрд╛рд░реНрдЯрдореНрдпреВрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЖрдк рдЪрд╛рд░реНрдЯ рдХреЛ рд╕реАрдзреЗ рдЧрд┐рдЯ рд╕реЗ рд╕реНрдЯреЛрд░ рдФрд░ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдЬрдЧрд╣ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╣рдо рд╕рднреА рддреИрдирд╛рддреА рдХреЛ рддреИрдирд╛рддреА / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:
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: {}
рдпрд╣рд╛рдВ рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдХреНрдпреВрдмреЗрдХ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдпрд╛ рдФрд░ рд╕рд░реНрд╡рд░ рдПрдбреНрд░реЗрд╕, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди kubeconfig рд╕реЗ рдирд╛рдо рд╕реНрдерд╛рди рд▓рд┐рдпрд╛ред
рдЕрдм, рдЬрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреНрдпреВрдмреЗрдХ рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдорд╕реНрдерд╛рди рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднреЛрдВ рдФрд░ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЗ рд╕рднреА рд╡рд╛рддрд╛рд╡рд░рдг qbec.yaml рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рдФрд░ params.libsonnet рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдЧреЗ рд╣рдо рджреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рджреЗрдЦрддреЗ рд╣реИрдВ:
- рдШрдЯрдХ / - рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдпрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдВрдЧреА, рдЙрдиреНрд╣реЗрдВ рдЬреЛрдВрд╕рдиреЗрдЯ рдФрд░ рд╕рд╛рдзрд╛рд░рдг рдпрд╛рдореНрд▓-рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рд╡рд╛рддрд╛рд╡рд░рдг / - рдпрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд░ (рдорд╛рдкрджрдВрдбреЛрдВ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ:
- рд╡рд╛рддрд╛рд╡рд░рдг / 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', }, }, }
рд╣рдо рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ / рд╡реЗрдмрд╕рд╛рдЗрдЯ.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 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рд╕рд╛рдорд╛рдиреНрдп yaml рдХреЛ json рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП yaml2json рдЬреИрд╕реА рдСрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдХреЛрдИ рдЪрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдзрд╛рд░рдг рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Jsonnet рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдЖрдкрдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vim рдХреЗ рд▓рд┐рдП рдПрдХ vim-jsonnet рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ jsonnet fmt рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕реЗ jsonnet рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рд╣рдо рддреИрдирд╛рддреА рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреНрдпрд╛ рд╣реБрдЖ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд░реЗрдВрдЧреЗ:
qbec show default
рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЖрдк рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдпрдо рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред
рдареАрдХ рд╣реИ, рдЕрдм рдЖрд╡реЗрджрди рдХрд░реЗрдВ:
qbec apply default
рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рдЖрдк рд╣рдореЗрд╢рд╛ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреВрдмреЗрдХ рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛, рд╡рд╛рдИ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдЖрдк рдЕрдкрдиреЗ рдЗрд░рд╛рджреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣реЛ рдЧрдпрд╛, рдЕрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдбреЙрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ!
рдпрджрд┐ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
qbec diff default
рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд░реНрддрдорд╛рди рддреИрдирд╛рддреА рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ
рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
cd ../.. git add deploy/website git commit -m "Add deploy for website"
5. рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЧрд┐рдЯрд▓рдм-рд░рдирд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛
рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдореИрдВ рдПрдХ рдкреВрд░реНрд╡-рддреИрдпрд╛рд░ рдорд╢реАрди (рдПрд▓рдПрдХреНрд╕рд╕реА рдХрдВрдЯреЗрдирд░) рдкрд░ рд╢реЗрд▓ рдпрд╛ рдбреЙрдХ-рдПрдЧреНрдЬрд╝рд┐рдХреНрдпреВрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдРрд╕реЗ рдзрд╛рд╡рдХ рдереЗ рдЬреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╣рдорд╛рд░реЗ рд╣рд┐рдЯрд▓реИрдм рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдереЗред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбреЙрдХрдЯрд░ рдЪрд┐рддреНрд░ рдПрдХрддреНрд░ рдХрд┐рдПред
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╕рдмрд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд╡рдХреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдФрд░ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЛ рд╕реАрдзреЗ рдЧреАрддрд╛рд▓рд╛рдм-рдзрд╛рд╡рдХ рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗред
Gitlab рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ gitlab-runner рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдЯреЛрдХрди рдкрддрд╛ рдХрд░реЗрдВ -> 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 - рдзрд╛рд╡рдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдирд┐рд╖реНрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдбреНрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдзрд╛рд╡рдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдзрд╛рд╡рдХ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреЛрдбрд╝рд╛ рдзрд╛рд╡рдХ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреНрдпрд╛ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ? - рд╣рд╛рдБ, рдЗрддрдирд╛ рдЖрд╕рд╛рди! рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдзрд╛рд╡рдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдФрд░ рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рд╣реИ, рдЕрдм рд╕реЗ рдзрд╛рд╡рдХреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
6. QBEC рдХреЗ рд╕рд╛рде рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдХреА рддреИрдирд╛рддреА
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рднрд╛рдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд╣рдо рдЗрд╕реЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдЧрд┐рдЯрд▓рдм-рд░рдирд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ:
cd deploy qbec init gitlab-runner cd gitlab-runner
рдЗрд╕ рдмрд╛рд░ рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рддреИрдпрд╛рд░ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рд▓реЗрдВред рдХреНрдпреВрдмреЗрдХ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЗрд▓рд┐рдд рдЪрд╛рд░реНрдЯ рдХреЛ рд╕реАрдзреЗ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕реЗ рдЧрд┐рдЯ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд▓рдЧ рдХрд░реЗрдВ:
git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner
рдЕрдм рд╡реЗрдВрдбрд░ / рдЧрд┐рдЯреНрд▓рд╛рдм-рд░рдирд░ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдкреВрд░реНрдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА https://github.com/helm/charts
рдЖрдЗрдП рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ / gitlab-runner.jsonnet рдШрдЯрдХ :
local env = { name: std.extVar('qbec.io/env'), namespace: std.extVar('qbec.io/defaultNs'), }; local p = import '../params.libsonnet'; local params = p.components.gitlabRunner; std.native('expandHelmTemplate')( '../vendor/gitlab-runner', params.values, { nameTemplate: params.name, namespace: env.namespace, thisFile: std.thisFile, verbose: true, } )
рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХрд╣реЗрд▓реНрдореЗрдЯрдкреНрд▓реЗрдЯ рд╣рдо рдЪрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ params.values , рдЬрд┐рд╕реЗ рд╣рдо рдкрд░реНрдпрд╛рд╡рд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде
- nameTemplate - рд░рд┐рд▓реАрдЬрд╝ рдирд╛рдо
- namespace - namespace рдиреЗ helm рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛
- рдпрд╣ рдлрд╝рд╛рдЗрд▓ - рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ
- рд╡рд░реНрдмреЛрдЬрд╝ - рдЪрд╛рд░реНрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкрддрд╡рд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдорд╛рдВрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ
рдЕрдм рд╣рдо рд╡рд╛рддрд╛рд╡рд░рдг / рдмреЗрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред
local secrets = import '../secrets/base.libsonnet'; { components: { gitlabRunner: { name: 'gitlab-runner', values: { gitlabUrl: 'https://gitlab.com/', rbac: { create: true, }, runnerRegistrationToken: secrets.runnerRegistrationToken, }, }, }, }
RunnerRegistrationToken рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд╣рдо рдмрд╛рд╣рд░реА рд░рд╣рд╕реНрдпреЛрдВ / рдЖрдзрд╛рд░.рд▓рд┐рдмреНрд╕рдирдиреЗрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ , рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рдПрдБ:
{ runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc', }
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
qbec show default
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдХреЛ рд╣реЗрд▓реНрдо рд░рд┐рд▓реАрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
helm uninstall gitlab-runner
рдФрд░ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпреВрдмреЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
qbec apply default
7. рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдЪрдп
рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓, рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
. тФЬтФАтФА components тФВ тФЬтФАтФА gitlab-runner.jsonnet тФЬтФАтФА environments тФВ тФЬтФАтФА base.libsonnet тФВ тФФтФАтФА default.libsonnet тФЬтФАтФА params.libsonnet тФЬтФАтФА qbec.yaml тФЬтФАтФА secrets тФВ тФФтФАтФА base.libsonnet тФФтФАтФА vendor тФФтФАтФА gitlab-runner (submodule)
рд▓реЗрдХрд┐рди Git рдореЗрдВ рд░рд╣рд╕реНрдп рд░рдЦрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░ рдПрдХрд▓ рдЪрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЖрдк рдХреНрдпреВрдмреЗрдХ рдФрд░ рдЕрдкрдиреЗ рд╕реАрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рд╣рд╕реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрди рд╕рднреА рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реЗ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рдкрд╛рдКрдВрдЧрд╛ред
рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХреА рддреБрд▓рдирд╛, рд╡рд┐рд▓рдп рдФрд░ рд╕рдорд╛рдзрд╛рди рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдЧрд┐рдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд░рддреЗ рдереЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧрд┐рдЯ-рдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рд╣рдореЗрдВ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
git crypt init
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ PGP рдХреБрдВрдЬреА рд╣реИ, рддреЛ рдЖрдк рддреБрд░рдВрдд рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдпреЛрдЧреА рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
git-crypt add-gpg-user kvapss@gmail.com
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рднрдВрдбрд╛рд░ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ PGP рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдХреБрдВрдЬреА рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
git crypt export-key /path/to/keyfile
рдЗрд╕ рддрд░рд╣, рдПрдХ рдирд┐рд░реНрдпрд╛рдд рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЖрдкрдХреЗ рднрдВрдбрд╛рд░ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХреЗрдЧрд╛ред
рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рд░рд╣рд╕реНрдп рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рддреИрдирд╛рдд / gitlab-runner / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд╣рд╕реНрдп / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИрдВ, рдЪрд▓реЛ рдЗрд╕рдореЗрдВ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд░рд╣рд╕реНрдп / .itattributes рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:
* filter=git-crypt diff=git-crypt .gitattributes !filter !diff
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдордЧреНрд░реА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдирдХрд╛рдм * рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдЧреАрддрд╛ -рдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓реЗрдВрдЧреАред
рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛рдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
git crypt status -e
рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕рдХреНрд╖рдо рд╣реИ
рдмрд╕, рдЕрдм рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
cd ../.. git add . git commit -m "Add deploy for gitlab-runner"
рднрдВрдбрд╛рд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:
git crypt lock
рдФрд░ рдлрд┐рд░ рд╕рднреА рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдПрдХ рднрдВрдбрд╛рд░ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд░реЗрдВ:
git crypt unlock
рдПрдХ рдЯреВрд▓рдмреЙрдХреНрд╕ рдЫрд╡рд┐ рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдРрд╕реА рдЫрд╡рд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ gitlab рдзрд╛рд╡рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдбреЙрдХрдлрд╛рдЗрд▓реНрд╕ / рдЯреВрд▓рдмреЙрдХреНрд╕ / рдбреЙрдХрдлреЗрд░рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ :
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
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ рд╣рдо рдЙрди рд╕рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХреБрдмреНрдЬрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ , рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯрдЕрдк рдЪрд░рдг рдореЗрдВ рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд▓реА рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, gitlab-runner рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкрд░ рдЬрд╛рдПрдВ:
cd deploy/gitlab-runner
рдФрд░ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ / rbac.jsonnet :
local env = { name: std.extVar('qbec.io/env'), namespace: std.extVar('qbec.io/defaultNs'), }; local p = import '../params.libsonnet'; local params = p.components.rbac; [ { apiVersion: 'v1', kind: 'ServiceAccount', metadata: { labels: { app: params.name, }, name: params.name, }, }, { apiVersion: 'rbac.authorization.k8s.io/v1', kind: 'Role', metadata: { labels: { app: params.name, }, name: params.name, }, rules: [ { apiGroups: [ '*', ], resources: [ '*', ], verbs: [ '*', ], }, ], }, { apiVersion: 'rbac.authorization.k8s.io/v1', kind: 'RoleBinding', metadata: { labels: { app: params.name, }, name: params.name, }, roleRef: { apiGroup: 'rbac.authorization.k8s.io', kind: 'Role', name: params.name, }, subjects: [ { kind: 'ServiceAccount', name: params.name, namespace: env.namespace, }, ], }, ]
рд╣рдо рд╡рд╛рддрд╛рд╡рд░рдг / 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', }, }, }
рдиреЛрдЯ $ .compitters.rbac.name rbac рдШрдЯрдХ рдХрд╛ рдирд╛рдо рдмрддрд╛рддрд╛ рд╣реИ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
qbec diff default
рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
qbec apply default
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
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. рдЯреИрдЧреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ рд╣рдо рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде .itlab-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
рдЬрдм рднреА рд╣рдореЗрдВ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣рдо рдЯреИрдЧ рд▓рдЯрдХрд╛ рджреЗрдВрдЧреЗред Docker рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЯреИрдЧ Git рдЯреИрдЧ рд╕реЗ рдмрдВрдзрд╛ рд╣реЛрдЧрд╛ред рдирдП рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢ рдЗрд╕ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред
Git push --tags рдЪрд▓рд╛рдПрдВ , рдФрд░ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреЗрдЦреЗрдВ:
рдкрд╣рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдбреЙрдХ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдирдП рдЯреИрдЧ рдХреЛ рдкреБрд░рд╛рдиреЗ рдХрдорд┐рдЯреНрд╕ рдХреЛ рднреА рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдРрд╕реЗ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдкреБрд░рд╛рдиреЗ рд╡рд░реНрдЬрди рдХреА рддреИрдирд╛рддреА рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рдбреЙрдХрдЯрд░-рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдЯреИрдЧ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддреИрдирд╛рддреА рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣рд╛рд░реНрдбрдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд┐рд╡рд░реНрдЯ рдорд╛рд╕реНрдЯрд░ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд░реЛрд▓рдмреИрдХ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
10. рддреИрдирд╛рддреА рд╕реНрд╡рдЪрд╛рд▓рди
рдЕрдкрдиреЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдХреЛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ CI рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
git crypt export-key /tmp/docs-repo.key base64 -w0 /tmp/docs-repo.key; echo
Gitlab рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ:
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рдЪрд░
:
.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:
- --root some/app тАФ
- --force:k8s-context __incluster__ тАФ , gtilab-runner. , qbec Kubernetes- kubeconfig
- --wait тАФ qbec , Ready exit-code.
- --yes тАФ Are you sure? .
:
git add .gitlab-ci.yml git commit -m "Automate deploy"
git push :
11. push master
, . digest master-.
: website push master , 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"
, master refs build_website $CI_COMMIT_REF_NAME $CI_COMMIT_TAG , Git . , , docker-registry.
docker- , Kubernetes, , .
--vm:ext-str digest="$DIGEST" qbec тАФ jsonnet. . , , , .
Kaniko digest ( --digest-file )
.
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', }, }, }
, master docker- website , Kubernetes.
:
git add . git commit -m "Configure dynamic build"
, git push - :
gitlab-runner push, , , , .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/**/*
changes deploy/gitlab-runner/
:
git add .gitlab-ci.yml git commit -m "Reduce gitlab-runner deploy"
git push , - :
12. Dynamic environments
.
build_website .gitlab-ci.yml , only , 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 , environment :
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 prod .
:
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
push master preview .
qbec: --app-tag тАФ , Kubernetes qbec .
review, .
qbec apply review , qbec apply default тАФ (review default):
review 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 :
stop_review , gitlab checkout GIT_STRATEGY: none , master - review .
, .
review , .
:
git add . git commit -m "Enable automatic review"
git push , git checkout -b test , git push origin test , :
? тАФ , : git checkout master , git push origin :test , environment .
, , .gitlab-ci.yml .
protected-, master , .
13. Review Apps
Review Apps , .
, .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 push , :
Job is done!
:
, 