
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΠ°ΠΏΠΎΡΠ»Π΅Π΄ΡΠΊ ΠΈΠ·Π»ΡΠ·ΠΎΡ Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΠΊΡΠΎ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠ° ΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π² Kubernetes. Π ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΠΈΡ Π΄Π° ΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°Ρ Ρ GitLab, Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΠΌΡ ΠΈ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π΄Π° Π½Π°ΡΡΡΠΎΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½.
ΠΠ΄ΡΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΡΠ°Π·ΠΈ ΡΠ°Π±ΠΎΡΠ° Π΅ ΡΠ΅Π±ΡΠ°ΠΉΡΡΡ , ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ, Π° Π·Π° Π²ΡΡΠΊΠΎ Π²Π½Π΅ΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ°Π½Π΅ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, ΡΠΎΠ±ΠΎΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ°ΠΉΡΠ° Ρ Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π»ΠΈΠ½ΠΊ Π·Π° ΠΏΡΠ΅Π³Π»Π΅Π΄.
ΠΠΏΠΈΡΠ°Ρ ΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄Ρ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ ΠΎΡ Π½ΡΠ»Π°ΡΠ°, Π½Π°ΠΏΡΠ»Π½ΠΎ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° GitLab CI ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΠΌ ΡΠ²ΠΈΠΊΠ½Π°Π» Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes. ΠΠ½Π΅Ρ, Π½Π°ΠΊΡΠ°Ρ, ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π·Π° ΡΡΡ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ:
Hugo, qbec, kaniko, git-crypt ΠΈ GitLab CI ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ.
Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅
1. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ Hugo
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΡ Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Hugo. Hugo Π΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ ΡΡΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ, ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΡΡ . Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΡΠ΅Π± ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ PHP, ΠΊΠΎΠΈΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° Π»Π΅ΡΠΎ ΠΏΡΠΈ Π·Π°ΡΠ²ΠΊΠ° ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ ΡΠ°Π±ΠΎΡΡΡ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ. Π’Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Markdown ΡΠΎΡΠΌΠ°Ρ ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ Π² Π½Π°ΠΏΡΠ»Π½ΠΎ Π³ΠΎΡΠΎΠ² ΡΠ°ΠΉΡ.
Π’ΠΎΠ΅ΡΡ, Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΡΡΡΠΊΡΡΡΠ° ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ HTML ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠΊΠ°ΠΊΡΠ² Π΅Π²ΡΠΈΠ½ Ρ ΠΎΡΡΠΈΠ½Π³ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Ρ ΡΠ°ΠΉΡ.
Hugo ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½ΠΎΠ² ΡΠ°ΠΉΡ:
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Π Π½Π° Π°Π΄ΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π½Π°ΡΠΈΡ Π½ΠΎΠ²ΠΎΡΡΠ·Π΄Π°Π΄Π΅Π½ ΡΠ°ΠΉΡ, Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ!
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π·Π°Π³Π»Π°Π²Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π² content/_index.md:
# My docs site
## Welcome to the docs!
You will be very smart :-)Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° ΡΠΎΠΊΡ-ΡΠΎ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°

ΠΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅:
hugoΠ‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° public/ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π²Π°ΡΠΈΡ ΡΠ°ΠΉΡ.
ΠΠ°, ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π½Π΅ΠΊΠ° Π²Π΅Π΄Π½Π°Π³Π° Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² .gitignore:
echo /public > .gitignoreΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .
git commit -m "New site created"2. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Dockerfile
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
.
βββ deploy
β βββ app1
β βββ app2
βββ dockerfiles
βββ image1
βββ image2- dockerfiles/ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ Dockerfiles ΠΈ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ docker-ΠΎΠ±ΡΠ°Π·ΠΈ.
- deploy/ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π·Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½Π°ΡΠΈΡΡ ΠΏΡΡΠ²ΠΈ Dockerfile ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎ ΠΏΡΡΡ dockerfiles/website/Dockerfile
FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src
FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡΠ΅, Dockerfile ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²Π° FROM, ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΎ Π½Π΅Π½ΡΠΆΠ½ΠΎ ΠΎΡ ΡΠΈΠ½Π°Π»Π½ΠΈΡ docker-ΠΎΠ±ΡΠ°Π·.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠΈΠ½Π°Π»Π½ΠΈΡΡ ΠΎΠ±ΡΠ°Π· ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ°ΠΌΠΎ darkhttpd (Π»Π΅ΠΊ HTTP-ΡΠ΅ΡΠ²Π΅Ρ) ΠΈ public/ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠΈΡ ΡΡΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΡΠ°ΠΉΡ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add dockerfiles/website
git commit -m "Add Dockerfile for website"3. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ kaniko
ΠΠ°ΡΠΎ ΡΠ±ΠΎΡΡΠΈΠΊ Π½Π° docker ΠΎΠ±ΡΠ°Π·ΠΈ ΡΠ΅ΡΠΈΡ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ , ΡΡΠΉ ΠΊΠ°ΡΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΌΡ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ docker Π΄Π΅ΠΌΠΎΠ½, Π° ΡΠ°ΠΌΠ°ΡΠ° ΡΠ±ΠΎΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π½Π° Π²ΡΡΠΊΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΈ ΠΊΠ΅ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΡΡΠ°ΡΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΈΠ·Π±ΡΠ³Π²Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π΅Π½ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ΅Π½ ΡΠΊΠ»Π°Π΄.
ΠΠ° Π΄Π° ΠΏΠΎΡΡΡΠΎΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π·, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ kaniko executor ΠΈ Π΄Π° ΠΌΡ ΠΏΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π° ΡΠ±ΠΎΡΠΊΠ°ΡΠ°, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΎ, ΡΡΠ΅Π· 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ΠΡΠ΄Π΅ registry.gitlab.com/kvaps/docs.example.org/website β ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΡ docker ΠΎΠ±ΡΠ°Π·, ΡΠ»Π΅Π΄ ΡΠ±ΠΎΡΠΊΠ°ΡΠ° ΡΠΎΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠ°ΡΠ΅Π½ Π² docker ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΡΡΠ°ΡΠ°.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ βcache ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΠΎΠ΅Π²Π΅ Π² docker ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΡΡΠ°ΡΠ°, Π·Π° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ Π² registry.gitlab.com/kvaps/docs.example.org/website/cache, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΈ Π΄ΡΡΠ³ ΠΏΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° βcache-repo.
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° docker-registry

4. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ qbec
β Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΡΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° Π³ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°ΡΠ΅ Π² Kubernetes. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Jsonnet ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠΈΡΡΠ° Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ΅Π΄ΠΈ ΠΈ ΠΏΠΎΡΡΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΈΠ·Π±ΡΠ³Π²Π° ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π°.
Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΡΡΠ°Π»Π½ΠΎ Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π³ΡΡΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ Π΄Π° Π³ΠΈ ΠΎΠΏΠΈΡΠ΅ΡΠ΅ Π² Git.
Qbec ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Helm-ΡΠ°ΡΡΠΈ, ΠΏΡΠ΅Π΄Π°Π²Π°ΠΉΠΊΠΈ ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ ΡΡΡ ΡΠΎΡΠ½ΠΎ ΠΊΠ°ΡΠΎ Ρ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π½Π°Π»Π°Π³Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΡΡΠ°ΡΠΈΠΈ, Π° ΡΠΎΠ²Π°, ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ChartMuseum. Π’ΠΎΠ΅ΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΡΡΠΎΠ²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ git, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌ Π΅ ΠΈ ΠΌΡΡΡΠΎΡΠΎ.
ΠΠ°ΠΊΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ ΠΏΠΎ-ΡΠ°Π½ΠΎ, Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½ΠΈΡ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½ΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° deploy/:
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 Π²Π΅ΡΠ΅ Π΅ ΡΡΠ·Π΄Π°Π» Π·Π° Π½Π°Ρ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ°ΡΠ° ΡΠ΅ ΡΡΠ΅Π΄Π° ΠΈ Π΅ Π²Π·Π΅Π» Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ namespace ΠΎΡ Π½Π°ΡΠΈΡ ΡΠ΅ΠΊΡΡ kubeconfig.
Π‘Π΅Π³Π° ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π΄Π°, qbec Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π° ΡΠ°ΠΌΠΎ Π² ΡΠΊΠ°Π·Π°Π½ Kubernetes ΠΊΠ»ΡΡΡΠ΅Ρ ΠΈ Π² ΡΠΊΠ°Π·Π°Π½ namespace, ΡΠΎΠ΅ΡΡ Π²ΠΈΠ΅ Π²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΠΈ namespaces, Π·Π° Π΄Π° ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΉ.
Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡ, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ».
ΠΡΠΈΡΠΊΠΈ Π²Π°ΡΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² qbec.yaml, ΠΈ Π² ΡΠ°ΠΉΠ»Π° params.libsonnet, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ ΠΎΡ ΠΊΡΠ΄Π΅ Π΄Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΡΡ .
ΠΠΎ-Π½Π°ΡΠ°ΡΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π΄Π²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ:
- components/ β ΡΡΠΊ ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ Π·Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΊΠ°ΠΊΡΠΎ Π² jsonnet, ΡΠ°ΠΊΠ° ΠΈ Ρ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ yaml ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
- environments/ β ΡΡΠΊ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ) Π·Π° Π½Π°ΡΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ.
ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΡΠ°ΠΉΠ»Π°:
- environments/base.libsonnet β ΡΠΎΠΉ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΎΠ±ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ΅Π΄ΠΈ
- environments/default.libsonnet β ΡΡΠ΄ΡΡΠΆΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π° ΡΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
ΠΠ΅ΠΊΠ° Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ environments/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 ΡΠ΅ΡΡΡΡΠ°: Deployment, Π£ΡΠ»ΡΠ³Π° ΠΈ IngressΠΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΈΠ·Π½Π΅ΡΠ΅ΠΌ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, Π½ΠΎ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π½ΠΈ ΡΡΠΈΠ³Π° ΠΈ Π΅Π΄ΠΈΠ½.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ jsonnet ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ json, Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΡ json Π²Π΅ΡΠ΅ Π΅ Π²Π°Π»ΠΈΠ΄Π΅Π½ jsonnet, ΡΠ°ΠΊΠ° ΡΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠ½Π»Π°ΠΉΠ½ ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΡΠΎ yaml2json Π·Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠΈΡ Π²ΠΈ yaml Π² json, ΠΈΠ»ΠΈ, Π°ΠΊΠΎ Π²Π°ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΎΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ yaml.
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ jsonnet ΡΠΈΠ»Π°ΠΌ Π²ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Π²Π°ΡΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° vim ΠΈΠΌΠ° ΠΏΠ»ΡΠ³ΠΈΠ½ vim-jsonnet, ΠΊΠΎΠΉΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° jsonnet fmt ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ (ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ jsonnet).
ΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΉ:
ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΌΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅:
qbec show defaultΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°Π½ΠΈ yaml ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ° default.
Π‘ΡΡΠ°Ρ ΠΎΡΠ½ΠΎ, ΡΠ΅Π³Π° ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅:
qbec apply defaultΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ Π²ΡΠ² Π²Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ΅Ρ, qbec ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ ΡΡΠ³Π»Π°ΡΠΈΡΠ΅ Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ y ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΡΠ΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ.
ΠΠΎΡΠΎΠ²ΠΎ! Π‘Π΅Π³Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ!
ΠΠΊΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅:
qbec diff defaultΠ·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π·ΡΡ Π½Π° ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
cd ..\/..\ngit add deploy\/website\ngit commit -m "ΠΠΎΠ±Π°Π²ΠΈ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π·Π° ΡΠ΅Π±ΡΠ°ΠΉΡΠ°"5. ΠΡΠΎΠ±Π²Π°ΠΌΠ΅ Gitlab-runner Ρ Kubernetes-executor
ΠΠΎ Π½Π΅ΠΎΡΠ΄Π°Π²Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°ΠΌΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ gitlab-runner Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° ΠΌΠ°ΡΠΈΠ½Π° (LXC-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ) Ρ shell- ΠΈΠ»ΠΈ docker-executor. ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΊΠΈΠ²Π° ΡΠ°Π½Π½Π΅ΡΠ° Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π² Π½Π°ΡΠΈΡ GitLab. Π’Π΅ ΡΡΠ±ΠΈΡΠ°Ρ Π° docker-ΠΎΠ±ΡΠ°Π·ΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠΎ ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°ΡΠ° β ΡΠΎΠ·ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π΅ Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½, ΠΊΠ°ΠΊΡΠΎ Π² ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎ, ΡΠ°ΠΊΠ° ΠΈ Π² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ. ΠΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΈ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°Π½Π½Π΅ΡΠΈ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, Π΄ΠΎΡΠΈ ΠΈ Π·Π° Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
ΠΠ° ΡΠ°ΡΡΠΈΠ΅, ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½ΠΈΠΊΠ°ΠΊΡΠ² ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ gitlab-runner Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π°ΠΏΡΠ°Π²ΠΎ Π² Kubernetes.
GitLab ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π³ΠΎΡΠΎΠ² helm-ΡΠ°ΡΡ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° gitlab-runner Π² Kubernetes. Π’Π°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π°, Π΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ registration token Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π² Settings β> CI \/ CD β> Runners ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ Π½Π° helm:
helm repo add gitlab https:\/\/charts.gitlab.io\n\nhelm install gitlab-runner \n --set gitlabUrl=https:\/\/gitlab.com \n --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc \n --set rbac.create=true \n gitlab\/gitlab-runnerΠΡΠ΄Π΅ΡΠΎ:
- β Π°Π΄ΡΠ΅ΡΡΡ Π½Π° Π²Π°ΡΠΈΡ GitLab-ΡΡΡΠ²ΡΡ.
- yga8y-jdCusVDn_t4Wxc β registration token Π·Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
- rbac.create=true β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π° ΡΠ°Π½Π½Π΅ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° kubernetes-executor.
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ ΡΠ°Π½Π½Π΅Ρ Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° Runners, Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈΡ ΡΠ°Π½Π½Π΅Ρ

