áááºá¹ááá¬áá«! áááŒá¬áá±ážáá®áá Docker áá¯á¶áá»á¬ážáááºáá±á¬ááºááŒááºážááŸáá·áº Kubernetes ááœáẠááŒáá·áºáá»ááºááŒááºážá¡ááœáẠá¡áááºážá á¬áž á¡á±á¬áºááá¯áááºáá áºáááááá¬áá»á¬ážá áœá¬ááᯠááŒáá·áºáá»ááá²á·áááºá á€ááá á¹á ááŸáá·áº áááºáááºá áá»áœááºá¯ááºááẠGitLab ááŒáá·áº áá á¬ážááẠáá¯á¶ážááŒááºáá²á·ááŒá®áž áááºážá á áœááºážáá±á¬ááºáááºáá»á¬ážááᯠáá±áá»á¬áá±á·áá¬ááŒá®áž ááá¯ááºááá¯ááºážááᯠáá°áá±á¬ááºááẠáá¯á¶ážááŒááºáá²á·áááºá
á€áá¯ááºáááºážááᯠáááºááá¯ááºá០ááŸá¯á¶á·áá±á¬áºáá±ážáá²á·áááºá
á¡áá¬ážáá°áá¯ááºáááºážá ááºááᯠá¡á ááŸáááºáá±á¬ááºááẠááŒáá¯ážá á¬ážáá²á·áá±á¬áºáááºážá Kubernetes ááœáẠá¡ááá®áá±ážááŸááºážáá»á¬ážá¡áá¯á¶ážááŒá¯áá¬ááœáẠá¡áá¯á¶ážááŒá¯áá±á·ááŸááá±á¬ Gitlab CI ááŸáá·áº á¡ááá²á·áá°ážááºáá»á¬ážáá±á«áºááœáẠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬ážáááºáá±á¬ááºáá¬ážáááºá áá®áá±á·áá±á¬á· áá°ááá¯á·á¡ááŒá±á¬ááºáž áá±á¬ááºáááºááŒá±á¬ááŒáááºá
áá±á¬ááºážáá«ážááœáẠá€áá²á·ááá¯á·áá±á¬ áááááá¬áá»á¬ážááᯠááœá±ážááœá±ážáá«áááºá
áá°ááá¯, qbec, áá¬áá®ááá¯, git-crypt О GitLab CI áááºááŒáœáá±á¬áááºáááºážáá»ááºáá»á¬ážáááºáá®ážááŸá¯ááŸáá·áºá¡áá°á
á¡ááŒá±á¬ááºážá¡áá¬
Hugo ááŸáá·áºááœá±á·áá¯á¶áá«á Dockerfile ááá¯ááŒááºáááºááŒááºážá áá¬áá®ááá¯á¡ááŒá±á¬ááºáž áááá¬ááááºá qbec á¡ááŒá±á¬ááºážáááá¬ááŒááºážá Kubernetes-executor ááŒáá·áº Gitlab-runner ááá¯ááŒáá¯ážá á¬ážáá±áá«áááºá qbec ááŒáá·áº Helm ááá¬ážáá»á¬ážááᯠááŒáá·áºáá»ááºááŒááºážá git-crypt ááᯠááááºáááºááŒááºážá áááááá¬áá¯á¶ážáá¯á¶ áááºáá®ážááŒááºážá áá»áœááºá¯ááºááá¯á·á ááááá¯á¶áž ááá¯ááºááá¯ááºážááŸáá·áº áááºáá»á¬ážááŒáá·áº áá¯á¶áá»á¬áž á á¯á ááºážááŸá¯ ááŒáá·áºáá»áẠá¡ááá¯á¡áá»á±á¬ááºá áá Ạá¡áá±ážáá±áž ááœááºážá¡á¬ážáá±áž áá¯ááºáá²á· áááááẠáááºááŒáœáá±á¬áááºáááºážáá»ááºáá»á¬áž á¡ááºááºáá»á¬ážááᯠááŒááºáááºáá¯á¶ážáááºáá«á
1. Hugo ááᯠáááá¬ááŒááºáž
áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºáá¥ááá¬áá áºáá¯á¡áá±ááŒáá·áºá Hugo ááœááºáááºáá±á¬ááºáá¬ážáá±á¬á á¬ááœááºá á¬áááºážáá¯ááºáá±ááŒááºážááá¯ááºááá¯áááºáá®ážáááºááŒáá¯ážá á¬ážáá«áááºá Hugo ááẠstatic content generator áá áºáá¯ááŒá áºáááºá
static generator áá²á· ááááºážááŸá®ážáá²á·áá°ááœá±á¡ááœááºá á¡á²áá«ááœá±á¡ááŒá±á¬ááºáž áááºážáááºážááŒá±á¬ááŒáááºá ááá¬ážááá¯ážáá» áá±áá¬áá±á·á áºáá áºáá¯ááŸáá·áº á¡áá»áá¯á·áá±á¬ PHP áá«ááá·áº ááá¬ážááá¯ážáá» áááºááá¯ááºá¡ááºáá»ááºáá»á¬ážááŸáá·áº ááá°áá²á á¡áá¯á¶ážááŒá¯áá°áá áºáŠážá០áá±á¬ááºážááá¯áá±á¬á¡áá«ááœáẠá á¬áá»ááºááŸá¬áá»á¬áž áá»á¶áá²áᬠáá¯ááºáá±ážááá·áº static áá»ááºááá±áá¬áá»á¬ážááẠá¡áááºážáááºááœá²ááŒá¬ážá áœá¬ áá®ááá¯ááºážáá¯ááºáá¬ážáááºá áááºážááá¯á·ááẠááá·áºá¡á¬áž Markdown markup ááŸáá·áº theme templates ááœáẠááá¯ááºá¡á á¯á¶á¡áááºááŒáá·áº á¡áááºážá¡ááŒá áºáá»á¬ážááᯠáá°ááœáá·áºááŒá¯ááŒá®ážáá±á¬áẠáááºážááá¯á·ááᯠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áááºááá¯ááºáá áºáá¯á¡ááŒá Ạá á¯á ááºážááá¯ááºáááºá
ááá¯á·ááŒá±á¬áá·áºá áááºááẠáááºážááœáŸááºááœá²á·á ááºážáá¯á¶ááŸáá·áº áá¯ááºáá¯ááºáá¬ážáá±á¬ HTML ááá¯ááºáá»á¬áž á¡á á¯á¡áá±ážááᯠáááºáá¶áááŸááááºááŒá áºááŒá®ážá áááºááẠáá±ážáá±á«áá±á¬ hosting áá áºáá¯áá¯ááá¯á· ááá¯ážááŸááºážá áœá¬ á¡ááºáá¯ááºáá¯ááºáᬠá¡áá¯ááºáá¯ááºááá¯ááºáá±á¬ áááºááá¯ááºáá áºáá¯ááᯠáááŸááááºááŒá áºáááºá
Hugo ááᯠá ááºááœááºážááœáẠááá·áºááœááºážááá¯ááºááŒá®áž á ááºážáá¯á¶ážááŒáá·áºááá¯ááºáááº-
ááá¯ááºá¡áá áºáá áºáá¯ááᯠá áááºáá±áááº-
hugo new site docs.example.org
áá áºáá»áááºáááºážááŸá¬ááẠgit repository áááº-
cd docs.example.org
git init
ááá¯á¡áá»áááºá¡áá áá»áœááºá¯ááºááá¯á·á site ááẠááá¯ážááá¯ážááŒá áºááŒá®áž áááºážááœáẠáá áºá á¯á¶áá áºáá¬áá±á«áºáá¬á á±áááºá¡ááœáẠááááŠážá áœá¬ áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒááºá¡áááºáá áºáá¯ááᯠáá»áááºáááºááẠááá¯á¡ááºáá«áááºá áá±á¬ááºáá¯ááºáá áºáá¯ááẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áá¯ááºáá±ážááá·áº ááá°áá¬áá¯á¶á á¶áá»á¬ážááŸáá·áº áááºááŸááºáá¬ážáá±á¬á ááºážáá»ááºážáá»á¬ážáá¬ááŒá áºáááºá
áá±á¬ááºáá¯ááºá¡ááœáẠáá»áœááºá¯ááºááá¯á· á¡áá¯á¶ážááŒá¯áá«áááºá
áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááá¯ááŸá±á¬ááºáááºážááœáẠáá±á¬ááºáá¯ááºááá¯ááºáá»á¬ážááᯠááááºážáááºážáááºáááá¯á¡ááºááŒá±á¬ááºážááᯠá¡áá°ážááá¯ááŒá¯ááá¯áá«áááºá áááºážá¡á á¬áž áááºážááᯠááá¯ážááá¯ážááŸááºážááŸááºážááŒáá·áº áá»áááºáááºááá¯ááºááẠgit submodule:
git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·á ááá¯ááŸá±á¬ááºáá¯á¶ááœáẠáá»áœááºá¯ááºááá¯á·á ááá±á¬áá»ááºááŸáá·áº ááá¯ááºááá¯ááºáááºááá¯ááºááá·áº ááá¯ááºáá»á¬ážáᬠáá«áááºáááºááŒá áºááŒá®áž áá»áááºáááºáá¬ážááá·áº á¡ááŒááºá¡áááºááẠáá®ážááŒá¬ážááá¯ááŸá±á¬ááºááŸá¯áá áºáá¯á ááá·áºááºáá áºáá¯á¡ááŒá ẠááŸááá±áááºááŒá áºááŒá®áž áááºážááœáẠáááááááºáá áºáá¯á¡ááŒá ẠááŸááá±áááºááŒá áºáááºá ááá¯ááá¯áááºááŸá¬ áááºážááᯠáá°áááºážá¡áááºážá¡ááŒá áºá០á¡ááŒá²ááœá²áá¯ááºááá¯ááºááŒá®áž áááŒá±á¬ááºáá«ááŸáá·áºá áááá¬ááááŒá áºáá±á¬á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá
config ááá¯ááŒááºááŒáá¡á±á¬áẠ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
áááºážááœáŸááºá¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž á¡áá»á¬ážáá°ááŸá¬/ áááºá website ááŒá
áºáááá·áºáááºá
áá¯ááºáááºá á
áá¬ážáá
ááºá á¡á²áá«ááᯠáá»ááºáá»ááºážááá·áºááá¯ááºáá¡á±á¬áẠ.gitignore:
echo /public > .gitignore
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .
git commit -m "New site created"
2. Dockerfile ááá¯ááŒááºáááºááŒááºážá
áá»áœááºá¯ááºááá¯á·á repository áááœá²á·á ááºážáá¯á¶ááá¯áááºááŸááºáááºá¡áá»áááºáá±á¬ááºááŒá®á áá»áœááºá¯ááºááẠá¡áá»á¬ážá¡á¬ážááŒáá·áºá
.
âââ deploy
â âââ app1
â âââ app2
âââ dockerfiles
âââ image1
âââ image2
- dockerfiles/ â Dockerfiles áá«ááŸááá±á¬ áááºážááœáŸááºáá»á¬ážááŸáá·áº áá»áœááºá¯ááºááá¯á·á Docker áá¯á¶áá»á¬ážááᯠáááºáá±á¬ááºáááºá¡ááœáẠááá¯á¡ááºáá±á¬ á¡áá¬á¡á¬ážáá¯á¶áž áá«áááºáá«áááºá
- ááŒáá·áºáá»ááº/ â áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠ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 áá¬áá¬) ááŸáá·áº á¡áá»á¬ážáá°ááŸá¬/ â áá»áœááºá¯ááºááá¯á·á áááºááŒáááºá
áœá¬ áá¯ááºáá¯ááºáá¬ážáá±á¬ áááºááá¯ááºá á¡ááŒá±á¬ááºážá¡áá¬á
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. kaniko áááá¬ááŒááºážá
docker image builder áá
áºáá±á¬ááºá¡áá±áá²á· áá»áœááºáá±á¬áºáá¯á¶ážááá¯á· áá¯á¶ážááŒááºááá¯ááºáááºá
áá¯á¶áááºáá±á¬ááºáááºá ááœááºááááºáá¬ááᯠrun ááá¯ááºáá«á kaniko á á®áá¶á¡á¯ááºáá»á¯ááºáá° áááºážááᯠáááºááŸááááºáá±á¬ááºááŸá¯á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá»á±á¬áºááŒááºáá«á áááºážááᯠ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 ááŸááºáá¯á¶áááºááŒááºážááá¯á· á¡ááá¯á¡áá»á±á¬ááºá áááºáááºááŒá áºáááºá
parameter ááẠ-- áááºááŸáº docker registry ááœáẠáááºááŸáºá¡ááœáŸá¬áá»á¬ážááᯠááá·áºá¡á¬áž ááœáá·áºááŒá¯áááºá á¥ááá¬áá±ážáá¬ážááá·áºá¡ááœááºá áááºážááá¯á·ááᯠááááºážáááºážáááºááŒá áºáááºá registry.gitlab.com/kvaps/docs.example.org/website/cacheááá¯á·áá±á¬áº áááºááẠááá·áºáááºáá±á¬ááºááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá¬ážáááºážááŒá±á¬ááºážááᯠáááºááŸááºááá¯ááºáááºá --cache-repo.
docker-registry ááááºáá¬ážááŒááºáá¬ááºáá¯á¶
4. qbec ááᯠáááá¬ááŒááºáž
ááœá²ááŒá¬ážáá±á¬áá±á¬ááºáá»á¬ážááŸáááá·áº á¡á á¯á¡áá±ážáá»á¬ážá áœá¬ááœáẠá¡ááºááºáá®áá±ážááŸááºážáá áºáá¯ááᯠá¡áá¯á¶ážáá»ááẠááá¯á¡ááºááŒá®áž Git ááœáẠáááºážááá¯á·ááᯠááŸááºážááŸááºážáááºážáááºáž áá±á¬áºááŒááá¯ááá·áºááá á¹á áá»á¬ážááœáẠáááºážááẠá¡áá°ážáááŒáá·áº ááŸááºááá¯ááºáááºá
Qbec ááẠááá·áºá¡á¬áž ááá¯á¡ááºáá±á¬ ááá·áºáááºáá±á¬ááºáá»á¬ážááá¯ááŒááºáᬠáááºážááá¯á·á¡á¬áž á¡áá»áá¯ážáá»áá¯ážáá±á¬ áá®áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážáá»ááá¯ááºááẠá¡áá«á¡ááẠáá¯á¶ááŸáẠmanifests áá»á¬ážá¡ááá¯ááºáž áá¯ááºáá±á¬ááºááŒááºážááŒáá·áº Helm ááá¬ážáá»á¬ážááᯠáááºáááºááá¯ááºá á±ááŒá®ážá áááºážááẠááá¯á¡ááºáá»ááºáá»á¬ážááᯠáááºááŸá¬ážááá¯ááºá á±áá«áááºá ChartMuseum ááá¯áá¯á¶ážáá«á ááá¯ááá¯áááºááŸá¬á áááºážááá¯á·ááá¯ááºááá¯ááºááá·áº git ááŸááá¬ážááœááºáá»á¬ážááᯠáááºááááºážáááºážááŒá®áž ááá¯ááºááá¯ááºáááºáááºááá¯ááºáááºá
á á±á¬á á±á¬áááŒá±á¬áá²á·áááá¯áá²á ááŒáá·áºáá»ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáááºážááœáŸááºáá²ááŸá¬ ááááºážáá¬ážáááºá ááŒáá·áºáá»ááº/:
mkdir deploy
cd deploy
áá»áœááºá¯ááºááá¯á·áááááá¯á¶ážáá»áŸá±á¬ááºááœáŸá¬ááᯠá áááºááŒáá«á áá¯á·á
qbec init website
cd website
ááá¯áá»áœááºá¯ááºááá¯á·á application áááœá²á·á ááºážáá¯á¶áááºá€áá²á·ááá¯á·ááŒá áºáááº-
.
âââ 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.áááºáááºážáá»ááºáá»á¬ážá qbec ááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠáá¯á¶áá±áááºáááºážáá»ááºáá
áºáá¯ááᯠáááºáá®ážáá¬ážááŒá®áž áá¬áá¬ááááºá
á¬á¡ááŒáẠáá»áœááºá¯ááºááá¯á·ááááºááŸá kubeconfig á០namespace ááá¯áááºáž áá°áá¬ážáááºá
á¡áᯠáááºááŒáá·áºááá¯ááºáᬠáá»ááºááœáẠáááºáááºážáá»ááºá qbec ááẠáááºááŸááºáá¬ážáá±á¬ Kubernetes á¡á
á¯á¡áá±ážááá¯á·áᬠá¡ááŒá²áááºáž ááŒáá·áºáá»ááºáá¬ážáááºááŒá
áºááŒá®ážá ááá¯ááá¯áááºááŸá¬á ááŒáá·áºáá»ááºáá¯ááºáá±á¬ááºáááºá¡ááœáẠáááºááẠáááºá
ááºá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááŸáá·áº namespaces áá»á¬ážááŒá¬ážááœáẠááŒá±á¬ááºážáá²ááẠáááá¯á¡ááºáá±á¬á·áá«á
ááá¯á¡ááºáá«á áááºááẠá€ááá¯ááºááŸá áááºáááºáá»á¬ážááᯠá¡ááŒá²áááºáž á¡ááºááááºáá¯ááºááá¯ááºáá«áááºá
ááá·áºáááºáááºážáá»ááºá¡á¬ážáá¯á¶ážááᯠáá±á¬áºááŒáá¬ážáá«áááºá qbec.yaml, ááá¯ááºáá²ááŸá¬ params.libsonnetáá°ááá¯á·á¡ááœáẠparameters ááœá±ááᯠáááºááŸá¬áááááºááá¯áᬠááŒá±á¬áá¬ážáááºá
áá±á¬ááºáá áºáá¯á áááºážááœáŸááºááŸá áºáá¯ááᯠááœá±á·ááááºá
- á¡á áááºá¡ááá¯ááºážáá»á¬áž/ â áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážá¡ááœáẠáá±á¬áºááŒáá»ááºá¡á¬ážáá¯á¶ážááᯠá€áá±áá¬ááœáẠááááºážáááºážáá¬ážáááºááŒá áºááŒá®ážá áááºážááá¯á·ááᯠjsonnet ááŸáá·áº áá¯á¶ááŸáẠyaml ááá¯ááºáá»á¬ážááœáẠáá±á¬áºááŒááá¯ááºáááºá
- áááºáááºážáá»ááº/ â á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááááºáááºážáá»ááºá¡ááœáẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ (áá«áá¬áá®áá¬áá»á¬áž) á¡á¬ážáá¯á¶ážááᯠáá±á¬áºááŒáá«áááºá
áá°áááºážá¡á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááœáẠááá¯ááºááŸá áºáá¯ááŸááááº-
- áááºáááºážáá»ááºáá»á¬áž/base.libsonnet - áááºážááœáẠáááºáááºážáá»ááºá¡á¬ážáá¯á¶ážá¡ááœáẠáá¯á¶áá±á¬ááºáá»á¬ážáá«ááŸááááºá
- environments/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 entities áá¯á¶ážáá¯ááᯠáá áºááŒáá¯ááºááẠáá±á¬áºááŒáá²á·ááŒá®ážá áááºážááá¯á·ááŸá¬- ááŒááºá·áá»ááº, áááºáá±á¬ááºááŸá¯ О Ingress. áá»áœááºá¯ááºááá¯á·á¡ááá¯ááŸááá«á áááºážááá¯á·ááᯠááá°áá®áá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬ážá¡ááŒá Ạááá·áºááœááºážááá¯ááºáá±á¬áºáááºáž á€á¡ááá·áºááœáẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠáá¯á¶áá±á¬ááºáááºááŒá áºáááºá
syntax jsonnet áá¯á¶ááŸáẠjson ááŸáá·áº á¡ááœááºáááºáá°áááºá áááá¬áá¡á¬ážááŒáá·áºá áá¯á¶ááŸáẠjson ááẠááá¬ážááẠjsonnet ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº á¡á ááá¯ááºážááœáẠáááºáá²á·ááá¯á· á¡áœááºááá¯ááºážáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯ááá¯ááœááºáá°áá±áááºá yaml2json áááºááá¯á¶ááŸáẠyaml ááᯠjson ááá¯á·ááŒá±á¬ááºážááẠááá¯á·ááá¯áẠááá·áºá¡á áááºá¡ááá¯ááºážáá»á¬ážááœáẠááááºážááŸááºáá»á¬ážááá«áááºáá«á áááºážááá¯á·ááᯠáá¯á¶ááŸáẠyaml áá¯á¶á á¶ááŒáá·áº áá±á¬áºááŒááá¯ááºáá«áááºá
á¡áá°á¡áá¯ááºáá¯ááºáá²á·á¡áá« jsonnet áááºááááºážááŒááºáá°á¡ááœáẠááááºá¡ááºáá áºáᯠááá·áºááœááºážááẠá¡áá°ážá¡ááŒá¶ááŒá¯ááá¯áá«áááºá
á¥ááá¬á vim á¡ááœáẠplugin áá áºáá¯ááŸááááºá vim-jsonnetsyntax highlighting ááá¯ááœáá·áºááŒá®áž á¡ááá¯á¡áá»á±á¬áẠexecute áá¯ááºáááºá jsonnet fmt áááºááááºážáááºážááá·áºá¡áá»áááºááá¯ááºáž (jsonnet ááá·áºááœááºážááẠááá¯á¡ááºáááº)á
á¡á¬ážáá¯á¶ážá¡áááºááá·áºááŒá áºáá«ááŒá®á ááᯠáá»áœááºá¯ááºááá¯á· á áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«ááŒá®-
áá«ááá¯á·áá¬ááœá±ááá²ááá¯áá¬ááŒáá·áºáá¡á±á¬ááºá
qbec show default
á¡ááœááºááœááºá áá¯á¶áá±á¡á á¯á¡áá±ážááá¯á· á¡áá¯á¶ážáá»ááá·áº rendered yaml manifests ááᯠáááºááœá±á·ááá«áááºá
áá±á¬ááºážááŒá®á ááá¯áá»áŸá±á¬ááºáá¬ážáá«-
qbec apply default
á¡ááœááºááœáẠááá·áºá¡á á¯á¡áá±ážááœáẠáááºááá·áºá¡áá¬áá¯ááºáá±á¬ááºáááºááᯠáááºá¡ááŒá²ááœá±á·áááá·áºáááºá qbec ááẠá á¬ááá¯ááºááŒááºážááŒáá·áº ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠááá±á¬áá°ááẠááá·áºá¡á¬áž áá±á¬ááºážááá¯áááá·áºááẠy áááºážáá²á· áááºááœááºáá»ááºááœá±ááᯠá¡áááºááŒá¯ááá¯ááºáááá·áºáááºá
áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážááẠá¡áááºááá·áºááŒá áºááŒá®áž á¡áá¯á¶ážááŒá¯ááá¯ááºáá«ááŒá®á
á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááŒá¯áá¯ááºáá«áá áááºá¡ááŒá²áá¯ááºááá¯ááºáááº-
qbec diff default
á€ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáááºááŸáá¡áá¯á¶ážááŒá¯ááŸá¯ááᯠáááºááá¯á·á¡áá»áá¯ážáááºáá±á¬ááºáááºááᯠááŒáá·áºááŸá¯áááº
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
cd ../..
git add deploy/website
git commit -m "Add deploy for website"
5. Kubernetes-executor ááŒáá·áº Gitlab-runner ááᯠá
ááºážáá¯á¶ážááŒáá·áºáá«á
áááŒá¬áá±ážáááºá¡áááá±á¬á· áá¯á¶ááŸááºáá²áá¯á¶ážáááºá gitlab-á¡ááŒá±ážááá¬áž shell ááá¯á·ááá¯áẠdocker-executor áá«ááŸááá±á¬ ááŒáá¯áááºááŒááºáááºáá¬ážáá±á¬á áẠ(LXC container) áá±á«áºááœááºá áááŠážááœááºá áá»áœááºá¯ááºááá¯á·ááœáẠáá»áœááºá¯ááºááá¯á·á gitlab ááœáẠááá¹áá¬á¡ááŸá¶á·áááºááŸááºáá¬ážáá±á¬ ááá¯áá²á·ááá¯á·áá±á¬á¡ááŒá±ážááá¬ážáá»á¬ážá áœá¬ááŸááááºá ááá±á¬áá»ááºá¡á¬ážáá¯á¶ážá¡ááœáẠdocker áá¯á¶áá»á¬ážááᯠá á¯áá±á¬ááºážáá²á·ááŒáááºá
ááá¯á·áá±á¬áº áááºááœá±á·ááŒááá¬ážááá·áºá¡ááá¯ááºážá á€ááœá±ážáá»ááºááŸá¯ááẠáááºááœá±á·áá»ááŸá¯ááŸáá·áº áá±ážáááºážááŸá¯ ááŸá áºáá»áá¯ážáá¯á¶ážááœáẠá¡áá±á¬ááºážáá¯á¶ážááá¯ááºáá±á ááá±á¬áá»ááºáá áºáá¯á á®á¡ááœáẠááá¯á·ááá¯áẠáááºáááºážáá»ááºáá áºáá¯á á®á¡ááœáẠáá®ážááŒá¬ážá¡ááŒá±ážááá¬ážáá»á¬ážááᯠá¡áá¯á¶ážáá»ááŒááºážááẠááá¯ááá±á¬ááºážááœááºááŒá®áž á¡ááœá±ážá¡áá±á«áºá¡á ááá¯áááŸááºáááºáá«áááºá
áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á á€áááºááŸá¬ ááŒá¿áá¬ááá¯ááºáá«á ááá¯ááááºážá áá»áœááºá¯ááºááá¯á· ááŒáá·áºáá»ááºááá¯ááºáá«áááºá gitlab-á¡ááŒá±ážááá¬áž Kubernetes ááŸá áá»áœááºá¯ááºááá¯á·á ááá±á¬áá»ááºá áá áºá áááºáá áºááá¯ááºážá¡ááŒá Ạááá¯ááºááá¯ááºá
Gitlab ááẠKubernetes ááá¯á· gitlab-runner ááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážááá·áº áŠážáá¯ááºááá¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá áá«ááŒá±á¬áá·áº áááºáá¯ááºáááŸá¬á ááá¡á±á¬ááºáá¯ááºáá«á ááŸááºáá¯á¶áááºááŒááºážááá¹ááá¬áááºáá± áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºá¡ááœáẠáááºáááºáá»á¬áž -> CI / CD -> ááŒá±ážáá°áá»á¬áž áá²á·á ááºááá¯á· ááœáŸá²áá
helm repo add gitlab https://charts.gitlab.io
helm install gitlab-runner
--set gitlabUrl=https://gitlab.com
--set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc
--set rbac.create=true
gitlab/gitlab-runner
áááºááŸá¬:
https://gitlab.com â ááá·áº Gitlab áá¬áá¬áááááºá á¬á- yga8y-jdCusVDn_t4Wxc - ááá·áºááá±á¬áá»ááºá¡ááœáẠááŸááºáá¯á¶áááºá¡ááŸááºá¡áá¬ážá
- rbac.create=á¡ááŸáẠ- kubernetes-executor ááá¯á¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·ááá¬áááºáá»á¬ážááá¯áá¯ááºáá±á¬ááºáááºá¡ááœáẠpods áá»á¬ážáááºáá®ážááá¯ááºá á±áááºá¡ááœáẠááá¯á¡ááºáá±á¬á¡ááœáá·áºáá°ážáá»á¬ážááᯠá¡ááŒá±ážááá¬ážá¡á¬áž áá¶á·ááá¯ážáá±ážáá«áááºá
á¡á¬ážáá¯á¶ážááŸááºáááºá áœá¬áá¯ááºáá±á¬ááºáá«áá ááá¹áááœááºá á¬áááºážááœááºážáá¬ážáá±á¬á¡ááŒá±ážááá¬ážááá¯ááœá±á·ááá«áááºá á¡ááŒá±ážááá¬ážááá·áºááá±á¬áá»ááºáááºáááºáá»á¬ážááœááºá
ááá·áºáá¬ážáá±á¬ á¡ááŒá±ážááá¬ážá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
á¡á²áá« ááá¯ážááŸááºážááá¬ážá - áá¯ááºáááºá áá«áááá¯ážááŸááºážáááºá á¡ááŒá±ážááá¬ážáá»á¬ážááᯠááá¯ááºááá¯ááºá á¬áááºážááœááºážááŒááºážááŒáá·áº á¡ááŸá±á¬ááºá¡ááŸááºáááŒá áºáá±á¬á·áá² ááá¯á¡áá»áááºááŸá á á¡ááŒá±ážááá¬ážáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠáááºáá®ážááŒá®áž áá»ááºáá®ážááœá¬ážáá«áááºá
6. QBEC ááŒáá·áº Helm ááá¬ážáá»á¬ážááᯠá¡áá¯á¶ážáá»áá«á
á ááºážá á¬ážáá¯á¶ážááŒááºááŒá®ážááááºážá gitlab-á¡ááŒá±ážááá¬áž áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááá áºá áááºáá áºááá¯ááºážá áá»áœááºá¯ááºááá¯á·á Git repository ááœáẠáááºážááá¯áá±á¬áºááŒáááºá¡áá»áááºáá±á¬ááºááŒá®á
áááºážááᯠáá®ážááŒá¬ážá¡á áááºá¡ááá¯ááºážáá áºáá¯á¡ááŒá Ạáá»áœááºá¯ááºááá¯á·áá±á¬áºááŒááá¯ááºáááºá ááºááºááá¯ááºáá«áá±ááá·áº á¡áá¬áááºááŸá¬ ááá°áá®áá²á· áá±á¬áºáá®ááœá±ááᯠááŒáá·áºáá»ááºááá¯á· á á®á ááºáá±áá«áááºá ááºááºááá¯áẠá¡ááœááºáááŒá¬áá, ááá°áá«á gitlab-á¡ááŒá±ážááá¬ážKubernetes á¡á á¯á¡áá±ážáá áºáá¯áá»áŸáẠáá áºááŒáááºáᬠá¡áá¯á¶ážááŒá¯áá«áááºá ááá¯á·ááŒá±á¬áá·áº áááºážá¡ááœáẠáá®ážááŒá¬ážá¡ááºááºáá áºáá¯ááᯠá áááºááŒáá«á áá¯á·á
cd deploy
qbec init gitlab-runner
cd gitlab-runner
ááá¯áá áºááŒáááºááœáẠKubernetes entities áá»á¬ážááᯠááá¯ááºááá¯ááºáá±á¬áºááŒáááºááá¯ááºáá±á¬áºáááºáž á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ Helm ááá¬ážááᯠáá°áá«áááºá qbec áá¡á¬ážáá¬áá»ááºáá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ Helm ááá¬ážáá»á¬ážááᯠGit repository ááŸááá¯ááºááá¯ááºáááºáááºááá¯ááºááŒááºážááŒá áºáááºá
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,
}
)
ááááá¯á¶áž áááºááŒá±áá±ážááá¯ááºáááºá ááá¯ážáá»á²á· HelmTemplate áá«ááᯠááá¬ážááᯠááŒááºááœá¬ážáááºá params.values ââáá»á¬ážáááºáááºážáá»áẠáá±á¬ááºáá»á¬ážá០áá»áœááºá¯ááºááá¯á·áá°áá±á¬á ááá¯á·áá±á¬áẠá¡áá¬ááá¹áá¯ááŸáá·áºá¡áá° áá«áá¬áááºá
- á¡áááºáá¯á¶á ᶠ- áá¯ááºáá±ááŸá¯áá±á«ááºážá ááº
- 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,
},
},
},
}
áá»á±ážáá°ážááŒá¯. áááááŒá¯áá« runnerRegistrationToken áá»áœááºá¯ááºááá¯á·ááẠááŒááºáááá¯ááºáá áºáá¯á០áá°áááºá áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬áž/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 áá±á¬á·áá áºáá¯ááŸááá«áá áááºááẠá€ááá±á¬áá»ááºá¡ááœáẠáá°ážáá±á«ááºážáá¯ááºáá±á¬ááºáá°á¡ááŒá Ạááá·áºááá¯ááºááẠáá»ááºáá»ááºážááá·áºááá¯ááºáááº-
git-crypt add-gpg-user [email protected]
á€áááºážááŒáá·áº áááºááẠáááºáááá¯ááºááá¯ááºáá±á¬á·ááᯠá¡áá¯á¶ážááŒá¯á á€ááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž á¡ááŒá²áááºážá á¬ááŸááºááá¯ááºáá«áááºá
ááá·áºááœáẠPGP áá±á¬á·áááŸááá«á áááºážááᯠááá»áŸá±á¬áºááá·áºáá¬ážáá«áá áááºááẠá¡ááŒá¬ážáá áºáááºááá¯á·ááœá¬ážáᬠááá±á¬áá»ááºáá®ážááᯠáá¯ááºáá°ááá¯ááºáááº-
git crypt export-key /path/to/keyfile
ááá¯á·ááŒá áºáᬠáááºáá°áááᯠááŒááºáááá¯á· áááºááá¯á·ááœáá·áºááŸááááºá áá±á¬á·ááá¯áẠáááºáááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž áá¯ááºáá¯ááºáá»ááºááá¯ááºáá«áááºá
áá»áœááºá¯ááºááá¯á·á ááááá¯á¶ážáá»áŸáá¯á·ááŸááºáá»ááºááᯠáááºááŸááºááẠá¡áá»áááºáá±á¬ááºááŒá®á
áá»áœááºá¯ááºááá¯á·ááẠáááºážááœáŸááºááœááºááŸááá±áá²ááŒá
áºááŒá±á¬ááºáž ááááá±ážáá«áá
á± deploy/gitlab-runner/áá»áœááºá¯ááºááá¯á·ááœáẠáááºážááœáŸááºáá
áºáá¯ááŸááááºá áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬áž/ááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯ááºááŸááºááŒáá«á
áá¯á·á á€á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá
áºáá¯ááᯠáááºáá®ážáá«áááºá áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬áž/.gitattributes á¡á±á¬ááºáá«á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áºá¡áá°
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
á¡ááŒá±á¬ááºážá¡áá¬á០ááŒááºááœá±á·ááá¯ááºááá²á·ááá¯á·á ááá¯ááºá¡á¬ážáá¯á¶ážááᯠáá¯á¶ážá¡á¯ááºáá¬ážáááºá * ááŒááºáááºážáá±á¬ááºážááŸááºáááºááŒá áºáááºá git-cryptá¡áá»á¬ážá á¯ááŸááœá²á .gitattributes
áááºážááᯠrun ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á· á á áºáá±ážááá¯ááºáááº-
git crypt status -e
á¡ááœááºááẠáá¯ááºááŸááºááŒááºážááᯠááœáá·áºáá¬ážááá·áº ááá¯ááŸá±á¬ááºáááºážááŸá ááá¯ááºá¡á¬ážáá¯á¶ážá á á¬áááºážáá áºáᯠááŒá áºáááá·áºáááºá
áá«áá«áá²á ááᯠáá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯á¶ááŒá¯á¶á áœá¬ áááááŒá¯ááá¯ááºáá«ááŒá®-
cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"
repository ááá¯ááááºááá¯á·áááºá run ááá¯ááºáá¯á¶ááŒáá·áº-
git crypt lock
encrypt áá¯ááºáá¬ážáá±á¬ááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠbinary áá
áºáá¯áá¯á¡ááŒá
áºááá¯á·ááŒá±á¬ááºážáá²ááœá¬ážáááºááŒá
áºááŒá®ážá áááºážááá¯á·ááá¯áááºáááºáááŒá
áºááá¯ááºáá«á
ááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž áá¯ááºááŸááºáááºá áá¯ááºáá±á¬ááºáááº-
git crypt unlock
8. áááááá¬áá¯á¶ážáá¯á¶ áááºáá®ážáá«á
áááááá¬áá¯á¶ážáá¯á¶ááẠáá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áº áááááá¬á¡á¬ážáá¯á¶ážáá«ááá·áº áá¯ááºáá¯á¶ááŒá áºáááºá áá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯ááŸá¯áá¯ááºáá±á¬ááºááẠGitlab á¡ááŒá±ážááá¬ážá áááºážááá¯á¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá
á¡áá¬á¡á¬ážáá¯á¶ážá ááá¯ážááŸááºážáá«áááºá á¡áá áºáá áºáá¯ááᯠáááºáá®ážááá¯ááºááŒáá¡á±á¬áẠdockerfiles/toolbox/Dockerfile á¡á±á¬ááºáá«á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áºá¡áá°
FROM alpine:3.11
RUN apk add --no-cache git git-crypt
RUN QBEC_VER=0.10.3
&& wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz
| tar -C /tmp -xzf -
&& mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/
RUN KUBECTL_VER=1.17.0
&& wget -O /usr/local/bin/kubectl
https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl
&& chmod +x /usr/local/bin/kubectl
RUN HELM_VER=3.0.2
&& wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz
| tar -C /tmp -zxf -
&& mv /tmp/linux-amd64/helm /usr/local/bin/helm
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá á€áá¯á¶ááœáẠáá»áœááºá¯ááºááá¯á·áá¡ááºááºáá®áá±ážááŸááºážááᯠá¡áá¯á¶ážááŒá¯áááºá¡áá¯á¶ážááŒá¯ááá·áº utilities á¡á¬ážáá¯á¶ážááᯠááá·áºááœááºážáá¬ážáá«áááºá ááá¯ááºááẠáá®ááŸá¬ áááá¯á¡ááºáá«áá°ážá kubectlááá¯á·áá±á¬áº ááá¯ááºááá¯ááºážáááºáá±á¬ááºááŸá¯á¡ááá·áºááœáẠáááºážááᯠáááºáá á¬ážááá¯áá±áááºá
ááá¯á·á¡ááŒáẠKubernetes ááŸáá·áº áááºááœááºááŒá®áž áááºážááᯠá¡áá¯á¶ážáá»ááá¯ááºáááºá gitlab-runner á០áá¯ááºáá¯ááºááá·áº pods áá»á¬ážá¡ááœáẠá¡áááºážááá¹áááᯠáááºááŸááºááẠááá¯á¡ááºáá«áááºá
áá«ááá¯áá¯ááºááá¯á· gitlab-runner áá²á· directory ááá¯ááœá¬ážááŒáá·áºáá¡á±á¬ááºá
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. áá»áœááºá¯ááºááá¯á·á ááááá¯á¶áž ááá¯ááºááá¯ááºážááŸáá·áº tags áá»á¬ážááŒáá·áº áá¯á¶áá»á¬áž áááºáááºááŒááºážá
ááá±á¬áá»ááºáá²á· á¡ááŒá áºááŸá¬ áá«ááá¯á· áááºáá®ážáááºá .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- áá¯á¶ááŸáẠáááºááá¯ááºáá±á¬ááºáá®ááœáẠsubmodule áá»á¬ážááᯠá¡áá°ážááááºá áááºáááºááá¯á¡ááºááá·áº ááá¯á¡áá¯ááºáá»á¬ážá¡ááœááºá
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .gitlab-ci.yml
git commit -m "Automate docker build"
áá«ááᯠáá¬ážááŸááºážá¡ááŒá Ạáá¯á¶ááŒá¯á¶á áœá¬ áá±á«áºááá¯ááºáááºááá¯á· áááºáá«áááºá v0.0.1 ááŸáá·áº tag ááá¯ááá·áºáá«
git tag v0.0.1
áá»áœááºá¯ááºááá¯á·ááẠáá¬ážááŸááºážá¡áá áºááᯠáá¯ááºáá±ááẠááá¯á¡ááºááá·áºá¡áá«ááá¯ááºáž áááºáá»á¬ážááᯠáá±á«ááºážááá·áºáá«áááºá Docker áá¯á¶áá»á¬ážááŸá áááºáá»á¬ážááᯠGit áááºáá»á¬ážááŸáá·áº áá»áááºáááºáá«áááºá áááºááºá¡áá áºáá áºáá¯ááŒáá·áº ááœááºážááá¯ááºááá¯ááºážááẠá€áááºááºááŒáá·áº áá¯á¶áá»á¬ážá áááºáá±á¬ááºááŸá¯ááᯠá¡á ááŒá¯áááºááŒá áºáááºá
áá¯ááºááá¯ááºááŒáá¡á±á¬áẠgit push --tagsáá»áœááºá¯ááºááá¯á·á ááááá¯á¶áž ááá¯ááºááá¯ááºážááᯠááŒáá·áºááŒáá«á áá¯á·á
áááááá¯ááºááá¯ááºážá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
tags áá»á¬ážááŒáá·áº áááºáááºááŒááºážááẠdocker áá¯á¶áá»á¬ážááᯠáááºáá±á¬ááºáááºá¡ááœáẠááá·áºáá»á±á¬áºáá±á¬áºáááºáž Kubernetes á¡ááºááá®áá±ážááŸááºážááᯠá¡áá¯á¶ážáá»ááŒááºážá¡ááœáẠáááá·áºáá±á¬áºááŒá±á¬ááºážááᯠááá·áºá¡á¬áá¯á¶á áá¯ááºááá·áºáá«áááºá áááºá¡áá áºáá»á¬ážááᯠáááááááºáá±á¬ááºážáá»á¬ážááœáẠáá¬áááºáá±ážá¡ááºááá¯ááºáá±á¬ááŒá±á¬áá·áºá á€á¡ááŒá±á¡áá±ááœááºá áááºážááá¯á·á¡ááœáẠááá¯ááºááá¯ááºážááᯠá¡á ááŒá¯ááŒááºážááŒáá·áº áá¬ážááŸááºážáá±á¬ááºážááᯠááŒáá·áºáá»ááºááŒááºážááá¯á· áŠážáááºááœá¬ážá á±áááºááŒá áºáááºá
á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážáááºá á¡áá»á¬ážá¡á¬ážááŒáá·áº docker áá¯á¶áá»á¬ážáááºáá±á¬ááºááŒááºážááᯠtags áá»á¬ážááŸáá·áºáá»áááºáááºáá¬ážááŒá®áž application ááᯠáá¬áááœá²áá áºáá¯ááá¯á· á¡áá¯á¶ážáá»ááŒááºáž áá¬á áá¬á á¯áá±á¬ááºážáá¬ážáá±á¬ áá¯á¶áá»á¬ážá áá¬ážááŸááºážáá»á¬ážááœáẠhardcode áá¯ááºáá¬ážáá«áááºá á€áááºááŸá¬ ááá¯ážááŸááºážáá±á¬ ááŒááºááŒá±á¬ááºážááŸá¯ááŒáá·áº rollback ááᯠá áááºááá¯ááºááẠáá¬á áá¬- ááá¯ááºážá
10. á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºáá»ááºááŸá¯
Gitlab-runner ááẠáá»áœááºá¯ááºááá¯á·ááá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááᯠáá¯ááºááŸááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠrepository key ááᯠáá¯ááºáá°ááŒá®áž áá»áœááºá¯ááºááá¯á·á CI áááºáááºážáá»ááºááœáẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ááááºážááŸááºáá»á¬ážááá¯á· ááá·áºááẠááá¯á¡ááºáá«áááº-
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo
áá»áœááºá¯ááºááá¯á·ááẠGitlab ááœáẠáááŸááá¬áá±á¬ ááá¯ááºážááᯠááááºážáááºážáá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá áá»áœááºá¯ááºááá¯á·á ááá±á¬áá»ááºáááºáááºáá»á¬ážááá¯á· ááœá¬ážááŒáá«á
áá¯á·á
áááºáááºáá»á¬áž -> CI / CD -> Variables
ááŒá®ážáá±á¬á· variable á¡áá áºáá áºáá¯ááᯠáááºáá®ážááŒáá·áºáá¡á±á¬ááºá
áá¯á¶á
á¶
áá±á¬á·
á¡ááá¯áž
protected
áá»ááºááŸá¬áá¯á¶áž
scope
File
GITCRYPT_KEY
<your string>
true
(áááºáááºážáá»áááºá¡ááœááºáž áááºááá¯ááºáááºá false
)
true
All environments
ááá·áºáá¬ážáá±á¬ variable á áááºáá¬ážááŒááºáá¬ááºáá¯á¶
ááá¯áá»áœááºá¯ááºááá¯á·á update ááá¯ááŒáá«á áá¯á· .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-context __incluster__ - áááºážááẠgtilab-runner áá¯ááºáá±á¬ááºáá±ááá·áº áá°áá®áá±á¬á¡á á¯á¡áá±ážááœáẠááŒáá·áºáá»ááºááŸá¯ ááŒá áºáá±á«áºáá¬áááºáᯠááŒá±á¬áá¬ážááá·áº ááŸá±á¬áºááááºážááŸááºáá áºáá¯ááŒá áºáááºá ááá¯ááºáá«á qbec ááẠááá·áº kubeconfig ááœáẠááá·áºáá»á±á¬áºáá±á¬ Kubernetes áá¬áá¬ááᯠááŸá¬ááœá±á·ááẠááŒáá¯ážá á¬ážáááºááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááẠááá¯á¡ááºáá«áááºá
- --á á±á¬áá·áº â áááºážáááºáá®ážáá¬ážáá±á¬áááºážááŒá áºáá»á¬ážááẠReady state ááá¯á·áá±á¬ááºááŸááááºá¡ááá á±á¬áá·áºááá¯ááºážááẠqbec á¡á¬áž ááœááºážá¡á¬ážáá±ážááŒá®áž á¡á±á¬ááºááŒááºáá±á¬ exit-code ááŒáá·áºááœááºáá«á
- -áá¯áẠ- á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯ shell ááá¯ááá¯ážááŸááºážá áœá¬ááááºáá¬ážáá«á áá±áá»á¬áá¬áž? áááºááŒáá·áºáá±á¬á¡áá«á
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .gitlab-ci.yml
git commit -m "Automate deploy"
ááŒá®ážá០git ááœááºáž áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯áá¬ážáááºááᯠáá»áœááºá¯ááºááá¯á· ááŒááºááœá±á·ááá«áááº-
áá¯áááááá¯ááºááá¯ááºážá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
11. áá»áœááºážáá»ááºááá¯á· ááœááºážá¡á¬ážáá±ážáá²á· á¡áá«ááŸá¬ áá
á¹á
ááºážááœá±áá²á· á
á¯áá±ážááŸá¯ááœá±á
áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬á¡ááá·áºáá»á¬ážááẠáááºááá·áº microservice áá»á¬ážáá®ážáá«ážááá¯áááᯠáááºáá±á¬ááºááŒá®áž áá±ážááá¯á·ááẠáá¯á¶áá±á¬ááºáá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·ááẠáááºááá¯ááºááᯠá¡ááºááááºáá¯ááºááẠááá¯á¡ááºááá¯ááºáž áááºááᯠáááá·áºááá¯áá«á ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯ááœááºáááºáá±á¬áááºážááŒá±á¬ááºážááá¯áá°áᬠáá¬á áá¬áá¬áááœá²ááœáẠá¡áá»á±á¡áááºááŒáá·áºáá»ááºááŸá¯áá áºáá¯ááᯠáááºáá±á¬ááºáá«áááºá
á¡áá¯ááºáá®áá¬á ááá¯ážááŸááºážáá«áááº- á¡áᯠáá«ááá¯á·áá²á· áá¯á¶áááẠááºááºááá¯áẠááœááºážááá¯ážááá¯ááºááá¯ááºáž ááŒááºáááºáááºáá±á¬ááºáá«áááºá áá¬á áá¬ááŒá®ážáá±á¬áẠ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 ááŸá tag áá»á¬ážááŸáá·áº áá»áááºáááºáá¬ážááŒá®áž ááᯠááá¯ááºááá¯ááºážááᯠá¡á ááŒá¯áá²á·áá±á¬ commit áá¬áááœá²á á¡áááºááŒáá·áº áá¯á¶áá áºáá¯ááᯠááœááºážááá¯á·áá«áááºá áááºážááẠdocker-registry ááœáẠáá®ážááŒá¬ážáá¬ážááŸááºážáá áºáá¯áá«ááá·áº áááºááá¯ááºáá áºáá¯á áá»áŸááºáá áºááŒááºááá¯ááºáá»ááºáá»á¬ážááᯠááááºážáááºážááá¯ááºá á±ááá·áº tags áá»á¬ážááŸáá·áºáááºáž áá¯ááºáá±á¬ááºááá¯ááºáááºááᯠáááááŒá¯ááá·áºáá«áááºá
ááá¯ááºááá¬ážááŸááºážá¡áá áºá¡ááœáẠdocker tag áá¡áááºááᯠáááŒá±á¬ááºážáá²ááá¯ááºáá«á Kubernetes ááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáá±á¬áºááŒááẠááá¯á¡ááºáá±áá±ážáááºá ááá¯á·ááá¯ááºáá«á áááºážááẠá¡ááá®áá±ážááŸááºážááᯠáá¯á¶á¡áá áºá០ááŒááºáááºá¡áá¯á¶ážáá»áááºááá¯ááºáá«á ááŒáá·áºáá»ááºááŸá¯ áááºááŸá¬ážáááºá
ááœá±ážáá»ááºá áᬠâvm:ext-str digest=â$DIGESTâ qbec á¡ááœáẠ- ááá·áºá¡á¬áž jsonnet ááá¯á· ááŒááºáááááºážááŸááºáá áºáá¯ááᯠááŒááºáááºážááœáá·áºááŒá¯áááºá áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážáá¯ááºááŒá®ážááá¯ááºáž áááºážááᯠá¡á á¯á¡áá±ážááœáẠááŒááºáááºá¡áá¯á¶ážáá»á á±ááá¯áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠáá¯á¶á áá®ážááŒá¬ážáá¬ážááŸááºážáá áºáá¯ááŸáá·áº áá»áááºáááºáá¬ážááẠááá¯á¡ááºááŒá®áž ááŒá±á¬ááºážáá²ááá·áºá¡áá«ááœáẠá¡áá¯á¶ážááŒá¯ááŸá¯ááᯠá¡á áá»áá¯ážááẠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº ááá¯á¡áá«ááœáẠáááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áááºá¡áááºááᯠáá»áœááºá¯ááºááá¯á· á¡áá¯á¶ážáááŒá¯ááá¯ááºáá±á¬á·áá«á
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠKaniko á á¡ááŸá
áºáá»á¯ááºáá¯á¶áá
áºáá¯á¶ááᯠááá¯ááºáá
áºáá¯ááá¯á· ááááºážáááºážááẠáá°áá®áá±ážáá«ááẠ(ááœá±ážáá»ááºááŸá¯ --digest-ááá¯ááº)
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠá€ááá¯ááºááᯠááœáŸá²ááŒá±á¬ááºážááŒá®áž á¡áá¯á¶ážááŒá¯áá»áááºááœáẠáááºážááᯠáááºáá«áááºá
áá»áœááºá¯ááºááá¯á·á¡ááœáẠááá·áºáááºáá»ááºáá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒáá«á áá¯á· deploy/website/environments/base.libsonnet ááá¯á€áá²á·ááá¯á·ááŒááºááááá·áºáááº-
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
ááŒá®ážáá«ááŒá®á áá áºáá¯áá¯ááᯠáá»á°ážááœááºááá¯ááºáá«á áá¬á áᬠdocker image á áááºáá±á¬ááºááŸá¯ááᯠá¡á ááŒá¯áááºá ááºááºááá¯ááºááŒá®ážáá±á¬áẠáááºážááᯠKubernetes ááá¯á· á¡áá¯á¶ážáá»áá«á
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .
git commit -m "Configure dynamic build"
áá±á¬ááºá០á á áºáá±ážáá«á·ááẠgit ááœááºáž á€áá²á·ááá¯á·áá±á¬á¡áá¬ááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááá·áºáááº-
áá¬á áá¬á¡ááœáẠááá¯ááºááá¯ááºážá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
áá°á¡áá áá»áœááºá¯ááºááá¯á·ááẠ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/**/*
á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºááá¯ááºáááºááŒá áºáááºá deploy/gitlab-runner/ áá áºáá¯áá¯ááŸáááŸáá¬áá»áŸáẠáá»áœááºá¯ááºááá¯á·áá¡áá¯ááºááᯠá áááºáááºááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"
git ááœááºáž, áá«ááá¯áá±á¬ááºážáááº:
ááœááºážáá¶áá¬ážáá±á¬ ááá¯ááºááá¯ááºážá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
12. áááºááŒáœáá±á¬áááºáááºážáá»ááºáá»á¬áž
áá»áœááºá¯ááºááá¯á·á ááá¯ááºááá¯ááºážá¡á¬áž áááºááŒáœáá±á¬áááºáááºážáá»ááºáá»á¬ážááŒáá·áº ááœá²ááŒá¬ážá¡á±á¬ááºááŒá¯áá¯ááºááẠá¡áá»áááºáááºááŒá®á
ááááá¯á¶áž á¡áá¯ááºá¡ááºááááºáá¯ááºááŒáá·áºáá¡á±á¬áẠbuild_website áá«ááá¯á·áá²á· .gitlab-ci.ymlááá±á¬ááºááᯠáááºááŸá¬ážááá¯ááºáá«á áá¬Gitlab ááẠáááºááá·áºáá¬áááœá²ááá¯áááᯠáááááááºááŒá¯ááŸá¯ááœáẠáááºážááᯠá¡á áá»áá¯ážááẠááœááºážá¡á¬ážáá±ážáááá·áºáááº-
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
ááá¯á·áá±á¬áẠá¡áá¯ááºá¡ááºááááºáá¯ááºáá«á deploy_websiteá¡á²áá®ááŸá¬ ááá±á¬ááºáá áºáá¯ááá·áºáá«á áááºáááºážáá»ááº:
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
áááºážááẠGitlab ááŸáá·áº á¡áá¯ááºááœá²áá¯ááºááẠááœáá·áºááŒá¯áááºááŒá áºáááºá áá±á¬á· áááºáááºážáá»ááºááœáẠááŸááºáááºáá±á¬ ááá·áºááºááᯠááŒááá«á
á¡áᯠáá±á¬ááºááẠá¡áá¯ááºááŸá áºáᯠáááºááá·áºááŒáá·áºáá¡á±á¬ááºá
deploy_website:
extends: .deploy_qbec_app
environment:
name: prod
url: https://docs.example.org
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
deploy_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
on_stop: stop_review
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
only:
refs:
- branches
except:
refs:
- master
stop_review:
extends: .deploy_qbec_app
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
stage: deploy
before_script:
- git clone "$CI_REPOSITORY_URL" master
- cd master
script:
- qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
variables:
GIT_STRATEGY: none
only:
refs:
- branches
except:
refs:
- master
when: manual
áá¬á áá¬ááŸááœá²á áááºááá·áºá¡ááá¯ááºážá¡áááºááá¯áááᯠááœááºážááá¯á·ááá¯ááºáááºááŸáá·áº áááºážááá¯á·ááᯠááá¯ááºá á¡ááŒáá¯ááŒáá·áºááŸá¯ááŸá¯áá¬ážááŸááºážááᯠá¡áá¯á¶ážáá»áááºááŒá áºáááºá
qbec á¡ááœáẠááœá±ážáá»ááºááŸá¯á¡áá
áºáá
áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·áááº- --app-tag â áááºážááẠááá·áºá¡á¬áž á¡ááá®áá±ážááŸááºážá ááŒáá·áºáá»ááºáá¬ážáá±á¬áá¬ážááŸááºážáá»á¬ážááᯠáááºáá¯ááºááŒá®áž á€áááºá¡ááœááºážáᬠáá¯ááºáá±á¬ááºááá¯ááºáááºá Kubernetes ááœáẠá¡áááºážá¡ááŒá
áºáá»á¬ážááᯠáááºáá®ážáᬠáá»ááºáá®ážááá·áºá¡áá«á qbec ááẠáááºážááá¯á·ááŸáá·áºá¡áá°áᬠáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá
á€áááºážááŒáá·áº áá¯á¶ážáááºáá»ááºáá
áºáá¯á
á®á¡ááœáẠáá®ážááŒá¬ážáááºáááºážáá»ááºáá
áºáá¯ááᯠáááºáá®ážáááááá¯ááºáá±á¬áºáááºáž áá
áºáá¯áááºážááá¯áᬠááŒááºáááºá¡áá¯á¶ážááŒá¯áá«á
á€ááœááºáá»áœááºá¯ááºááá¯á·áááºážá¡áá¯á¶ážááŒá¯áááºá qbec ááẠááŒááºáááºáá¯á¶ážáááºááŸá¯ááᯠáá»áá·áºáá¯á¶ážáááºá, á¡á á¬áž qbec ááẠáá°áááºážá¡ááá¯ááºáž á¡áá¯á¶ážááŒá¯áá«áááºá - áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááááºáááºážáá»ááºá¡ááœáẠááœá²ááŒá¬ážááŸá¯áá»á¬ážááᯠáá±á¬áºááŒááẠááŒáá¯ážá á¬ážááá·áºá¡áá»áááºááŒá áºááẠ(ááŒááºáááºáá¯á¶ážáááºááŒááºážááŸáá·áº áá°áááºážá¡ááá¯ááºážááŒá áºáááº)á
ááá·áºáá¡á±á¬áẠááŒááºáááºáá¯á¶ážááẠáááºáááºážáá»áẠdeploy/website/qbec.yaml
spec:
environments:
review:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
á¡á²áá®á¡áá«ááŸá¬ áá»áá±á¬áºááá¯á·á á¡á²áá«ááᯠááŒá±áá¬áááºá deploy/website/params.libsonnet:
local env = std.extVar('qbec.io/env');
local paramsMap = {
_: import './environments/base.libsonnet',
default: import './environments/default.libsonnet',
review: import './environments/review.libsonnet',
};
if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile
áááºážá¡ááœáẠá áááºááŒáá¯ááºáá±á¬ááºáá»á¬ážááᯠáá»áá±ážáá«á deploy/website/environments/review.libsonnet:
// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');
base {
components+: {
website+: {
name: 'example-docs-' + slug,
domain: subdomain + '.docs.example.org',
},
},
}
jobu ááá¯áááºáž á¡áá®ážááẠáá±á·áá¬ááŒáá·áºáá¡á±á¬áẠstop_áá¯á¶ážáááºáá»ááºáá¬áááœá²ááᯠáá»ááºááá¯ááºáá±á¬á¡áá«ááœáẠáááºážááᯠá¡á
áá»áá¯ážáá±ážáááºááŒá
áºááŒá®áž gitlab á áááºážááᯠááœá±ááŸááºážááẠáááŒáá¯ážá
á¬ážáá²á GIT_STRATEGY- áááŸááá«áá áá±á¬ááºááá¯ááºážááŸá¬ áá»áœááºáá±á¬áºááá¯á· ááœá±ážáá¯ááºáááºá áá¬á
áá¬- ááá¯ááºážááŒááºááŒá®áž áá¯á¶ážáááºáá»ááºááœá±ááᯠáá»ááºááá¯ááºáá«á
áááºážáááºážááŸá¯ááºáá±áá±ááá·áº ááá¯ááŸáá²á·áááºážáááºážááᯠááŸá¬áááœá±á·áá±ážáá°ážá
á¡ááŒá¬ážááœá±ážáá»ááºá
áá¬áá
áºáá¯ááẠá¡ááŒá²áááºáž áá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž áá»ááºááááºážááá¯ááºááá·áº ááá¯áááºá¡áááºáá±áá¬áá
áºáá¯ááá¯á· ááŒááºáááºáá¯á¶ážáááºááŸá¯áá
áºáá¯á
á®ááᯠá¡áá¯á¶ážáá»áááºááŒá
áºáááºá
áá»áœááºá¯ááºááá¯á·áááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá±á·áá«ááŸáá·áºá
git add .
git commit -m "Enable automatic review"
git ááœááºáž, git checkout -b á ááºážáááºááŸá¯, git push áá°áááºážá ááºážáááºááŸá¯á á áºáá±ážáá«-
Gitlab ááŸá áááºáá®ážáá¬ážáá±á¬ áááºáááºážáá»ááºá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
á¡á¬ážáá¯á¶áž á¡áá¯ááºááŒá áºááŒá®áá¬áž? - áá±á¬ááºážááŒá®á áá»áœááºá¯ááºááá¯á·áá ááºážáááºááŸá¯áá¬áááœá²ááá¯áá»ááºáá«á git áá¯ááºáá á¹á ááºážáá¬á áá¬, git push áá°áááºáž :testáááºáááºážáá»ááºááᯠáá»ááºááŒááºážá¡áá¯ááºáá»á¬ážááẠá¡ááŸá¬ážá¡ááœááºážáááŸááá² á¡áá¯ááºáá¯ááºááŒá±á¬ááºáž á á áºáá±ážáá«áááºá
á€áá±áá¬ááœáẠááá±á¬áá»ááºáá áºáá¯ááŸá developer ááá¯ááºážááẠá¡ááá¯ááºážá¡áááºáá»á¬ážááᯠáááºáá®ážááá¯ááºáááºá áá°áááºáž ááŒá±á¬ááºážáá²ááá¯ááºáááºááᯠáá»áœááºá¯áẠáá»ááºáá»ááºáž ááŸááºážáááºážááá¯áá«áááºá .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 ááœááºážááŸáá·áº á á áºáá±ážáá«-
Review á¡ááºááºááá¯ááºá áááºáá¬ážááŒááºáá¬ááºáá¯á¶
á¡áá¯ááºááŒá®ážáá«ááŒá®á
ááá±á¬áá»ááºáááºážááŒá áºáá»á¬áž-
- Gitlab ááœááº-
https://gitlab.com/kvaps/docs.example.org - GitHub ááœááº-
https://github.com/kvaps/docs.example.org
áááºážáá²á·á¡á¬áá¯á¶á áá¯ááºááŸá¯á¡ááœááºáá»á±ážáá°ážáááºáá«áááºá áá«ááŸá áºáááºáááºááá¯á·áá»áŸá±á¬áºááá·áºáá«áááºá
source: www.habr.com