แแแแแ แฏแแแ! แแฎแแแฎแแ แแแแแแแแ แแ แแแแแ แแแแแ แ แแแขแแแแขแแแแชแแแก แแแกแขแ แฃแแแแขแ, แ แแแแ แช Docker-แแก แกแฃแ แแแแแแก แจแแกแแฅแแแแแแ, แแกแแแ Kubernetes-แจแ แแแแแแแแแแกแแแแก. แแแแกแแแ แแแแแแจแแ แแแแ, แแแแแแฌแงแแแขแ GitLab-แแแ แแแแแจแ, แแแกแ แจแแกแแซแแแแแแแแแแก แกแแคแฃแซแแแแแแแ แจแแกแฌแแแแ แแ, แ แ แแฅแแ แฃแแแ, แแแแกแแแแแแก แแแงแแแแแ.
แแก แแแแฃแจแแแแ แ แจแแฅแแแแแแ แแแแแแแ แแแก แแแแ
แแ แแชแแแ แแกแแแแกแ แแ แแชแแกแแก แจแแฅแแแ แแฃแแแแแ, แแแแ แแ แแแแแแแแ แแแแแฃแแ Gitlab CI-แแ แแ แฃแคแแกแ แแแกแขแ แฃแแแแขแแแแ, แ แแแแแแกแแช แแแฉแแแฃแแ แแแ Kubernetes-แจแ แแแแแแแชแแแแแก แแแแกแแแแแกแแแแแ. แแฆแแก แแแแแก แแ แแแแแก แแแขแงแแแ แแแ แจแแกแแฎแแ.
แกแขแแขแแแจแ แแแแฎแแแฃแแ แแฅแแแแ แแกแแแ แแแกแขแ แฃแแแแขแแแ, แ แแแแ แแชแแ:
แฃแแ, qbec, แแแแแแ, git-crypt ะธ GitLab CI แแแแแแแฃแ แ แแแ แแแแก แจแแฅแแแแ.
แจแแแแแ แกแ
แแแแชแแแแ แฐแแฃแแ Dockerfile-แแก แแแแแแแแแ แแแแแแแก แแแชแแแแ qbec-แแก แแแชแแแแ Gitlab-Runner-แแก แแชแแแแแแ Kubernetes-แแก แจแแแกแ แฃแแแแแแแแ แแ แแแ Helm แฉแแ แขแแแแก แแแงแแแแแ qbec-แแ แฌแแ แแแแแแแแแ git-crypt แฎแแแกแแฌแงแแแ แงแฃแแแก แกแฃแ แแแแก แจแแฅแแแ แฉแแแแ แแแ แแแแ แแแแกแแแแแ แแ แกแฃแ แแแแแแก แจแแแ แแแ แขแแแแแแก แแแฎแแแแแ แแแแแแแแแแก แแแขแแแแขแแแแชแแ แแ แขแแคแแฅแขแแแ แแ แจแแแ แแแ แแกแขแแขแแแแกแแแ แกแฌแ แแคแแแกแแก แแแแแแแฃแ แ แแแ แแแ แแแแแแก แแแแแฎแแแแ
1. แฐแแฃแแแก แแแชแแแแ
แ แแแแ แช แฉแแแแ แแ แแแฅแขแแก แแแแแแแแ, แจแแแแชแแแแแ แจแแแฅแแแแ แฐแแฃแแแแ แแแแแฃแแ แแแแฃแแแแขแแชแแแก แแแแแฅแแแงแแแแแก แกแแแขแ. 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
แแแ แแฅแขแแ แแแจแ แจแแแแแ แกแ แแฃแแแขแแ แแ/ แแ แแฅแแแแ แแฅแแแแ แแแแแแแ แแ.
แแแแฎ, แกแฎแแแแ แจแแ แแก, แแแจแแแแ แแแแแแแขแแ .แแแขแแแแ แ:
echo /public > .gitignore
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add .
git commit -m "New site created"
2. Dockerfile-แแก แแแแแแแแแ
แแ แแ แแแแแกแแแฆแแ แแ แฉแแแแ แกแแชแแแแก แกแขแ แฃแฅแขแฃแ แ. แแ แฉแแแฃแแแแ แแ แแแงแแแแ แ แแฆแแชแแก:
.
โโโ deploy
โ โโโ app1
โ โโโ app2
โโโ dockerfiles
โโโ image1
โโโ image2
- dockerfiles/ - แจแแแชแแแแแก แแแขแแแแแแแก Dockerfiles-แแ แแ แงแแแแแคแแ แ แ แแช แกแแญแแ แแ แฉแแแแ Docker แกแฃแ แแแแแแก แจแแกแแฅแแแแแแ.
- แแแแแแแแแ/ โ แจแแแชแแแก แกแแฅแแฆแแแแแแแก แฉแแแแ แแแแแแแชแแแแแก 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 แจแแแชแแแก แแ แก FROM, แแ แคแฃแแฅแชแแแก แ.แฌ
แแแ แแแแ, แกแแแแแแ แกแฃแ แแแ แแฎแแแแ แจแแแชแแแก แแฃแฅแhttpd (แแกแฃแแฃแฅแ HTTP แกแแ แแแ แ) แแ แแฃแแแขแแ แแ/ โ แฉแแแแ แกแขแแขแแแฃแ แแ แแแแแ แแ แแแฃแแ แแแแกแแแขแแก แจแแแแแ แกแ.
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. แแแแแแแก แแแชแแแแ
แ แแแแ แช แแแแแ แแก แแแแแกแแฎแฃแแแแแก แจแแแฅแแแแแ, แแแแแแฌแงแแแขแ แแแแแแแงแแแ
แกแฃแ แแแแก แแกแแแแแแ, แฃแแ แแแแ แแแฃแจแแแ แแแแขแแแแแ แ แแแแแแแก แจแแแกแ แฃแแแแแแ แแ แแแแแกแชแแ แแแก แแแแแแแแ แ build แแแแขแแฅแกแขแจแ; แแก แแกแแแ แจแแแซแแแแ แแแแแแแแก แแแแแแแแ แแแแ, แแแแแ แแก แกแแจแฃแแแแแแ:
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, แแแแ แแ แแฅแแแ แจแแแแซแแแแ แแแฃแแแแแ แกแฎแแ แแแ แแแ แแแแขแ แแก แแแแแงแแแแแแ --แฅแแจแ-แ แแแ.
แแแแแ -แ แแแแกแขแ แแก แกแแ แแแจแแขแ
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 - แแก แจแแแชแแแก แกแแแ แแ แแแ แแแแขแ แแแก แงแแแแ แแแ แแแแกแแแแก
- แแแ แแแแก/แแแแฃแแแกแฎแแแแ.libsonnet โ แจแแแชแแแก แแแ แแแแกแแแแก แแแแแชแแแแแฃแ แแแ แแแแขแ แแแก แแแกแขแ
แแแแฎแกแแแ แแแ แแแ/base.libsonnet แแ แแแแแแขแแ แแแ แแแแขแ แแแ แฉแแแแ แแแ แแแแ แแแแแแแแแขแแกแแแแก:
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
แแแแแ แแกแแแ แจแแแฅแแแแ แฉแแแแ แแแ แแแแ แแแแแแแแแขแ แแแแแแแแแขแแแ/แแแแแแแ แแ.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;
[
{
apiVersion: 'apps/v1',
kind: 'Deployment',
metadata: {
labels: { app: params.name },
name: params.name,
},
spec: {
replicas: params.replicas,
selector: {
matchLabels: {
app: params.name,
},
},
template: {
metadata: {
labels: { app: params.name },
},
spec: {
containers: [
{
name: 'darkhttpd',
image: params.image,
ports: [
{
containerPort: params.containerPort,
},
],
},
],
nodeSelector: params.nodeSelector,
tolerations: params.tolerations,
imagePullSecrets: [{ name: 'regsecret' }],
},
},
},
},
{
apiVersion: 'v1',
kind: 'Service',
metadata: {
labels: { app: params.name },
name: params.name,
},
spec: {
selector: {
app: params.name,
},
ports: [
{
port: params.servicePort,
targetPort: params.containerPort,
},
],
},
},
{
apiVersion: 'extensions/v1beta1',
kind: 'Ingress',
metadata: {
annotations: {
'kubernetes.io/ingress.class': params.ingressClass,
},
labels: { app: params.name },
name: params.name,
},
spec: {
rules: [
{
host: params.domain,
http: {
paths: [
{
backend: {
serviceName: params.name,
servicePort: params.servicePort,
},
},
],
},
},
],
},
},
]
แแ แคแแแแจแ แฉแแแ แแฆแแฌแแ แแ แแฃแแแ แแแขแแก แกแแแ แแ แแแฃแแ แแ แแแ แแฃแแแ, แแกแแแแ: แแแแแแแแแ, แกแแแกแแฎแฃแ แแก ะธ Ingress. แแฃ แแแแแแแแ, แจแแแแแซแแ แกแฎแแแแแกแฎแแ แแแแแแแแแขแแแจแ แฉแแแแแ, แแแแ แแ แแ แแขแแแแ แแ แแ แกแแแแแ แแกแ แแฅแแแแ แฉแแแแแแแก.
แกแแแขแแฅแกแ 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-แแก แจแแแกแ แฃแแแแแแแแ แแ แแแ
แแแแ แแ แแแแ แแฎแแแแ แฉแแแฃแแแแ แแ แแแงแแแแแแ แแแขแแแ-แแ แแแแ แฌแแแแกแฌแแ แแแแแแแแแฃแ แแแแฅแแแแแ (LXC แแแแขแแแแแ แ) แญแฃแ แแแ แแ แแแแแ -แจแแแกแ แฃแแแแแแ. แแแแแแแแ แแแแแ, แ แแแแแแแแ แแกแแแ แแแ แแแแแแ แแแงแแแแ แแแแแแแฃแ แแ แแแแกแแแฆแแ แฃแแ แฉแแแแก gitlab-แจแ. แแแ แจแแแแ แแแแก แแแแแ แแก แกแฃแ แแแแแ แงแแแแ แแ แแแฅแขแแกแแแแก.
แแแแ แแ แ แแแแ แช แแ แแฅแขแแแแ แแฉแแแแ, แแก แแแ แแแแขแ แแ แแ แแก แงแแแแแแ แแแแแแฃแ แ, แ แแแแ แช แแ แแฅแขแแแฃแแแแแก, แแกแแแ แฃแกแแคแ แแฎแแแแแก แแแแแกแแแ แแกแแ. แแแแ แแ แฃแแแแแกแ แแ แแแแแแแแแฃแ แแ แฃแคแ แ แกแฌแแ แแ แแแแแแฃแแ แแ แแแฅแขแแกแแแแก, แแ แแฃแแแแช แแแแแแฃแแ แแแ แแแแกแแแแก แชแแแแแฃแแ แแแ แแแแแแ แแงแแก แแแแแแแแแฃแแ.
แกแแแแแแแแ แแ, แแก แกแแแ แแแ แแ แแ แแก แแ แแแแแแ, แ แแแแแ แแฎแแ แฉแแแ แแแแแแแแแกแแแ แแแขแแแ-แแ แแแแ แแแ แแแแแ , แ แแแแ แช แฉแแแแ แแ แแแฅแขแแก แแแฌแแแ, แกแฌแแ แแ Kubernetes-แจแ.
Gitlab แแแแแแแแแ แแแ แกแแญแแก แกแฅแแแแก Kubernetes-แจแ gitlab-runner-แแก แแแแกแแแแแกแแแแแ. แแกแ แ แแ, แงแแแแแคแแ แ แ แแช แแฅแแแ แฃแแแ แแแแแแแแ แแ แแก แแแแก แแแ แแแแแ แ แแแแกแขแ แแชแแแก แแแจแแแ แฉแแแแ แแ แแแฅแขแแกแแแแก แแแ แแแแขแ แแแ -> 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=true โ แแซแแแแก แแแ แแแแแแก แกแแญแแ แ แ แแแแแแแแแก แแ แแแแแแแแแแแ, แ แแแ แจแแซแแแก แจแแฅแแแแก pods แฉแแแแ แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ kubernetes-executor-แแก แแแแแงแแแแแแ.
แแฃ แงแแแแแคแแ แ แกแฌแแ แแ แแแแแแแ, แแแแงแแคแแแแแแจแ แฃแแแ แแแฎแแ แ แแแแกแขแ แแ แแแฃแแ แแแ แแแแแแ Runners, แแฅแแแแ แแ แแแฅแขแแก แแแ แแแแขแ แแแจแ.
แแแแแขแแแฃแแ แแแ แแแแแก แกแแ แแแจแแขแ
แแกแ แแแ แขแแแแ? - แแแแฎ, แแก แแกแ แแแ แขแแแแ! แแแ แแแแแแแ แฎแแแแ แ แแแแกแขแ แแชแแ แแฆแแ แจแแแแฌแฃแฎแแแ, แแแแแ แแแแ แแแ แแแแแแ แแแขแแแแขแฃแ แแ แจแแแฅแแแแแ แแ แแแแแแแฃแ แแแแ.
6. แแแแแแแแกแแ Helm แกแฅแแแแแ QBEC-แแ
แแแก แจแแแแแ, แ แแช แแแแแแฌแงแแแขแแ แแแแแแแแแแกแฌแแแแ แแแขแแแ-แแ แแแแ แฉแแแแ แแ แแแฅแขแแก แแแฌแแแแ, แแ แแ แแฆแแฌแแ แแ แแก แฉแแแแก Git แกแแชแแแจแ.
แฉแแแ แจแแแแแซแแแ แแฆแแฌแแ แแ แแก, แ แแแแ แช แชแแแแแฃแแ แแแแแแแแแขแ แแแฎแแ, แแแแ แแ แกแแแแแแแแแ แแแแแแแแ แกแฎแแแแแกแฎแแ แแกแแแแแก แแแแแแแกแแแแก แแแฎแแ แซแแแแแ แฎแจแแ แแ, แแแแกแฎแแแแแแแ แแแขแแแ-แแ แแแแ, แ แแแแแแช แแแแแแแแแแ แแฎแแแแ แแ แแฎแแ Kubernetes แแแแกแขแแ แแ. แแแจ แแกแ, แแแแแ แจแแแฅแแแแ แแแกแแแแก แชแแแแ แแแแแชแฎแแแ:
cd deploy
qbec init gitlab-runner
cd gitlab-runner
แแแฏแแ แแ แฉแแแ แฎแแแแ แแ แแฆแแฌแแ แ Kubernetes-แแก แแ แแแฃแแแแก, แแแแ แแ แแแแฆแแแ แแแ Helm แกแฅแแแแก. qbec-แแก แแ แ-แแ แแ แฃแแแ แแขแแกแแแ แแ แแก Helm แกแฅแแแแแแก แแแแแชแแแแก แจแแกแแซแแแแแแแ แแแ แแแแแ Git แกแแชแแแแแแ.
แแแแแ แแแแแแแแจแแ แแ แแแ git แฅแแแแแแฃแแแก แแแแแงแแแแแแ:
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 แฉแแแ แแแแแแแแ แ แแแแก แกแฅแแแแกแแแ, แจแแแแแ แแแ แแแแแ.แฆแแ แแแฃแแแแแแ, แ แแแแแกแแช แแแฆแแแ แแแ แแแแก แแแ แแแแขแ แแแแแแ, แจแแแแแ แแแแแก แแแแแฅแขแ
- แกแแฎแแแแก แจแแแแแแ - แแแแแจแแแแแก แกแแฎแแแ
- แกแแฎแแแแ แกแแแ แชแ - แกแแฎแแแแ แกแแแ แชแ แแแแแแชแ แกแแญแแก
- แแ แคแแแแก โ แกแแญแแ แ แแแ แแแแขแ แ, แ แแแแแแช แแแแแก แแแแแแแแ แ แคแแแแแก แแแแก
- แกแแขแงแแแแ แ - แแฉแแแแแแก แแ แซแแแแแแก แกแแญแแก แจแแแแแแ แงแแแแ แแ แแฃแแแแขแแ แกแฅแแแแก แแแแแแชแแแแกแแก
แแฎแแ แแแแแ แแฆแแฌแแ แแ แฉแแแแ แแแแแแแแแขแแก แแแ แแแแขแ แแแ แแแ แแแ/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 แแแฆแแแ แแแ แ แคแแแแแแแ แกแแแแฃแแแแแแแแ/แแแแ.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/, แกแแแแช แฉแแแ แแแแฅแแก แแแ แแฅแขแแ แแ แกแแแแฃแแแแแแแแ/, แแแแแ แแแแจแแคแ แแ แแแกแจแ แแ แกแแแฃแแ แงแแแแ แคแแแแ, แแแแกแแแแก แจแแแฅแแแแ แคแแแแก แกแแแแฃแแแแแแแแ/.แแแขแแขแ แแแฃแขแแแ แจแแแแแแ แจแแแแแ แกแแ:
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
แ แแแแ แช แจแแแแแ แกแแแแ แฉแแแก, แงแแแแ แคแแแแ แแแฆแแแแแแ * แแแแแแแแ git-crypt, แแแ แแ แฃแแ แแแแแกแแกแ .แแแขแแขแ แแขแแแ
แแแแก แจแแแแฌแแแแ แจแแแแแซแแแ แแแจแแแแแ:
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/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
แ แแแแ แช แฎแแแแแ, แแ แกแฃแ แแแแ แฉแแแ แแแแแกแขแแแแ แแแ แงแแแแ แแแแฃแแแแฃแ แแ แแแ แแแแก, แ แแแแแแช แแแแแแแงแแแแ แฉแแแแ แแแแแแแชแแแก แแแแกแแแแแกแแแแแ. แฉแแแ แแก แแ แแแญแแ แแแแ แแฅ, แแฃ แแฃแแแฅแขแแ, แแแแ แแ แจแแแซแแแแ แแแแญแแ แแแ แแแกแแแ แแแแแจแ แแแแกแแแแแแก แแแงแแแแแแก แคแแแแจแ.
แแกแแแ, แแแแกแแแแแก, แ แแ แจแแแแแซแแแก Kubernetes-แแแ แแแแฃแแแแแชแแ แแ แแแกแจแ แแแแแแแแแ, แฉแแแ แฃแแแ แแแแแแแแคแแแฃแ แแ แแ แ แแแ gitlab-runner-แแก แแแแ แแแแแ แแ แแแฃแแ แแแแแแแกแแแแก.
แแแแกแแแแแก แแแแแแแแแ แแแ แแฅแขแแ แแแจแ gitlab-runner-แแ:
cd deploy/gitlab-runner
แแ แแแแแแขแแ แแฎแแแ แแแแแแแแแขแ แแแแแแแแแขแแแ/rbac.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;
[
{
apiVersion: 'v1',
kind: 'ServiceAccount',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'Role',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
rules: [
{
apiGroups: [
'*',
],
resources: [
'*',
],
verbs: [
'*',
],
},
],
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'RoleBinding',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
roleRef: {
apiGroup: 'rbac.authorization.k8s.io',
kind: 'Role',
name: params.name,
},
subjects: [
{
kind: 'ServiceAccount',
name: params.name,
namespace: env.namespace,
},
],
},
]
แฉแแแ แแกแแแ แแฆแแฌแแ แ แแฎแแ แแแ แแแแขแ แแแก แแแ แแแ/base.libsonnet, แ แแแแแแช แแฎแแ แแกแ แแแแแแงแฃแ แแแ:
local secrets = import '../secrets/base.libsonnet';
{
components: {
gitlabRunner: {
name: 'gitlab-runner',
values: {
gitlabUrl: 'https://gitlab.com/',
rbac: {
create: true,
},
runnerRegistrationToken: secrets.runnerRegistrationToken,
runners: {
serviceAccountName: $.components.rbac.name,
image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
},
},
},
rbac: {
name: 'gitlab-runner-deploy',
},
},
}
แจแแแแจแแแ $.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 -- แขแแแแแแแ แแแแแ แแแแแแฎแแแแ แฉแแแแก แแแ แแแ แแแแกแแแแแก:
แแแ แแแแ แแแแกแแแแแแก แแแ แแแแก แกแฃแ แแแ
แฆแแ แก แแฅแแแแ แงแฃแ แแแฆแแแแก แแแฅแชแแแ แแ แคแแฅแขแแ, แ แแ แขแแแแแแ แจแแแ แแแ แจแแกแแคแแ แแกแแ แแแแแ แแก แกแฃแ แแแแแแก แจแแกแแฅแแแแแแ, แแแแ แแ แแ แแ แแก แจแแกแแคแแ แแกแ Kubernetes-แแ แแแแแแแชแแแก แแแแกแแแแแกแแแแแ. แแแแก แแแแ, แ แแ แแฎแแแ แขแแแแแ แจแแแซแแแแ แแแแแแญแแก แซแแแ แแแแแแแแแขแแแก, แแ แจแแแแฎแแแแแจแ, แแแแแแแก แแแแกแแแแแแก แแแแชแแแแแแแชแแ แแแแแแฌแแแแก แซแแแแ แแแ แกแแแก แแแแแแแกแแแแก.
แแ แแ แแแแแแแก แแแแแกแแญแ แแแแ, แ แแแแ แช แฌแแกแ, แแแแแ แแก แกแฃแ แแแแแแก แแแแแ แฃแแแแจแแ แแแแ แขแแแแแก, แฎแแแ แแแแแแแชแแแก แแแแแแแแแ แคแแแแแแจแ. แกแแแแแแกแขแ แ, แ แแแแแจแแช แจแแแ แแแแแฃแแ แกแฃแ แแแแแแก แแแ แกแแแแ แแงแแ แ แแแแแ แแแฃแแแ. แแก แแ แแก แกแแแแช แจแแแแซแแแแ แแแแชแแแแแแแชแแ แแแแ แฃแแแแแก แแแ แขแแแ แแแแ แฃแแแแแ แกแแแแแแกแขแ แ- แคแแแแแแแแ.
10. แแแแแแแแแแก แแแขแแแแขแแแแชแแ
แแแแกแแแแแก, แ แแ Gitlab-runner-แแ แแแแจแแคแ แแก แฉแแแแ แกแแแแฃแแแแแแแแ, แฉแแแ แแแแแญแแ แแแแ แกแแชแแแแก แแแกแแฆแแแแก แแฅแกแแแ แขแ แแ แแแกแ แแแแแขแแแ แฉแแแแก CI แแแ แแแแก แชแแแแแแแจแ:
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo
แฉแแแ แจแแแแแแฎแแแ แแแฆแแแฃแ แฎแแแก Gitlab-แจแ; แแแแกแแแแแก แแแแแแแแแ แฉแแแแ แแ แแแฅแขแแก แแแ แแแแขแ แแแแ:
แแแ แแแแขแ แแแ -> CI / CD -> แชแแแแแแแ
แแ แแแแแ แจแแแฅแแแแ แแฎแแแ แชแแแแแ:
แขแแแ
แซแแ แแแแแ
แฆแแ แแแฃแแแแ
แแแชแฃแแแ
Masked
แกแคแแ แ
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-แจแ
- --แแแแชแแแ โ แแแซแฃแแแแก qbec-แก แแแแแแแแก, แกแแแแ แแแก แแแแ แจแแฅแแแแแ แ แแกแฃแ แกแแแ แแแแแแ Ready-แแก แแแแแแแ แแแแแจแ แแ แแฎแแแแ แแแแก แจแแแแแ แแแแแแแแแก แฌแแ แแแขแแแฃแแ แแแกแแกแแแแแ แแแแแ.
- -แแแแฎ - แฃแแ แแแแ แแแแแ แแแแก แแแขแแ แแฅแขแแฃแ แแแ แกแก แฒแแ แฌแแฃแแแแฃแแ แฎแแ ? แ แแแแกแแช แแแแแแแแแฃแแแ.
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add .gitlab-ci.yml
git commit -m "Automate deploy"
แฒแ แจแแแแแ แแแข แแแซแแ แฉแแแ แแแแฎแแแ, แ แแแแ แแแแแแแแ แฉแแแแ แแแแแแแชแแแแ:
แแแแ แ แแแแกแแแแแแก แแแ แแแแก แกแฃแ แแแ
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-แจแ แแ แแฎแแ แฉแแแ แแแแแแแงแแแแแ แกแฃแ แแแก แแ แคแแแแแแแก แกแแฎแแแฌแแแแแแ, แ แแแแแแแช แแแแกแแแแแแก แแแแชแแแแแแแชแแ แแแแฎแแแแ. แแฆแกแแแแจแแแแแ, แ แแ แแก แแกแแแ แแแฃแจแแแแแก แขแแแแแแแ, แ แแช แกแแจแฃแแแแแแก แแแแแชแแแก แจแแแแแแฎแแ แกแแแขแแก แกแแแแจแแขแแแ แแแแแ แแขแฃแแ แแแ แกแแแ แแแแแ -แ แแแแกแขแ แจแ.
แ แแแแกแแช แกแแแขแแก แแฎแแแ แแแ แกแแแกแแแแก docker tag-แแก แกแแฎแแแ แจแแแซแแแแ แฃแชแแแแแ แแงแแก, แฉแแแ แแแแแ แฃแแแ แแฆแแฌแแ แแ แชแแแแแแแแแ Kubernetes-แจแ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแก แฃแแ แแแแ แแ แแแแแแแแกแแแก แแแแแแแชแแแก แแฎแแแ แกแฃแ แแแแแแ, แ แแแแแ แแก แแแ แจแแแแฉแแแแก แ แแแแ แชแแแแแแแแก แแแแแแแแแแก แแแแแคแแกแขแ.
แแแ แแแแขแ โvm:ext-str digest="$DIGEST" qbec-แแกแแแแก - แกแแจแฃแแแแแแก แแแซแแแแ แแแแแกแชแแ แแแ แ แชแแแแแ jsonnet-แก. แฉแแแ แแแแแแ, แ แแ แแก แฎแแแแฎแแ แแแแแแแกแแแก แแแแกแขแแ แจแ แฉแแแแ แแแแแแแชแแแก แงแแแแแ แแแแแจแแแแแ. แฉแแแ แแฆแแ แจแแแแแซแแแ แแแแแแแงแแแแ แขแแแแก แกแแฎแแแ, แ แแแแแแช แแฎแแ แจแแแซแแแแ แฃแชแแแแแ แแงแแก, แ แแแแแ แฉแแแ แฃแแแ แแแงแแ แแแแแฃแแ แกแฃแ แแแแก แแแแแ แแขแฃแ แแแ แกแแแกแแแ แแ แแแแแแแงแแแแ แแแแแแแแแ, แ แแแแกแแช แแก แแชแแแแแ.
แแฅ แฉแแแ แแแแแแฎแแแ แแแ แแแแแแแก แฃแแแ แ แจแแแแแฎแแก แแแแฏแแกแขแแก แกแฃแ แแแ แคแแแแจแ (แแแ แแแแขแ -- แแแแฏแแกแขแ-แคแแแแ)
แจแแแแแ แฉแแแ แแแแแแแขแแแ แแ แคแแแแก แแ แฌแแแแแแแฎแแแ แแแก แแแแแแแแแแก แแ แแก.
แแแแแ แแแแแแแฎแแแ แฉแแแแ แแแ แแแแขแ แแแ 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',
},
},
}
แจแแกแ แฃแแแแฃแแแ, แแฎแแ แแแแแกแแแแ แ แแแแแแแฃแแแแ แกแแแแแแกแขแ แ แแฎแแ แชแแแแแแก แแแแแ แแก แแแแแกแแฎแฃแแแแแก แจแแฅแแแแก แแแแชแแแแแแแแแก แแแฎแแแแ แจแแแแแ แแแแแแแแกแแ แแแ Kubernetes-แจแ.
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add .
git commit -m "Configure dynamic build"
แแแแแแแแแแแ แจแแแแแแฌแแแแ แแแข แแแซแแ แฉแแแ แฃแแแ แแแแฎแแ แแกแแแแกแ แ แแ:
แแแแกแแแแแแก แแแ แแแแก แกแฃแ แแแ แแแกแขแแ แแกแแแแก
แแ แแแชแแแจแ, แฉแแแ แแ แแแญแแ แแแแ 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/**/*
แชแแแแแแแแแ แกแแจแฃแแแแแแก แแแแชแแแ แแแแแงแฃแ แ แแแแแแแ แชแแแแแแแแแก deploy/gitlab-runner/ แแ แแแแแแฌแแแแก แฉแแแแก แกแแแฃแจแแแก แแฎแแแแ แแ แจแแแแฎแแแแแจแ, แแฃ แแ แกแแแแแก
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"
แแแข แแแซแแแฏแแแแ:
แแแแแฎแแแแฃแแ แแแแกแแแแแแก แแแ แแแแก แกแฃแ แแแ
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',
},
},
}
แแแแแ แแกแแแ แฃแคแ แ แแฎแแแก แแแแฎแแแแ แกแแแฃแจแแแก แแแฉแแ แแแ_แแแแแฎแแแแ, แแก แแแแฅแขแแฃแ แแแแ, แ แแแแกแแช แคแแแแแแ แฌแแแจแแแแ แแ แแกแ, แ แแ gitlab แแ แจแแแชแแแแก แแแแแ แแชแฎแแ, แแก แแแแแแงแแแแแ GIT_STRATEGY: แแ แชแแ แแ, แแแแแแแแแแแ แฉแแแ แแแแแแ แแแแก แแแฎแแแแ แกแแแแแแกแขแ แ- แคแแแแแแ แแ แฌแแจแแแ แแแแแฎแแแแ แแแกแ แแแจแแแแแแ.
แชแแขแ แแแฃแแแแแ แแ, แแแแ แแ แฃแคแ แ แแแแแแ แแแ แฏแแ แแแ แแแแแแ.
แแแขแแ แแแขแแฃแแ แแแ แแแแขแ แแฅแแแแ แแแแแแฃแแ แแแแแฎแแแแแก แแแแแแแกแแแ แกแแกแขแฃแแ แแก แกแแฎแแแแแแก แกแแแ แชแแจแ, แ แแแแแแช แงแแแแแแแแก แจแแแซแแแแ แแแแแแแแ แแแแแแ แ.
แแ แแแแแแแฌแงแแแ แฉแแแแ แชแแแแแแแแแแก แจแแขแแแ:
git add .
git commit -m "Enable automatic review"
แแแข แแแซแแ, git checkout -b แขแแกแขแ, git push แฌแแ แแแจแแแแก แขแแกแขแ, แฉแแแ:
Gitlab-แจแ แจแแฅแแแแแ แแแ แแแแก แกแแ แแแจแแขแ
แงแแแแแคแแ แ แแฃแจแแแแก? - แแแ แแ, แฌแแจแแแแ แฉแแแแ แกแแขแแกแขแ แคแแแแแแ: git แแแแแฎแแแก แแกแขแแขแ, git push origin :แขแแกแขแ, แฉแแแ แแแแแฌแแแแ, แ แแ แแแ แแแแก แฌแแจแแแก แกแแแฃแจแแแแแ แแฃแจแแแแแ แจแแชแแแแแแแก แแแ แแจแ.
แแฅแแ แแแแแ แแแแแแแ แขแ, แ แแ แแ แแแฅแขแจแ แแแแแกแแแแ แแแแแแแแแ แก แจแแฃแซแแแ แจแแฅแแแแก แคแแแแแแแแ, แแแก แแกแแแ แจแแฃแซแแแ แจแแชแแแแแก .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"
แแแข แแแซแแแแ แจแแแแแฌแแแ:
แแแแฎแแแแแก แแแแแแแชแแแก แฆแแแแแแก แแแ แแแแก แกแฃแ แแแ
แกแแแฃแจแแ แแแกแ แฃแแแแฃแแแ!
แแ แแแฅแขแแก แฌแงแแ แแแแ:
- Gitlab-แแ:
https://gitlab.com/kvaps/docs.example.org - GitHub-แแ:
https://github.com/kvaps/docs.example.org
แแแแแแแแ แงแฃแ แแแฆแแแแกแแแแก, แแแแแแ แแแแแฌแแแแ
แฌแงแแ แ: www.habr.com