Π’ΠΎΠ»ΠΊΠΎΠ²Π° Π»ΠΈ Π΅ Π»Π΅ΡΠ½ΠΎ? β Π΄Π°, ΡΠ°ΠΊΠ° Π΅! ΠΠΎΠ²Π΅ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΡΠ΅ΡΠ½Π΅Π½ΠΈΡ Ρ ΡΡΡΠ½Π°ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½Π° ΡΠ°Π½Π½Π΅ΡΠΈΡΠ΅, ΠΎΡ ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΡΠ°ΡΡΠΊ, ΡΠ°Π½Π½Π΅ΡΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π²Π°Π½ΠΈ ΠΈ ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°Π½ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ.
6. Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Helm-ΡΠ°ΡΡΠΈ Ρ QBEC
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΡΠΈΡΠ°ΠΌΠ΅ gitlab-runner ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π²ΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ΅ΠΌ Π² Π½Π°ΡΠ΅ΡΠΎ Git-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
ΠΠΎΠΆΠ΅Ρ ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠ°ΡΠΎ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ website, Π½ΠΎ Π² Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΏΠΈΡ website ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ gitlab-runner, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΡΠ°ΠΌΠΎ Π²Π΅Π΄Π½ΡΠΆ Π½Π° Π²ΡΠ΅ΠΊΠΈ Kubernetes-ΠΊΠ»ΡΡΡΠ΅Ρ. Π’Π°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π½Π΅Π³ΠΎ:
cd deploy\nqbec init gitlab-runner\ncd gitlab-runnerΠ’ΠΎΠ·ΠΈ ΠΏΡΡ Π½ΡΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Kubernetes-ΡΡΡΠ΅ΡΡΠ²Π°ΡΠ° Π½Π° ΡΡΠΊΠ°, Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π³ΠΎΡΠΎΠ² Helm ΡΠ°ΡΡ. ΠΠ΄Π½ΠΎ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° qbec Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°ΠΌΠ΅ Helm ΡΠ°ΡΡΠΎΠ²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ Git ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
ΠΠ΅ΠΊΠ° Π³ΠΎ ΡΠ²ΡΡΠΆΠ΅ΠΌ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ git submodule:
git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runnerΠ‘Π΅Π³Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° vendor/gitlab-runner ΡΡΠ΄ΡΡΠΆΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Ρ ΡΠ°ΡΡ Π·Π° gitlab-runner.
ΠΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ ΡΠ΅Π»ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈ ΡΠ°ΡΠΏΠΎΠ²Π΅.
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° components/gitlab-runner.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '.. /params.libsonnet';
local params = p.components.gitlabRunner;
std.native('expandHelmTemplate')(
'.. /vendor/gitlab-runner',
params.values,
{
nameTemplate: params.name,
namespace: env.namespace,
thisFile: std.thisFile,
verbose: true,
}
)ΠΡΡΠ²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π° expandHelmTemplate ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΡΡ Π΄ΠΎ ΡΠ°ΡΡΠ°, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° params.values, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°, ΡΠ»Π΅Π΄Π²Π° ΠΎΠ±Π΅ΠΊΡ Ρ
- nameTemplate β ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ΅Π»ΠΈΠ·Π°
- namespace β Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΡΡ, ΠΏΡΠ΅Π΄Π°Π²Π°Π½ Π½Π° Helm
- thisFile β Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΡΡΡ Π΄ΠΎ ΡΠ΅ΠΊΡΡΠΈΡ ΡΠ°ΠΉΠ»
- verbose β ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° helm template Ρ Π²ΡΠΈΡΠΊΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΏΡΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΡΡΠ°.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² environments/base.libsonnet:
local secrets = import '.. /secrets/base.libsonnet';
{
components: {
gitlabRunner: {
name: 'gitlab-runner',
values: {
gitlabUrl: 'https://gitlab.com/',
rbac: {
create: true,
},
runnerRegistrationToken: secrets.runnerRegistrationToken,
},
},
},
}ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ runnerRegistrationToken Π²Π·ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΡ Π²ΡΠ½ΡΠ½ΠΈΡ ΡΠ°ΠΉΠ» secrets/base.libsonnet, Π½Π΅ΠΊΠ° Π³ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ:
{
runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ:
qbec show defaultΠ°ΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ΠΌ Π½Π°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΈΡΠ΅Π½ ΡΠ΅Π»ΠΈΠ·, Π΄Π΅ΠΏΠ»ΠΎΠΈΠ·ΠΈΡΠ°Π½ ΡΡΠ΅Π· Helm:
helm uninstall gitlab-runnerΠΈ Π΄Π° Π³ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ, Π½ΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅Π· qbec:
qbec apply default7. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ 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 kvapss@gmail.comΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅ ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ²ΠΎΡ ΡΠ°ΡΡΠ΅Π½ ΠΊΠ»ΡΡ.
ΠΠΊΠΎ Π½ΡΠΌΠ°ΡΠ΅ PGP ΠΊΠ»ΡΡ ΠΈ Π½Π΅ ΠΏΡΠ΅Π΄Π²ΠΈΠΆΠ΄Π°ΡΠ΅ ΡΠ°ΠΊΡΠ², ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ΅ΠΌΠ΅ΡΠ΅ ΠΏΠΎ Π΄ΡΡΠ³ ΠΏΡΡ ΠΈ Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠ»ΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
git crypt export-key /path/to/keyfileΠ’Π°ΠΊΠ° Π²ΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½ΠΈΡ keyfile ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ° Π²Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ ΡΠ΅ΠΊΡΠ΅Ρ.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌ, ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠΌΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° deploy/gitlab-runner/, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ secrets/, Π½Π΅ΠΊΠ° Π΄Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π½Π΅Ρ, Π·Π° ΡΠ΅Π»ΡΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΠ» secrets/.gitattributes Ρ ΡΠ°ΠΊΠΎΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅:
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diffΠΠ°ΠΊΡΠΎ Π΅ Π²ΠΈΠ΄Π½ΠΎ ΠΎΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ, Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ ΠΌΠ°ΡΠΊΠ° * ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠ΅Π· git-crypt, Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΌΠΈΡ .gitattributes
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅:
git crypt status -eΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΏΠΈΡΡΠΊ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅.
ΠΠΎΡ ΠΈ Π²ΡΠΈΡΠΊΠΎ, ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΠ΅Π»ΠΎ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
cd ../../
git add .
git commit -m "Add deploy for gitlab-runner"ΠΠ° Π΄Π° Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅:
git crypt lockΠΈ Π²Π΅Π΄Π½Π°Π³Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π°Ρ Π² Π±ΠΈΠ½Π°ΡΠ½ΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅.
ΠΠ° Π΄Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅:
git crypt unlock8. Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ toolbox-ΠΎΠ±ΡΠ°Π·
Toolbox-ΠΎΠ±ΡΠ°Π· Π΅ ΠΎΠ±ΡΠ°Π· Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. Π’ΠΎΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΎΡ gitlab-ΡΠ°Π½Π΅ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΏΠΈΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅.
Π’ΡΠΊ Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ, ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ² dockerfiles/toolbox/Dockerfile Ρ ΡΠ°ΠΊΠΎΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅:
ΠΠ’ 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,
},
],
},
]Π’Π°ΠΊΠΆΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² environments/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 ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° name Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° rbac
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ:
qbec diff defaultΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Kubernetes:
qbec apply defaultΠ’Π°ΠΊΠΆΠ΅ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² git:
cd ../..
git add dockerfiles/toolbox
git commit -m "ΠΠΎΠ±Π°Π²ΠΈΡΡ Dockerfile Π΄Π»Ρ toolbox"
git add deploy/gitlab-runner
git commit -m "ΠΠ°ΡΡΡΠΎΠΈΡΡ gitlab-runner Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ 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: normal Π·Π° ΡΠ΅Π·ΠΈ Π΄ΠΆΠΎΠ±ΠΎΠ²Π΅, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .gitlab-ci.yml
git commit -m "ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Docker ΡΡΡΠΎΠ΅ΠΆ"ΠΠΈΡΠ»Ρ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΠ΅Π»ΠΎ Π΄Π° Π½Π°ΡΠ΅ΡΠ΅ΠΌ ΡΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ v0.0.1 ΠΈ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ ΡΠ°Π³:
git tag v0.0.1Π©Π΅ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ ΡΠ°Π³ΠΎΠ²Π΅ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΡΠ½Π΅ΠΌ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ. Π’Π°Π³ΠΎΠ²Π΅ΡΠ΅ Π² Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Git ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅. ΠΡΠ΅ΠΊΠΈ push Ρ Π½ΠΎΠ² ΡΠ°Π³ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° ΡΡΡΠΎΠ΅ΠΆ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΡΠΎΠ·ΠΈ ΡΠ°Π³.
ΠΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ git push βtags, ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½:
Π‘Π½ΠΈΠΌΠΊΠ° Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½

ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΡΡΡΠΎΠ΅ΠΆΡΡ ΠΏΠΎ ΡΠ°Π³ΠΎΠ²Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΡΡΡΠΎΠ΅ΠΆ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kubernetes. ΠΠΎΠ½Π΅ΠΆΠ΅ Π½ΠΎΠ²ΠΈ ΡΠ°Π³ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°Π·Π½Π°ΡΠ°Π²Π°Π½ΠΈ ΠΈ Π·Π° ΡΡΠ°ΡΠΈ ΠΊΠΎΠΌΠΈΡΠΈ, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π·Π° ΡΡΡ ΡΠ΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ.
ΠΠ° Π΄Π° ΡΠ΅ΡΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡΡΠΎΠ΅ΠΆΡΡ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π΅ ΡΠ²ΡΡΠ·Π°Π½ Ρ ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅, Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Ρ ΠΊΠ»ΠΎΠ½ master, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π²Π΅ΡΡΠΈΠΈΡΠ΅ Π½Π° ΡΡΠ±ΡΠ°Π½ΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. Π‘Π°ΠΌΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ rollback Ρ ΠΏΡΠΎΡΡ revert master-ΠΊΠ»ΠΎΠ½Π°.
10. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΡ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Gitlab-runner Π΄Π° ΡΠ°Π·ΠΊΠΎΠ΄ΠΈΡΠ° Π½Π°ΡΠΈΡΠ΅ ΡΠ°ΠΉΠ½ΠΈ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΡΡΠ° Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° CI:
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echoΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΡΡΠΎΠΊΠ° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π² Gitlab, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ ΠΎΡΠΈΠ΄Π΅ΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β CI / CD β ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½ΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°:
Type
ΠΠ»ΡΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠ°ΡΠΈΡΠ΅Π½Π°
Π‘ΠΊΡΠΈΠ²Π°Π½Π°
ΠΠ±Ρ
Π²Π°Ρ
File
GITCRYPT_KEY
<your string>
ΠΈΡΡΠΈΠ½Π½ΠΎ (ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ ΠΈ Π½Π΅Π²Π΅ΡΠ½ΠΎ)
ΠΈΡΡΠΈΠ½Π½ΠΎ
ΠΡΠΈΡΠΊΠΈ ΡΡΠ΅Π΄ΠΈ
Π‘Π½ΠΈΠΌΠΊΠ° Π½Π° Π΄ΠΎΠ±Π°Π²Π΅Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°

