ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΠ°ΠΏΠΎΡΠ»Π΅Π΄ΡΠΊ Π±ΡΡ Π° ΠΏΡΡΠ½Π°ΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΠΊΡΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠ° ΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π² Kubernetes. Π ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΠΈΡ Π΄Π° ΡΠΈ ΠΏΠΎΠΈΠ³ΡΠ°Ρ Ρ Gitlab, ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΎΡΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΠΌΡ ΠΈ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π΄Π° Π½Π°ΡΡΡΠΎΡ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄.
Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΡ Π΅ Π²Π΄ΡΡ
Π½ΠΎΠ²Π΅Π½ ΠΎΡ
ΠΠΏΠΈΡΠ°Ρ ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ ΠΎΡ Π½ΡΠ»Π°ΡΠ°, Π½ΠΎ ΠΈΠ·ΡΡΠ»ΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ Π²ΡΡΡ Ρ Gitlab CI ΠΈ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes. ΠΠ½Π΅Ρ Π½Π°ΠΉ-Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΡΡ .
Π‘ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΎΠ±Ρ
Π²Π°Π½Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΊΠ°ΡΠΎ:
Π£Π³ΠΎ, qbec, ΠΊΠ°Π½ΠΈΠΊΠΎ, git-ΠΊΡΠΈΠΏΡΠ° ΠΈ GitLab CI ΡΡΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½Π° ΡΡΠ΅Π΄Π°.
Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅
ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ Π₯ΡΠ³ΠΎ ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Docker ΡΠ°ΠΉΠ»Π° ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ kaniko ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² qbec ΠΠΏΠΈΡΠ²Π°ΠΌ Gitlab-runner Ρ Kubernetes-executor Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Π½Π° Helm Ρ qbec ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² git-crypt Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΡΡΠΈΡ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΡΡΠ²ΠΈΡΡ Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΠΈ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ°Π³ΠΎΠ²Π΅ ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π·Π° ΠΌΠ°ΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°
1. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ Π₯ΡΠ³ΠΎ
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΡ Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ Π²ΡΡΡ Ρ Hugo. Hugo Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ ΡΡΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ, ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΡΡ . ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΠ°ΠΉΡΠΎΠ²Π΅ Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π½ΡΠΊΠ°ΠΊΡΠ² Π²ΠΈΠ΄ php, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ²Π°Π½Π΅ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΡΡΠ°Π½ΠΈΡΠΈ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ ΡΠ° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ. Π’Π΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ Π½Π° Markdown ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° ΡΠ΅ΠΌΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅ Π² Π½Π°ΠΏΡΠ»Π½ΠΎ Π·Π°Π²ΡΡΡΠ΅Π½ ΡΠ°ΠΉΡ.
Π’ΠΎΠ΅ΡΡ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ html ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π²ΡΠΈΠ½ Ρ ΠΎΡΡΠΈΠ½Π³ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Ρ ΡΠ°ΠΉΡ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Hugo Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΡΠ΅:
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈΡ ΡΠ°ΠΉΡ:
hugo new site docs.example.org
Π Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ:
cd docs.example.org
git init
ΠΠ°ΡΠ΅Π³Π° Π½Π°ΡΠΈΡΡ ΡΠ°ΠΉΡ Π΅ ΡΠΈΡΡ ΠΈ Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π½Π΅ΡΠΎ Π½Π° Π½Π΅Π³ΠΎ, ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΠΌ ΡΠ΅ΠΌΠ°, ΡΠ΅ΠΌΠ°ΡΠ° Π΅ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ΠΈ ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½Π°ΡΠΈΡΡ ΡΠ°ΠΉΡ.
ΠΠ°ΡΠΎ ΡΠ΅ΠΌΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΎΠ±ΡΡΠ½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π³ΠΎ ΡΠ²ΡΡΠΆΠ΅ΠΌ Ρ git ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡΠ»:
git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ°ΠΌΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΏΡΡΠΊΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΠ΅ Π±ΡΠ΄Π°Ρ Π² Π½Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Π° ΡΠ²ΡΡΠ·Π°Π½Π°ΡΠ° ΡΠ΅ΠΌΠ° ΡΠ΅ ΠΎΡΡΠ°Π½Π΅ ΠΊΠ°ΡΠΎ Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ Π² Π½Π΅Π³ΠΎ, ΡΠΎΠ΅ΡΡ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠ΅Π³Π»Π΅Π½ ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ ΠΈ Π΄Π° Π½Π΅ ΡΠ΅ ΡΡΡΠ°Ρ ΡΠ²Π° Π½Π° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ.
ΠΠ° ΠΎΠΏΡΠ°Π²ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° config.toml:
baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"
ΠΠ΅ΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅:
hugo server
Π ΡΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ°
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π·Π°Π³Π»Π°Π²Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π² ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅/_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. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Docker ΡΠ°ΠΉΠ»Π°
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π½Π΅ΡΠΎ ΠΊΠ°ΡΠΎ:
.
βββ deploy
β βββ app1
β βββ app2
βββ dockerfiles
βββ image1
βββ image2
- dockerfiles/ - ΡΡΠ΄ΡΡΠΆΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ Dockerfiles ΠΈ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
- ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌ/ - ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Kubernetes
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½ΠΈΠ΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ Dockerfile ΠΏΠΎ ΠΏΡΡΡ dockerfiles/ΡΠ΅Π±ΡΠ°ΠΉΡ/dockerfile
FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src
FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, Dockerfile ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²Π° ΠΠ’, ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΡΠ΅ Π½Π°ΡΠΈΡΠ°
Π’Π°ΠΊΠ° ΠΊΡΠ°ΠΉΠ½ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ°ΠΌΠΎ darkhttpd (Π»Π΅ΠΊ HTTP ΡΡΡΠ²ΡΡ) ΠΈ ΠΎΠ±ΡΠ΅ΡΡΠ²Π΅Π½Π° / - ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠΈΡ ΡΡΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΡΠ°ΠΉΡ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. ΠΠ°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Ρ kaniko
ΠΠ°ΡΠΎ ΡΡΠ·Π΄Π°ΡΠ΅Π» Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ΡΠΈΡ
Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ kaniko ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π» ΠΈ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Π΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΊΡΠΌ Π½Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ, ΡΡΠ΅Π· Π΄ΠΎΠΊΠ΅Ρ:
docker run -ti --rm
-v $PWD:/workspace
-v ~/.docker/config.json:/kaniko/.docker/config.json:ro
gcr.io/kaniko-project/executor:v0.15.0
--cache
--dockerfile=dockerfiles/website/Dockerfile
--destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1
ΠΊΡΠ΄Π΅ΡΠΎ registry.gitlab.com/kvaps/docs.example.org/website - ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΡ Π΄ΠΎΠΊΠ΅Ρ ΠΎΠ±ΡΠ°Π·, ΡΠ»Π΅Π΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π² Π΄ΠΎΠΊΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΡΠ°.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ --ΠΊΠ΅Ρ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ»ΠΎΠ΅Π²Π΅ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° Π΄ΠΎΠΊΠ΅ΡΠΈΡΠ΅, Π·Π° Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈ Π² registry.gitlab.com/kvaps/docs.example.org/website/cache, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π΄ΡΡΠ³ ΠΏΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° --cache-repo.
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΡ
4. ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² qbec
Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π²ΡΡΠ½ΠΎ Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΈ ΠΎΠΏΠΈΡΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ Π² Git.
Qbec ΡΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Π½Π° Helm, ΠΊΠ°ΡΠΎ ΠΈΠΌ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΡΡΡ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΡΡΠ°ΡΠΈΠΈ ΠΊΡΠΌ ΡΡΡ , Π° ΡΠΎΠ²Π° ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ChartMuseum. Π’ΠΎΠ΅ΡΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ git, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌ Π΅ ΠΌΡΡΡΠΎΡΠΎ.
ΠΠ°ΠΊΡΠΎ ΠΊΠ°Π·Π°Ρ ΠΏΡΠ΅Π΄ΠΈ, ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌ/:
mkdir deploy
cd deploy
ΠΠ΅ΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΡΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
qbec init website
cd website
Π‘Π΅Π³Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
.
βββ components
βββ environments
β βββ base.libsonnet
β βββ default.libsonnet
βββ params.libsonnet
βββ qbec.yaml
Π²ΠΈΠΆΡΠ΅ ΡΠ°ΠΉΠ»Π° qbec.yaml:
apiVersion: qbec.io/v1alpha1
kind: App
metadata:
name: website
spec:
environments:
default:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
vars: {}
Π’ΡΠΊ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΎΡ ΡΠΏΠ΅Ρ.ΡΡΠ΅Π΄ΠΈ, qbec Π²Π΅ΡΠ΅ Π΅ ΡΡΠ·Π΄Π°Π» ΡΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π·Π° Π½Π°Ρ ΠΈ Π΅ Π²Π·Π΅Π» Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π° ΠΎΡ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π½ΠΈ kubeconfig.
Π‘Π΅Π³Π° ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π΄Π°, qbec Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π³ΡΡΡΠ° ΡΠ°ΠΌΠΎ Π² ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ Π½Π° Kubernetes ΠΈ Π² ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π°, Ρ.Π΅. Π²Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΎΡ ΠΈΠΌΠ΅Π½Π°, Π·Π° Π΄Π° ΡΠ°Π·Π³ΡΡΠ½Π΅ΡΠ΅.
ΠΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ».
ΠΡΠΈΡΠΊΠΈ Π²Π°ΡΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² qbec.yaml, ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° params.libsonnet, ΠΊΠΎΠ΅ΡΠΎ ΠΊΠ°Π·Π²Π° ΠΎΡΠΊΡΠ΄Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΡΡ .
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π΄Π²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ:
- ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ / - Π²ΡΠΈΡΠΊΠΈ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ Π·Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΡΡΠΊ, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΊΠ°ΠΊΡΠΎ Π² jsonnet, ΡΠ°ΠΊΠ° ΠΈ Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ yaml ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
- ΡΡΠ΅Π΄ΠΈ/ - ΡΡΠΊ ΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ) Π·Π° Π½Π°ΡΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ.
ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΡΠ°ΠΉΠ»Π°:
- ΡΡΠ΅Π΄ΠΈ/base.libsonnet - ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΎΠ±ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ΅Π΄ΠΈ
- ΡΡΠ΅Π΄ΠΈ/default.libsonnet - ΡΡΠ΄ΡΡΠΆΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΡΠ΅Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π·Π° ΡΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
Π½Π΅ΠΊΠ° ΠΎΡΠ²ΠΎΡΠΈΠΌ ΡΡΠ΅Π΄ΠΈ/base.libsonnet ΠΈ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°ΠΌ:
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΈ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ/website.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;
[
{
apiVersion: 'apps/v1',
kind: 'Deployment',
metadata: {
labels: { app: params.name },
name: params.name,
},
spec: {
replicas: params.replicas,
selector: {
matchLabels: {
app: params.name,
},
},
template: {
metadata: {
labels: { app: params.name },
},
spec: {
containers: [
{
name: 'darkhttpd',
image: params.image,
ports: [
{
containerPort: params.containerPort,
},
],
},
],
nodeSelector: params.nodeSelector,
tolerations: params.tolerations,
imagePullSecrets: [{ name: 'regsecret' }],
},
},
},
},
{
apiVersion: 'v1',
kind: 'Service',
metadata: {
labels: { app: params.name },
name: params.name,
},
spec: {
selector: {
app: params.name,
},
ports: [
{
port: params.servicePort,
targetPort: params.containerPort,
},
],
},
},
{
apiVersion: 'extensions/v1beta1',
kind: 'Ingress',
metadata: {
annotations: {
'kubernetes.io/ingress.class': params.ingressClass,
},
labels: { app: params.name },
name: params.name,
},
spec: {
rules: [
{
host: params.domain,
http: {
paths: [
{
backend: {
serviceName: params.name,
servicePort: params.servicePort,
},
},
],
},
},
],
},
},
]
Π ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΡΡΠΈ Kubernetes ΠΎΠ±Π΅ΠΊΡΠ° Π½Π°Π²Π΅Π΄Π½ΡΠΆ, ΡΠΎΠ²Π° ΡΠ°: Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ ΠΈ ΠΠ»ΠΈΠ·Π°Π½Π΅. ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π±ΠΈΡ ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° Π³ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠΌ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, Π½ΠΎ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π΅Π΄ΠΈΠ½ Π½ΠΈ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½.
ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ jsonnet ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ json, ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΡ json Π²Π΅ΡΠ΅ Π΅ Π²Π°Π»ΠΈΠ΄Π΅Π½ jsonnet, ΡΠ°ΠΊΠ° ΡΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠ½Π»Π°ΠΉΠ½ ΡΡΠ»ΡΠ³ΠΈ ΠΊΠ°ΡΠΎ yaml2json Π·Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡ ΡΠΈ yaml Π² json, ΠΈΠ»ΠΈ Π°ΠΊΠΎ Π²Π°ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ yaml.
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ jsonnet ΠΠΎΡΠ΅ΡΠΎ Π²ΠΈ ΡΡΠ²Π΅ΡΠ²Π°ΠΌ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Π²Π°ΡΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ° ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° vim vim-jsonnet, ΠΊΠΎΠΉΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° ΠΎΡΠ²Π΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ jsonnet fmt ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ (ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° jsonnet).
ΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ:
ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠ΅, Π½Π΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅:
qbec show default
ΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°Π·Π΅Π½ΠΈΡΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈ Π½Π° yaml, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
Π‘ΡΡΠ°Ρ ΠΎΡΠ½ΠΎ, ΡΠ΅Π³Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅:
qbec apply default
ΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ Π²ΠΈΠΆΠ΄Π°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π²ΡΠ² Π²Π°ΡΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ, qbec ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ»ΠΈ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ y ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΡΠ΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΡΠ° ΡΠΈ.
ΠΠΎΡΠΎΠ²ΠΎ ΡΠ΅Π³Π°, Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΎ!
ΠΠΊΠΎ Π±ΡΠ΄Π°Ρ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅:
qbec diff default
Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π·ΡΡ Π½Π° ΡΠ΅ΠΊΡΡΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
cd ../..
git add deploy/website
git commit -m "Add deploy for website"
5. ΠΠΏΠΈΡΠ°ΠΉΡΠ΅ Gitlab-runner Ρ Kubernetes-executor
ΠΠΎ ΡΠΊΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°ΠΌΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ gitlab-Π±Π΅Π³Π°Ρ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° ΠΌΠ°ΡΠΈΠ½Π° (LXC ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ) Ρ shell- ΠΈΠ»ΠΈ docker-executor. ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΡ ΡΠ΅Π·ΠΈ Π±Π΅Π³Π°ΡΠΈ, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ Π² Π½Π°ΡΠ°ΡΠ° gitlab. Π’Π΅ ΡΡΠ·Π΄Π°Π΄ΠΎΡ Π° Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠΎ ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°ΡΠ°, ΡΠ°Π·ΠΈ ΠΎΠΏΡΠΈΡ Π½Π΅ Π΅ Π½Π°ΠΉ-ΠΈΠ΄Π΅Π°Π»Π½Π°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎΡΡ, ΡΠ°ΠΊΠ° ΠΈ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ. ΠΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΈ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π±Π΅Π³Π°ΡΠΈ, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π΄ΠΎΡΠΈ Π·Π° Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
ΠΠ° ΡΠ°ΡΡΠΈΠ΅ ΡΠΎΠ²Π° ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ gitlab-Π±Π΅Π³Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎΡΠ½ΠΎ Π² Kubernetes.
Gitlab ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π³ΠΎΡΠΎΠ²Π° Ρ Π΅Π»ΠΌ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° gitlab-runner Π² Kubernetes. Π’Π°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ Π΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠΎΠΊΠ΅Π½ Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π² ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ -> CI / CD -> Runners ΠΈ Π³ΠΎ ΠΏΡΠ΅Π΄Π°ΠΉΡΠ΅ Π½Π° ΠΊΠΎΡΠΌΠΈΠ»ΠΎΡΠΎ:
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=Π²ΡΡΠ½ΠΎ - Π΄Π°Π²Π° Π½Π° Π±Π΅Π³Π°ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ Π±ΡΠΎΠΉ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° kubernetes-executor.
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈΡ Π±Π΅Π³Π°Ρ Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° Runners, Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈΡ Π±Π΅Π³Π°Ρ
Π’ΠΎΠ»ΠΊΠΎΠ²Π° Π»ΠΈ Π΅ ΠΏΡΠΎΡΡΠΎ? - Π΄Π°, ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ! ΠΡΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠ°ΡΠ°Π½ΠΈΡΠ° Ρ ΡΡΡΠ½ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π΅Π³Π°ΡΠΈ, ΠΎΡΡΠ΅Π³Π° Π½Π°ΡΠ°ΡΡΠΊ Π±Π΅Π³Π°ΡΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΈ ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ.
6. Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Π½Π° Helm Ρ QBEC
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ gitlab-Π±Π΅Π³Π°Ρ ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π²ΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ΅ΠΌ Π² Π½Π°ΡΠ΅ΡΠΎ Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠ°ΡΠΎ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π±ΡΠ°ΠΉΡ, Π½ΠΎ Π² Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π±ΡΠ°ΠΉΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ, Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ gitlab-Π±Π΅Π³Π°Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ ΡΠ°ΠΌΠΎ Π²Π΅Π΄Π½ΡΠΆ Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ Π½Π° Kubernetes. Π’Π°ΠΊΠ° ΡΠ΅ Π½Π΅ΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π½Π΅Π³ΠΎ:
cd deploy
qbec init gitlab-runner
cd gitlab-runner
Π’ΠΎΠ·ΠΈ ΠΏΡΡ Π½ΡΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Kubernetes ΠΎΠ±Π΅ΠΊΡΠΈ ΡΡΡΠ½ΠΎ, Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ΠΌ Π³ΠΎΡΠΎΠ²Π° Helm Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°. ΠΠ΄Π½ΠΎ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° qbec Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Helm Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΠ΅ΠΊΠ° Π³ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° git submodule:
git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner
Π‘Π΅Π³Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ/gitlab-runner ΡΡΠ΄ΡΡΠΆΠ° Π½Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π·Π° 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,
}
)
ΠΡΡΠ²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π° expandHelmTemplate ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΡΡ ΠΊΡΠΌ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° params.values, ΠΊΠΎΠΈΡΠΎ Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ΄Π²Π° ΠΎΠ±Π΅ΠΊΡΡΡ Ρ
- nameTemplate - ΠΈΠΌΠ΅ Π½Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ
- ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π° - ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π°, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΎ Π½Π° helm
- ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» - Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄Π°Π²Π° ΠΏΡΡΡ ΠΊΡΠΌ ΡΠ΅ΠΊΡΡΠΈΡ ΡΠ°ΠΉΠ»
- ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π΅Π½ - ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π±Π»ΠΎΠ½ Π·Π° ΠΊΠΎΡΠΌΠΈΠ»ΠΎ Ρ Π²ΡΠΈΡΠΊΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΏΡΠΈ ΡΠ΅Π½Π΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² ΡΡΠ΅Π΄ΠΈ/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 default
7. ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² 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-ΠΊΡΠΈΠΏΡΠ°.
git-ΠΊΡΠΈΠΏΡΠ° Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎ Ρ ΡΠΎΠ²Π°, ΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°ΡΠ΅ ΡΡΠ»Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΡΠ°ΠΉΠ½ΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π° ΡΡΠ°Π²Π½ΡΠ²Π°ΡΠ΅, ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΡΠ΅ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, ΠΊΠ°ΠΊΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²Π΅Ρ ΠΌΠ΅ Π² ΡΠ»ΡΡΠ°Ρ Ρ Git.
ΠΡΡΠ²ΠΎΡΠΎ Π½Π΅ΡΠΎ ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° git-ΠΊΡΠΈΠΏΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅ Π·Π° Π½Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅:
git crypt init
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ PGP ΠΊΠ»ΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΊΠ°ΡΠΎ ΡΡΡΡΡΠ΄Π½ΠΈΠΊ Π·Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ:
git-crypt add-gpg-user [email protected]
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅ ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π»ΠΈΡΠ½ΠΈΡ ΡΠΈ ΠΊΠ»ΡΡ.
ΠΠΊΠΎ Π½ΡΠΌΠ°ΡΠ΅ PGP ΠΊΠ»ΡΡ ΠΈ Π½Π΅ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ ΠΏΠΎ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ ΠΈ Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠ»ΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
git crypt export-key /path/to/keyfile
Π’Π°ΠΊΠ° Π²ΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π° ΠΈΠ·Π½Π΅ΡΠ΅Π½ ΠΊΠ»ΡΡΠΎΠ² ΡΠ°ΠΉΠ» ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΡΠΈΡΡΠΈΡΠ° Π²Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°ΡΠ°ΡΠ° ΠΏΡΡΠ²Π° ΡΠ°ΠΉΠ½Π°.
ΠΠ΅ΠΊΠ° Π²ΠΈ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠΌΠ΅ Π² ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅/gitlab-runner/ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΠ°ΠΉΠ½ΠΈ/, Π½Π΅ΠΊΠ° ΡΠΈΡΡΠΎΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π½Π΅Π³ΠΎ, Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΠ» ΡΠ°ΠΉΠ½ΠΈ/.gitattributes ΡΡΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°:
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
ΠΠ°ΠΊΡΠΎ ΡΠ΅ Π²ΠΈΠΆΠ΄Π° ΠΎΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ, Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ ΠΌΠ°ΡΠΊΠ° * ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΏΡΠ΅Π· git-ΠΊΡΠΈΠΏΡΠ°, Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° .gitattributes
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ:
git crypt status -e
ΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅
Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ, ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"
ΠΠ° Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅:
git crypt lock
ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π°Ρ Π² Π½Π΅ΡΠΎ Π΄Π²ΠΎΠΈΡΠ½ΠΎ, ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ°Ρ.
ΠΠ° Π΄Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅:
git crypt unlock
8. Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΡΡΠΈΡ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΡΡΠΈΡ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. Π’ΠΎΠΉ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ gitlab runner Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΏΠΈΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
Π’ΡΠΊ Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ, ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΎ dockerfiles/ΠΊΡΡΠΈΡ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ/Dockerfile ΡΡΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°:
FROM alpine:3.11
RUN apk add --no-cache git git-crypt
RUN QBEC_VER=0.10.3
&& wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz
| tar -C /tmp -xzf -
&& mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/
RUN KUBECTL_VER=1.17.0
&& wget -O /usr/local/bin/kubectl
https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl
&& chmod +x /usr/local/bin/kubectl
RUN HELM_VER=3.0.2
&& wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz
| tar -C /tmp -zxf -
&& mv /tmp/linux-amd64/helm /usr/local/bin/helm
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, Π² ΡΠΎΠ²Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΡΡΠΊ, ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ kubectl, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΈ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΡΠ΅ Ρ Π½Π΅Π³ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠ²Π°ΡΠ΅ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄Π°.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°ΠΌΠ΅ Ρ Kubernetes ΠΈ Π΄Π° Π³ΠΎ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΠΎΠ»Ρ Π·Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ ΠΎΡ gitlab-runner.
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Ρ gitlab-runner'om:
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',
},
},
}
ΠΠΎΠ»Ρ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ $.components.rbac.name ΠΎΡΠ½Π°ΡΡ ΡΠ΅ Π΄ΠΎ ΠΈΠΌΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ rbac
ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ:
qbec diff default
ΠΈ ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΊΡΠΌ Kubernetes:
qbec apply default
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° Π°Π½Π³Π°ΠΆΠΈΡΠ°ΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² git:
cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"
9. ΠΡΡΠ²ΠΈΡΡ Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΠΈ Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ°Π³ΠΎΠ²Π΅
Π ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ .gitlab-ci.yml ΡΡΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°:
.build_docker_image:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug-v0.15.0
entrypoint: [""]
before_script:
- echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json
build_toolbox:
extends: .build_docker_image
script:
- /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
only:
refs:
- tags
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
only:
refs:
- tags
ΠΠΎΠ»Ρ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ GIT_SUBMODULE_STRATEGY: Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ Π·Π° ΡΠ΅Π·ΠΈ Π·Π°Π΄Π°ΡΠΈ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° ΠΈΠ·ΡΠΈΡΠ½ΠΎ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .gitlab-ci.yml
git commit -m "Automate docker build"
ΠΠΈΡΠ»Ρ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΡΠ΅ΡΠ΅ΡΠ΅ Π²Π΅ΡΡΠΈΡ v0.0.1 ΠΈ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ Π΅ΡΠΈΠΊΠ΅Ρ:
git tag v0.0.1
Π©Π΅ ΠΎΠΊΠ°ΡΠ²Π°ΠΌΠ΅ Π΅ΡΠΈΠΊΠ΅ΡΠΈ Π²ΠΈΠ½Π°Π³ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΡΠ½Π΅ΠΌ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ. ΠΡΠΈΠΊΠ΅ΡΠΈ Π² Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ Ρ Git ΡΠ°Π³ΠΎΠ²Π΅. ΠΡΡΠΊΠΎ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Ρ Π½ΠΎΠ² ΡΠ°Π³ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠΎΠ·ΠΈ ΡΠ°Π³.
Π©Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ git push --tagsΠΈ Π²ΠΈΠΆΡΠ΅ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΈ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΈΡΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈ, ΡΠ° Π΄ΠΎΠ±ΡΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ Π½Π΅ ΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kubernetes. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°Π³ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈ ΠΈ Π½Π° ΡΡΠ°ΡΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈ, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π·Π° ΡΡΡ ΡΠ΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ.
ΠΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΡΠ°Π³ΠΎΠ²Π΅ ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΠΊΠ»ΠΎΠ½Π° ΠΌΠ°ΠΉΡΡΠΎΡ, Π² ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΡΠΈΠΈΡΠ΅ Π½Π° ΡΡΠ±ΡΠ°Π½ΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ° ΡΠ²ΡΡΠ΄ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π²ΡΡΡΠ°Π½Π΅ Π½Π°Π·Π°Π΄ Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΡΡΠ°Π½Π΅ ΠΌΠ°ΠΉΡΡΠΎΡ- ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅.
10. ΠΠ½Π΅Π΄ΡΠ΅ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Gitlab-runner Π΄Π° Π΄Π΅ΡΠΈΡΡΠΈΡΠ° Π½Π°ΡΠΈΡΠ΅ ΡΠ°ΠΉΠ½ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΡΡΠ° Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΠΈ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΡΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° CI ΡΡΠ΅Π΄Π°:
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo
ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΈΠ· Π² Gitlab, Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΠΎΡΠΈΠ΄Π΅ΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β> CI / CD β> ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°:
Π’ΠΈΠΏ
ΠΊΠ»ΡΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠ°ΡΠΈΡΠ΅Π½Π°
ΠΌΠ°ΡΠΊΠΈΡΠ°Π½
ΠΠ±Ρ
Π²Π°Ρ
File
GITCRYPT_KEY
<your string>
true
(ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ false
)
true
All environments
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π΄ΠΎΠ±Π°Π²Π΅Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡ .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 Π½ΡΠΊΠΎΠΈ/ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ - ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
- --force:k8s-ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ __incluster__ - ΡΠΎΠ²Π° Π΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΡΡΠΎ ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ Π² ΡΡΡΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ gtilab-runner. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ qbec ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Kubernetes ΡΡΡΠ²ΡΡ Π²ΡΠ² Π²Π°ΡΠΈΡ kubeconfig
- -ΠΈΠ·ΡΠ°ΠΊΠ°ΠΉΡΠ΅ - ΠΏΡΠΈΠ½ΡΠΆΠ΄Π°Π²Π° qbec Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΡΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΠ·Π΄Π°Π²Π°, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡ ΠΈ Π΅Π΄Π²Π° ΡΠΎΠ³Π°Π²Π° Π΄Π° Π·Π°Π²ΡΡΡΠΈ Ρ ΡΡΠΏΠ΅ΡΠ΅Π½ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄.
- -Π΄Π° - ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°ΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π‘ΠΈΠ³ΡΡΠ΅Π½ Π»ΠΈ ΡΠΈ? ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ΡΠΎ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .gitlab-ci.yml
git commit -m "Automate deploy"
Π ΡΠ»Π΅Π΄ git push ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π²ΡΠΎΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
11. ΠΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π·Π° ΠΌΠ°ΡΡΠ΅ΡΠΈΡΠ°Π½Π΅
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π³ΠΎΡΠ½ΠΈΡΠ΅ ΡΡΡΠΏΠΊΠΈ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠ° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³Π°, Π½ΠΎ Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π΅ΡΠΈΠΊΠ΅Ρ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΉΡΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π½ΠΈΠ΅ ΡΠ΅ ΠΎΡΠΈΠ΄Π΅ΠΌ ΠΏΠΎ ΠΏΠΎ-Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ ΠΈ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π΄Π°ΠΉΠ΄ΠΆΠ΅ΡΡ Π² Π³Π»Π°Π²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½.
ΠΠ΄Π΅ΡΡΠ° Π΅ ΠΏΡΠΎΡΡΠ°: ΡΠ΅Π³Π° ΠΎΠ±ΡΠ°Π·ΡΡ Π½Π° Π½Π°ΡΠΈΡ ΡΠ΅Π±ΡΠ°ΠΉΡ ΡΠ΅ ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΌΠ°ΠΉΡΡΠΎΡ, ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π² Kubernetes.
ΠΠ΅ΠΊΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ° Π² Π½Π°ΡΠΈΡ .gitlab-ci.yml:
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
only:
refs:
- master
- tags
deploy_website:
extends: .deploy_qbec_app
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
ΠΠΎΠ»Ρ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ ΠΌΠ°ΠΉΡΡΠΎΡ ΠΊ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ° build_website ΠΈ ΡΠ΅Π³Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ $CI_COMMIT_REF_NAME Π²ΠΌΠ΅ΡΡΠΎ $CI_COMMIT_TAG, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠ΅ ΠΎΡΡΡΠ²Π°Π²Π°ΠΌΠ΅ ΠΎΡ ΡΠ°Π³ΠΎΠ²Π΅ΡΠ΅ Π² Git ΠΈ ΡΠ΅Π³Π° ΡΠ΅ ΠΈΠ·Π±ΡΡΠ°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Ρ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΈΡ ΠΊΠ»ΠΎΠ½Π°, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° Π²Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ. ΠΠ°ΡΠ»ΡΠΆΠ°Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Ρ ΡΠ°Π³ΠΎΠ²Π΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ½ΠΈ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΡΠ°ΠΉΡΠ° Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π² Π΄ΠΎΠΊΠ΅ΡΡΠΊΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΡ.
ΠΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΌΠ°ΡΠΊΠ΅ΡΠ° Π·Π° Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ°ΠΉΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎ, Π²ΡΠ΅ ΠΎΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π·Π° Kubernetes, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΌΠ° Π΄Π° ΠΏΡΠ΅ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡ Π½ΠΎΠ²ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΌΠ° Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
ΠΠ°ΡΠΈΠ°Π½Ρ --vm:ext-str digest="$DIGEST" Π·Π° qbec - ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π²ΡΠ½ΡΠ½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΊΡΠΌ jsonnet. ΠΡΠΊΠ°ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ Π²ΡΡΠΊΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. ΠΠ΅ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΌΠ°ΡΠΊΠ΅ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΠΌ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°ΠΌΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ.
Π’ΡΠΊ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° Π½Π° Kaniko Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈ Π΄Π°ΠΉΠ΄ΠΆΠ΅ΡΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π²ΡΠ² ΡΠ°ΠΉΠ» ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ (ΠΎΠΏΡΠΈΡ --digest-ΡΠ°ΠΉΠ»)
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΠΈΠΌ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΠΌ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΠ΅ΠΊΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΈΡ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅/website/environments/base.libsonnet ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
ΠΠΎΡΠΎΠ²ΠΎ, ΡΠ΅Π³Π° Π²ΡΡΠΊΠΎ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½Π΅ ΠΌΠ°ΠΉΡΡΠΎΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠ΅Π±ΡΠ°ΠΉΡΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΎ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ Π² Kubernetes.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .
git commit -m "Configure dynamic build"
ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° git push ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Pipeline Π·Π° master
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡΠ΅ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ gitlab-runner Ρ Π²ΡΡΠΊΠΎ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅, ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½ΠΈΡΠΎ Π½Π΅ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ Π² Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π½Π΅ΠΊΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Π² .gitlab-ci.yml:
deploy_gitlab_runner:
extends: .deploy_qbec_app
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script:
- base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
script:
- qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
only:
changes:
- deploy/gitlab-runner/**/*
ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΡΠ»Π΅Π΄ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅/gitlab-runner/ ΠΈ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½ΠΈ ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΊΠΈΠ²Π°
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"
git push, ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
12. ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠΌ Π½Π°ΡΠ°ΡΠ° Π»ΠΈΠ½ΠΈΡ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ.
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° build_website Π² Π½Π°ΡΠ°ΡΠ° .gitlab-ci.yml, ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°ΠΉΠΊΠΈ Π±Π»ΠΎΠΊΠ° ΠΎΡ Π½Π΅Π³ΠΎ ΡΠ°ΠΌΠΎ Π·Π° Π»ΠΈΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ½ΡΠ΄ΠΈ Gitlab Π΄Π° Π³ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½Π΅ ΠΊΡΠΌ Π²ΡΠ΅ΠΊΠΈ ΠΊΠ»ΠΎΠ½:
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ΡΠΎ deploy_website, Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ Π±Π»ΠΎΠΊ ΡΠ°ΠΌ Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΡΠ° ΡΡΠ΅Π΄Π°:
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
Π’ΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° Gitlab Π΄Π° ΡΠ²ΡΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΡΠ³Π°Π½Π΅ ΡΡΠ΅Π΄Π° ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ Π½Π΅Ρ.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΠ΅ Π΄Π²Π΅ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ°:
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
deploy_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
on_stop: stop_review
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
only:
refs:
- branches
except:
refs:
- master
stop_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
stage: deploy
before_script:
- git clone "$CI_REPOSITORY_URL" master
- cd master
script:
- qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
variables:
GIT_STRATEGY: none
only:
refs:
- branches
except:
refs:
- master
when: manual
Π’Π΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½ΠΈ ΡΡΠ΅Π· Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ ΠΊΡΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π³Π»Π°Π²Π½ΠΈΡ ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ°ΠΉΡΠ°.
ΠΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½ΠΎΠ²Π° ΠΎΠΏΡΠΈΡ Π·Π° qbec: --app-tag - ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ°ΡΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠ°ΠΌΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠΈΠΊΠ΅Ρ; ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΈ ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°ΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ Π² Kubernetes, qbec ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π²ΡΡΡ
Ρ ΡΡΡ
.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ΅Π΄Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄, Π° ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΡΡΠ°ΡΠ°.
Π’ΡΠΊ ΡΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ qbec ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π²ΠΌΠ΅ΡΡΠΎ qbec ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ - ΡΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° Π΅ ΠΌΠΎΠΌΠ΅Π½ΡΡΡ, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠ°Π·Π»ΠΈΠΊΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ (ΠΏΡΠ΅Π³Π»Π΅Π΄ ΠΈ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅):
ΠΠΎΠ±Π°Π²ΠΈ Π Π΅ΡΠ΅Π½Π·ΠΈΡ ΡΡΠ΅Π΄Π° Π² ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅/website/qbec.yaml
spec:
environments:
review:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ Π² ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅/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
Π Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π½Π΅Π³ΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅/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',
},
},
}
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡΠ±Π»ΠΈΠ·ΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΡΠΎΠΏ_ΡΠ΅Π²Ρ, ΡΠΎΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½, ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠ»ΠΎΠ½ΡΡ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π°Ρ ΠΈ ΡΠ°ΠΊΠ° ΡΠ΅ gitlab Π΄Π° Π½Π΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° GIT_STRATEGY: Π½ΡΠΌΠ°, ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΌΠ°ΠΉΡΡΠΎΡ-ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ ΠΏΡΠ΅Π· Π½Π΅Π³ΠΎ.
ΠΠ°Π»ΠΊΠΎ ΠΎΠ±ΡΡΠΊΠ²Π°ΡΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΠΌ Π½Π°ΠΌΠ΅ΡΠΈΠ» ΠΏΠΎ-ΠΊΡΠ°ΡΠΈΠ² Π½Π°ΡΠΈΠ½.
ΠΠ»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ Π±ΠΈ Π±ΠΈΠ» ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠ° ΡΠ΅ΡΠ΅Π½Π·ΠΈΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ
ΠΎΡΠ΅Π», ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ½ΠΈΡΠΎΠΆΠ΅Π½ΠΎ ΠΈΠ·ΡΡΠ»ΠΎ.
ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
git add .
git commit -m "Enable automatic review"
git push, git checkout -b ΡΠ΅ΡΡ, git push ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ ΡΠ΅ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΡΡΠ΅Π΄ΠΈ Π² Gitlab
ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π»ΠΈ? - ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΎ, ΠΈΠ·ΡΡΠΈΠΉΡΠ΅ Π½Π°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ² ΠΊΠ»ΠΎΠ½: Π½Π°ΡΠ°Π»ΠΎ Π½Π° ΠΏΠΎΡΡΡΠΊΠ°ΡΠ°, git push origin :test, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π·Π°Π΄Π°Π½ΠΈΡΡΠ° Π·Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° ΡΠ° ΡΠ°Π±ΠΎΡΠΈΠ»ΠΈ Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠΈ.
Π’ΡΠΊ Π²Π΅Π΄Π½Π°Π³Π° ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΏΠΎΡΡΠ½Ρ, ΡΠ΅ Π²ΡΠ΅ΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΡΠΎΠΉ ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½Ρ .gitlab-ci.yml ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏ.
ΠΡΠΎ Π·Π°ΡΠΎ Π΅ ΡΠΈΠ»Π½ΠΎ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΈΠΌ ΡΠ°ΠΌΠΎ Π·Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² ΠΌΠ°ΠΉΡΡΠΎΡΠΈΠ»ΠΈ ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
13 ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΡ ΡΠ΅Π·ΠΈ Π±ΡΡΠΎΠ½ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ°ΠΉΠ» .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ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅:
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° Π±ΡΡΠΎΠ½Π° Π·Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π Π°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΠ²ΡΡΡΠ΅Π½Π°!
ΠΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
- Π² gitlab:
https://gitlab.com/kvaps/docs.example.org - Π² GitHub:
https://github.com/kvaps/docs.example.org
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΈ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ, Π½Π°Π΄ΡΠ²Π°ΠΌ ΡΠ΅ Π΄Π° Π²ΠΈ Π΅ Ρ Π°ΡΠ΅ΡΠ°Π»ΠΎ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com