ΠΡΠΈΠ²Π΅Ρ! ΠΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΡΠ»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ Π² Kubernetes. Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠΈΠ³ΡΠ°ΡΡΡΡ Ρ Π³ΠΈΡΠ»Π°Π±ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·ΡΡΠΈΡΡ Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½.
ΠΠ΄ΠΎΡ
Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΡΠ°Π» ΡΠ°ΠΉΡ
Π― ΠΏΠΎΡΡΠ°ΡΠ°Π»ΡΡ Π²ΡΡΡΡΠΎΠΈΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Ρ Π½ΡΠ»Ρ, Π½ΠΎ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π½Π° Gitlab CI ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΡΠΈΠ²ΡΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Kubernetes. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠ°ΡΡΠΊΠ°ΠΆΡ Π²Π°ΠΌ ΠΎ Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
Π ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΊΠ°ΠΊ:
Hugo, qbec, kaniko, git-crypt ΠΈ GitLab CI Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ.
CΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ Hugo ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Dockerfile ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ kaniko ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ qbec ΠΡΠΎΠ±ΡΠ΅ΠΌ Gitlab-runner Ρ Kubernetes-executor ΠΠ΅ΠΏΠ»ΠΎΠΉ Helm-ΡΠ°ΡΡΠΎΠ² Ρ qbec ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ git-crypt Π‘ΠΎΠ·Π΄Π°ΡΠΌ toolbox-ΠΎΠ±ΡΠ°Π· ΠΠ°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΈ ΡΠ±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΏΠΎ ΡΡΠ³Π°ΠΌ ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π΄Π΅ΠΏΠ»ΠΎΡ ΠΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΈ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΈ push Π² master Dynamic environments Review Apps
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, ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ darkhttpd (Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΉ HTTP-ΡΠ΅ΡΠ²Π΅Ρ) ΠΈ public/ β ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³Π΅Π½ΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ°.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ kaniko
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ±ΠΎΡΡΠΈΠΊΠ° 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, Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡΡ Π² registry.gitlab.com/kvaps/docs.example.org/website/cache, Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° —cache-repo.
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ docker-registry
4. ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ qbec
ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΈΡ Π² 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 ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π» Π·Π° Π½Π°Ρ default ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Π·ΡΠ» Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ namespace ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ kubeconfig.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ Π² default ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, qbec Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ ΠΈ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ, ΡΠΎ Π΅ΡΡΡ Π²Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ ΠΈ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ.
Π ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±ΠΎΡ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²Ρ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅.
ΠΡΠ΅ Π²Π°ΡΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² qbec.yaml, ΠΈ Π² ΡΠ°ΠΉΠ»Π΅ params.libsonnet, Π³Π΄Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΎΡΠΊΡΠ΄Π° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ°ΡΡ Π΄Π»Ρ Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
ΠΠ°Π»ΡΡΠ΅ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π΄Π²Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ:
- components/ β Π·Π΄Π΅ΡΡ Π±ΡΠ΄ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π²ΡΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½Ρ ΠΊΠ°ΠΊ Π² jsonnet ΡΠ°ΠΊ ΠΈ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ yaml-ΡΠ°ΠΉΠ»Π°ΠΌΠΈ
- environments/ β Π·Π΄Π΅ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ) Π΄Π»Ρ Π½Π°ΡΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π° ΡΠ°ΠΉΠ»Π°:
- environments/base.libsonnet β ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ
- environments/default.libsonnet β ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π΄Π»Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ default
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΡΠΊΡΠΎΠ΅ΠΌ 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-cΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎ: Deployment, Service ΠΈ 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 ../..
git add deploy/website
git commit -m "Add deploy for website"
5. ΠΡΠΎΠ±ΡΠ΅ΠΌ Gitlab-runner Ρ Kubernetes-executor
ΠΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ gitlab-runner Π½Π° Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ (LXC-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅) Ρ shell- ΠΈΠ»ΠΈ docker-executor. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΠΈΡ ΡΠ°Π½Π½Π΅ΡΠΎΠ² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ Π² Π½Π°ΡΠ΅ΠΌ Π³ΠΈΡΠ»Π°Π±Π΅. ΠΠ½ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π»ΠΈ docker-ΠΎΠ±ΡΠ°Π·Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ².
ΠΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π»Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° β ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π΅ ΡΠ°ΠΌΡΠΉ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΉ, ΠΊΠ°ΠΊ Π² ΠΏΠ»Π°Π½Π΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎΡΡΠΈ, ΡΠ°ΠΊ ΠΈ Π² ΠΏΠ»Π°Π½Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅ ΠΈ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅ΠΉ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°Π½Π½Π΅ΡΡ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π° ΡΠΎ ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
Π ΡΡΠ°ΡΡΡΡ ΡΡΠΎ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ gitlab-runner Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΡΡΠΌΠΎ Π² Kubernetes.
Gitlab ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π³ΠΎΡΠΎΠ²ΡΠΉ helm-ΡΠ°ΡΡ Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ gitlab-runner Π² Kubernetes. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²ΡΡ ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎ ΡΠ·Π½Π°ΡΡ registration token Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Settings —> CI / CD —> Runners ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅Π³ΠΎ helm:
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 β registration token Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
- rbac.create=true β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°Π½Π½Π΅ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ΄Ρ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π°ΡΠΈΡ Π·Π°Π΄Π°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ kubernetes-executor.
ΠΡΠ»ΠΈ Π²ΡΡ ΡΠ΄Π΅Π»Π°Π½Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°Π½Π½Π΅Ρ Π² ΡΠ΅ΠΊΡΠΈΠΈ Runners, Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π½Π½Π΅ΡΠ°
ΠΠΎΡ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ? β Π΄Π°, ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ! ΠΠΎΠ»ΡΡΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΡΠΎΠΊΠΈ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΡΠ°Π½Π½Π΅ΡΠΎΠ² Π²ΡΡΡΠ½ΡΡ, Ρ ΡΡΠΎΠΉ ΠΌΠΈΠ½ΡΡΡ ΡΠ°Π½Π½Π΅ΡΡ Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
6. ΠΠ΅ΠΏΠ»ΠΎΠΉ Helm-ΡΠ°ΡΡΠΎΠ² Ρ QBEC
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΡΠ°ΡΡ gitlab-runner ΡΠ°ΡΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ Π² Π½Π°ΡΠ΅ΠΌ Git-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΎΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ website, Π½ΠΎ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ website ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠΈ gitlab-runner, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠ΅Π½ Π²ΡΠ΅Π³ΠΎ-Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ 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
Π’Π΅ΠΏΠ΅ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ vendor/gitlab-runner ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Ρ Π½Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΡΠ°ΡΡΠΎΠΌ Π΄Π»Ρ gitlab-runner.
ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΠ°ΡΡΠ°ΠΌΠΈ
https://github.com/helm/charts
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ components/gitlab-runner.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;
std.native('expandHelmTemplate')(
'../vendor/gitlab-runner',
params.values,
{
nameTemplate: params.name,
namespace: env.namespace,
thisFile: std.thisFile,
verbose: true,
}
)
ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊ expandHelmTemplate ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΠΏΡΡΡ ΠΊ ΡΠ°ΡΡΡ, Π·Π°ΡΠ΅ΠΌ params.values, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·ΡΠΌΡΠΌ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, Π·Π°ΡΠ΅ΠΌ ΠΈΠ΄ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ
- nameTemplate β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠ·Π°
- namespace β Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Ρ Π΅Π»ΡΠΌΡ
- 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 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-crypt.
git-crypt Π΅ΡΡ ΡΠ΄ΠΎΠ±Π΅Π½ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π²ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ, ΠΌΠ΅ΡΠ΄ΠΆΠΈΡΡ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡ ΠΊΠΎΡΠ»ΠΈΠΊΡΡ ΡΠ°ΠΊ-ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΌΡ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Ρ Git.
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ git-crypt Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠΈ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ:
git crypt init
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ PGP-ΠΊΠ»ΡΡ, ΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ°Π·Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ collaborator’Π° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
git-crypt add-gpg-user [email protected]
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²Ρ Π²ΡΠ΅Π³Π΄Π° ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΠΉ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ.
ΠΡΠ»ΠΈ ΠΆΠ΅ 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 unlock
8. Π‘ΠΎΠ·Π΄Π°ΡΠΌ toolbox-ΠΎΠ±ΡΠ°Π·
Toolbox-ΠΎΠ±ΡΠ°Π· β ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ°Π· ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³ΠΈΡΠ»Π°Π±-ΡΠ°Π½Π½Π΅ΡΠΎΠΌ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²ΡΡ Π·Π°Π΄Π°Ρ Π΄Π΅ΠΏΠ»ΠΎΡ.
ΠΠ΄Π΅ΡΡ Π²ΡΡ ΠΏΡΠΎΡΡΠΎ, ΡΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ dockerfiles/toolbox/Dockerfile Ρ ΡΠ°ΠΊΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ΠΌ:
FROM alpine:3.11
RUN apk add --no-cache git git-crypt
RUN QBEC_VER=0.10.3
&& wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz
| tar -C /tmp -xzf -
&& mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/
RUN KUBECTL_VER=1.17.0
&& wget -O /usr/local/bin/kubectl
https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl
&& chmod +x /usr/local/bin/kubectl
RUN HELM_VER=3.0.2
&& wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz
| tar -C /tmp -zxf -
&& mv /tmp/linux-amd64/helm /usr/local/bin/helm
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, Π² ΡΡΠΎΠΌ ΠΎΠ±ΡΠ°Π·Π΅ ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π²ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΌ Π½Π΅ Π½ΡΠΆΠ΅Π½ Π·Π΄Π΅ΡΡ ΡΠ°Π·Π²Π΅ ΡΡΠΎ kubectl, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡΡΡ Ρ Π½ΠΈΠΌ Π½Π° ΡΡΠ°ΠΏΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°.
Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ Kubernetes ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π² Π½Π΅Π³ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠΎΠ»Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΎΠ² Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΡ gitlab-runner’ΠΎΠΌ.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ gitlab-runner’ΠΎΠΌ:
cd deploy/gitlab-runner
ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ components/rbac.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;
[
{
apiVersion: 'v1',
kind: 'ServiceAccount',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'Role',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
rules: [
{
apiGroups: [
'*',
],
resources: [
'*',
],
verbs: [
'*',
],
},
],
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'RoleBinding',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
roleRef: {
apiGroup: 'rbac.authorization.k8s.io',
kind: 'Role',
name: params.name,
},
subjects: [
{
kind: 'ServiceAccount',
name: params.name,
namespace: env.namespace,
},
],
},
]
Π’Π°ΠΊ ΠΆΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² 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 "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: normal Π΄Π»Ρ ΡΠ΅Ρ Π΄ΠΆΠΎΠ±, Π³Π΄Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add .gitlab-ci.yml
git commit -m "Automate docker build"
ΠΡΠΌΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Π»ΠΎ Π½Π°Π·Π²Π°ΡΡ ΡΡΠΎ Π²Π΅ΡΡΠΈΠ΅ΠΉ 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, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
Settings —> CI / CD —> Variables
Π ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ:
Type
Key
Value
Protected
Masked
Scope
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 some/app β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- —force:k8s-context __incluster__ β ΡΡΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΡΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π² ΡΠΎΡΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ΅Ρ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π°ΠΏΡΡΠ΅Π½ gtilab-runner. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ qbec Π±ΡΠ΄Π΅Ρ ΠΏΡΡΠ°ΡΡΡΡ Π½Π°ΠΉΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ Kubernetes-ΡΠ΅ΡΠ²Π΅Ρ Π² Π²Π°ΡΠ΅ΠΌ kubeconfig
- —wait β Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ qbec Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΈΠΌ ΡΠ΅ΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Ready ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Ρ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ exit-code.
- —yes β ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠ΅Π»Π» Are you sure? ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add .gitlab-ci.yml
git commit -m "Automate deploy"
Π ΠΏΠΎΡΠ»Π΅ git push ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π½Π°ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΈ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠ΅Π½Ρ:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°
11. ΠΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΈ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΈ push Π² master
ΠΠ±ΡΡΠ½ΠΎ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠ°Π³ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΏΠΎΡΡΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°, Π½ΠΎ ΠΌΡ Π½Π΅ Ρ ΠΎΡΠΈΠΌ Π²Π΅ΡΠ°ΡΡ ΡΡΠ³ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ°ΠΉΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΠΎΠΉΠ΄ΡΠΌ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΡΡΠΌ ΠΈ Π½Π°ΡΡΡΠΎΠΈΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΠΎ digest Π² master-Π²Π΅ΡΠΊΠ΅.
ΠΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠ°: ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°Π· Π½Π°ΡΠ΅Π³ΠΎ website Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ push Π² master, Π° ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡΡΡ Π² Kubernetes.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΡΡΠΈ Π΄Π²Π΅ Π΄ΠΆΠΎΠ±Ρ Π² Π½Π°ΡΠ΅ΠΌ .gitlab-ci.yml:
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
only:
refs:
- master
- tags
deploy_website:
extends: .deploy_qbec_app
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²Π΅ΡΠΊΡ master ΠΊ refs Π΄Π»Ρ Π΄ΠΆΠΎΠ±Ρ build_website ΠΈ ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ $CI_COMMIT_REF_NAME Π²ΠΌΠ΅ΡΡΠΎ $CI_COMMIT_TAG, ΡΠΎ Π΅ΡΡΡ ΠΌΡ ΠΎΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΡ ΡΡΠ³ΠΎΠ² Π² Git ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΡΠΈΡΡ ΠΎΠ±ΡΠ°Π· Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π²Π΅ΡΠΊΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΠ΅Π³ΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½. Π‘ΡΠΎΠΈΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Ρ ΡΡΠ³Π°ΠΌΠΈ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΠ½Π°ΠΏΡΠΎΡΡ ΡΠ°ΠΉΡΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Π² docker-registry.
ΠΠΎΠ³Π΄Π° ΠΈΠΌΡ docker-ΡΡΠ³Π° Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ°ΠΉΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎ, ΠΌΡ ΠΏΠΎ ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π»Ρ Kubernetes, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π΅ΠΏΠ»ΠΎΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½ΡΠ°.
ΠΠΏΡΠΈΡ —vm:ext-str digest=»$DIGEST» Π΄Π»Ρ qbec β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² jsonnet. ΠΡ Ρ ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΠ΅Π»ΠΈΠ·ΠΎΠΌ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π΅ΠΏΠ»ΠΎΠΈΠ²Π°Π»ΠΎΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΡΡΠ³Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ, ΠΌΡ Π·Π΄Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·Π° ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈ Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ.
ΠΠ΄Π΅ΡΡ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Kaniko ΡΠΎΡ
ΡΠ°Π½ΡΡΡ digest ΠΎΠ±ΡΠ°Π·Π° Π² ΡΠ°ΠΉΠ» (ΠΎΠΏΡΠΈΡ —digest-file)
ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΠΈ ΠΏΡΠΎΡΠΈΡΠ°Π΅ΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π΄Π΅ΠΏΠ»ΠΎΡ.
ΠΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ deploy/website/environments/base.libsonnet ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡΡ ΡΠ°ΠΊ:
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
ΠΠΎΡΠΎΠ²ΠΎ, ΡΠ΅ΠΏΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠΌΠΌΠΈΡ Π² master ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ΅Ρ ΡΠ±ΠΎΡΠΊΡ docker-ΠΎΠ±ΡΠ°Π·Π° Π΄Π»Ρ website, Π° Π·Π°ΡΠ΅ΠΌ Π΅Π³ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add .
git commit -m "Configure dynamic build"
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΠΏΠΎΡΠ»Π΅ git push ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π΄Π»Ρ 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. Dynamic environments
ΠΠ°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π½Π°Ρ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π΄ΠΆΠΎΠ±Ρ build_website Π² Π½Π°ΡΠ΅ΠΌ .gitlab-ci.yml, ΡΠ±ΡΠ°Π² ΠΈΠ· Π½Π΅Ρ Π±Π»ΠΎΠΊ only, ΡΡΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡ Gitlab ΡΡΠΈΠ³Π΅ΡΡΠΈΡΡ Π΅Ρ ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ΅ Π² Π»ΡΠ±ΡΡ Π²Π΅ΡΠΊΡ:
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π΄ΠΆΠΎΠ±Ρ deploy_website, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ΄Π° Π±Π»ΠΎΠΊ environment:
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Gitlab Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΆΠΎΠ±Ρ Ρ prod ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΡ Π΄Π²Π΅ Π΄ΠΆΠΎΠ±Ρ:
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
deploy_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
on_stop: stop_review
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
only:
refs:
- branches
except:
refs:
- master
stop_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
stage: deploy
before_script:
- git clone "$CI_REPOSITORY_URL" master
- cd master
script:
- qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
variables:
GIT_STRATEGY: none
only:
refs:
- branches
except:
refs:
- master
when: manual
ΠΠ½ΠΈ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΏΡΠΈ push Π² Π»ΡΠ±ΡΠ΅ Π±ΡΠ΅Π½ΡΠΈ ΠΊΡΠΎΠΌΠ΅ master ΠΈ Π±ΡΠ΄ΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ preview Π²Π΅ΡΡΠΈΡ ΡΠ°ΠΉΡΠ°.
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ Π½ΠΎΠ²ΡΡ ΠΎΠΏΡΠΈΡ Π΄Π»Ρ qbec: —app-tag β ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ³ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠ΅Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ
ΡΡΠΎΠ³ΠΎ ΡΡΠ³Π°, ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² Π² Kubernetes qbec Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΠΈ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ½Π²Π°ΠΉΡΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ review, Π° ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅.
ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ qbec apply review, Π²ΠΌΠ΅ΡΡΠΎ qbec apply default β ΡΡΠΎ ΠΊΠ°ΠΊ ΡΠ°Π· ΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠΎΡΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π΄Π»Ρ Π½Π°ΡΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ (review ΠΈ default):
ΠΠΎΠ±Π°Π²ΠΈΠΌ review ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² deploy/website/qbec.yaml
spec:
environments:
review:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ²ΠΈΠΌ Π΅Π³ΠΎ Π² deploy/website/params.libsonnet:
local env = std.extVar('qbec.io/env');
local paramsMap = {
_: import './environments/base.libsonnet',
default: import './environments/default.libsonnet',
review: import './environments/review.libsonnet',
};
if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile
Π Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π² deploy/website/environments/review.libsonnet:
// 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-Π²Π΅ΡΠΊΡ ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΠΌ review ΡΠ΅ΡΠ΅Π· Π½Π΅Ρ.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΌΠΎΡΠΎΡΠ½ΠΎ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΠ°ΡΠΈΠ²ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° Ρ ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΡΡΠ».
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ review Π² ΠΎΡΠ΅Π»ΡΠ½ΡΠΉ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ½Π΅ΡΡΠΈ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add .
git commit -m "Enable automatic review"
git push, git checkout -b test, git push origin test, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ environments Π² Gitlab
ΠΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? β ΠΎΡΠ»ΠΈΡΠ½ΠΎ, ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π½Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π²Π΅ΡΠΊΡ: git checkout master, git push origin :test, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΡΠΎ Π΄ΠΆΠΎΠ±Ρ Π½Π° ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ environment ΠΎΡΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠ΄Π΅ΡΡ ΡΡΠ°Π·Ρ Ρ ΠΎΡΠ΅ΡΡΡ ΡΡΠΎΡΠ½ΠΈΡΡ, ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²Π΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π»ΡΠ±ΠΎΠΉ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠ΅Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ .gitlab-ci.yml ΡΠ°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ.
ΠΠΎ ΡΡΠΎΠΌΡ Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ protected-Π²Π΅ΡΠΎΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² master, Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
13. Review Apps
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» .gitlab/route-map.yml ΠΈ ΠΎΠΏΠΈΡΠ°ΡΡ Π² Π½ΡΠΌ Π²ΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΡΡΠ΅ΠΉ, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ:
# Indices
- source: /content/(.+?)_index.(md|html)/
public: '1'
# Pages
- source: /content/(.+?).(md|html)/
public: '1/'
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
git add .gitlab/
git commit -m "Enable review apps"
git push, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ:
Π‘ΠΊΡΠΈΠ½ΡΠΎΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Review App
Job is done!
ΠΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
- Π½Π° Gitlab:
https://gitlab.com/kvaps/docs.example.org - Π½Π° GitHub:
https://github.com/kvaps/docs.example.org
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½Π°Π΄Π΅ΡΡΡ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΠ»ΠΎΡΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com