Π‘Π΅Π³Π° ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π½Π°ΡΠΈΡ .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__ β ΡΠΎΠ²Π° Π΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΡΡΠΎ ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½ΡΡΡ ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ Π² ΡΡΡΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ, Π² ΠΊΠΎΠΉΡΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ gitlab-runner. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π°ΡΠΎΡΠΎ Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ qbec ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Kubernetes ΡΡΡΠ²ΡΡ Π² kubeconfig-Π° Π²ΠΈ.
- βwait β ΠΏΡΠΈΠ½ΡΠΆΠ΄Π°Π²Π° qbec Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Ready ΠΈ ΡΠ°ΠΌΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° Ρ ΡΡΠΏΠ΅ΡΠ΅Π½ exit-code.
- βyes β ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΈΡ ΡΠ΅Π». Π‘ΠΈΠ³ΡΡΠ½ΠΈ Π»ΠΈ ΡΡΠ΅? ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½ΡΠ°.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .gitlab-ci.yml
git commit -m "ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ"Π ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° 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 ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π·Π° master

Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ°Π·Π³ΡΡΡΠ°ΠΌΠ΅ 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. ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠΌ Π½Π°ΡΠΈΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ.
ΠΡΡΠ²ΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° 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, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°ΠΌ Π±Π»ΠΎΠΊ ΡΡΠ΅Π΄Π°:
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 ΠΈ ΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΡΡ ΠΏΡΠ΅Π³Π»Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ°ΠΉΡΠ°.
ΠΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½ΠΎΠ²Π° ΠΎΠΏΡΠΈΡ Π·Π° qbec: βapp-tag β ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ Π΅ΡΠΈΠΊΠ΅ΡΠΈΡΠ°Ρ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΠΈΡΠ°Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΠ°Π³, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΈ ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°Ρ ΡΠ΅ΡΡΡΡΠΈ Π² Kubernetes qbec ΡΠ΅ ΠΎΠΏΠ΅ΡΠΈΡΠ° ΡΠ°ΠΌΠΎ Ρ ΡΡΡ
.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π΅ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π²ΡΡΠΊΠΎ ΡΠ΅Π²Ρ, Π° ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠΎΡΠΎ.
Π’ΡΠΊ ΡΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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:
// 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 Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ checkout Π½Π° Π½Π΅Π³ΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° GIT_STRATEGY: none, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΠΌΠ΅ master-ΠΊΠ»ΠΎΠ½Π° ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π³Π»Π΅Π΄Π° ΠΏΡΠ΅Π· Π½Π΅Π³ΠΎ.
ΠΠ°Π»ΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΡΡΠΌ Π½Π°ΠΌΠ΅ΡΠΈΠ» ΠΏΠΎ-ΠΊΡΠ°ΡΠΈΠ² Π½Π°ΡΠΈΠ½ Π΄ΠΎΡΠ΅Π³Π°.
ΠΠ»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΠΏΠ»ΠΎΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π² ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π°ΡΠΎ ΠΈΠ·ΡΡΠ»ΠΎ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΈΡΠ½Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .
git commit -m "ΠΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠ΅Π³Π»Π΅Π΄"git push, git checkout -b ΡΠ΅ΡΡ, git push origin ΡΠ΅ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ Π² Gitlab

ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ? β ΠΎΡΠ»ΠΈΡΠ½ΠΎ, ΠΈΠ·ΡΡΠΈΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΊΠ»ΠΎΠ½: git checkout master, git push origin :ΡΠ΅ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° ΡΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠΈ.
Π’ΡΠΊ Π²Π΅Π΄Π½Π°Π³Π° ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΡΠΎΡΠ½Ρ, ΡΠ΅ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΊΠ»ΠΎΠ½ΠΈ, ΡΠ΅ ΡΡΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΡ .gitlab-ci.yml ΡΠ°ΠΉΠ»Π° ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
ΠΠ°ΡΠΎΠ²Π° Π½Π°ΡΡΠΎΠ°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ ΡΡΡ Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² master, ΠΈΠ»ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
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 "ΠΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠ΅Π³Π»Π΅Π΄"git push, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π½Π° Π±ΡΡΠΎΠ½Π° ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡΠ΅Π³Π»Π΅Π΄

ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π΅ Π·Π°Π²ΡΡΡΠ΅Π½Π°!
ΠΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
- Π² Gitlab:
- Π² GitHub:
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ, Π½Π°Π΄ΡΠ²Π°ΠΌ ΡΠ΅ Π΄Π° Π²ΠΈ Π΅ Ρ
Π°ΡΠ΅ΡΠ°Π»ΠΎ ![]()
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
