áá! Docker ááľáá˝á áááááŁáľ áĽá áá° áŠá áááľáľ ááá°ááŤáľ áĽá á áŞá á ááśáá˝á ááłáŞáŤáá˝ á á áᥠá°ááááᢠá áá á¨ááľ, ᨠGitlab áá áááŤááľ áá°ááŠá, á á áá áĽáá´áľ áĽáá°ááŤá á áĽá, á áĽáááĽ, á¨á§á᧠ááľáá áááááľ.
áá
áŁá˘áŤ á°ááľáŚ áá áá˘
á°ááłáłá áá°áľá á¨áŁáś áááááŁáľ áá¨áአᣠáá áá á áá á Gitlab CI áĽá áá°áá áŞáŤáá˝á áá° áŠá áááľáľ ááá°ááŤáľ á á°á áááŠáŁá¸á áá ááłáŞáŤáá˝ áá á°áááĽáˇáᢠáᏠá áá¨á¨áť áľááĽááą á¨á áá áĽáááááłááá˘
á˝áá áĽáá°ááá
áŤááľá ááłáŞáŤáá˝ áá¸ááá-
áá, qbec, áŤááŽ, git-crypt и GitLab CI á°áááá á áŤáŁá˘áá˝á á¨ááá á áá.
áááľ
á¨áá áá áá°ááá Dockerfile á áááááľ áá áŤáᎠáá°ááá á¨qbec ááá˘áŤ Gitlab-áŻáá ᨠKubernetes-executor áá á ááá¨á áá ᨠHelm áá áłáá˝á á¨qbec áá áŤá°áአá¨ááľ-ááŞááľ ááá˘áŤ á¨ááłáŞáŤ áłáĽá ááľá ááá አá¨áĽá á¨ááááŞáŤ á§á᧠ááľáá áĽá ááľáá˝á á áááŤáá˝ áá°áĽá°áĽ á ááśáá˛á áá°ááŤáľ áá° ááł á áááá áľ áá á ááśá˝ áĽá áľáĽá°áŁáá˝ á°áááá á áŤáŁá˘áá˝ áá°áá áŞáŤáá˝á ááááá
1. á¨áá áá áá°ááá
áĽáá° ááŽáááłá˝á ááłáᣠá áá áá á¨á°ááᣠá¨á°ááľ áá°á፠áŁá˘áŤ áááá á áĽááááŤááᢠáá á¨áááááłááľ áááľ á áá᪠ááá˘
á¨áááááłááą áááŹá°áŽá˝á áááŤáá á°áá˝ áľááĽááą áľáá˝ á°á¨á᪠áĽáááŤá˝áááᢠá¨áá°á á áŁá˘áŤ áá°áŽá˝ á á°áᨠá¨ááἠááł áĽá á ááłááľ ááááľ áá¤á˝ááὠᣠá á°á ááá á˛á á¨á ᣠá áŤáŞ áá áážá˝á áŤáááŤá ᣠá¨áááááᥠáááŹá°áŽá˝ áľáá˝ á á°áᨠáááł áá°á¨á°áŤáᢠá¨ááá áŽáąáᣠáĽááá áá á ááááłá ááá áá áĽá ááĽáĽ á áĽááśá˝ ááľáĽ áŤá á¨áááá˝ áľáĽáľáĽ áĽáá˛ááľáą áŤáľá˝áááłáᣠá¨ááŤá áá á áá áá°á°á ááá áŁá˘áŤ áŤá áá áŻá¸áá˘
áááľá á áá¤áą áá á¨áá፠ááá á áĽá á¨ááአá¨á¤á˝á˛á¤áá¤á áááá˝ áľáĽáľáĽ á ááá áá° ááááá ááŤá˝ ááľá°ááá ááľáá áĽá á¨áľáŤ áŚáł áŤáááá˘
ááá á ááá ááľáĽ ááŤá áĽá ááá¨á áľá˝ááá áĄ-
á á˛áąá áŁá˘áŤ á ááľááá áááĄ-
hugo new site docs.example.org
áĽá á á°ááłáłá áá ᨠgit áá¨ááť:
cd docs.example.org
git init
áĽáľáŤáá áľá¨áľ á¨áĽá áŁá˘áŤ áášá áá áĽá á ááľ ááá á áአáá áĽáá˛áłá á ááááŞáŤ á ááľ ááĽáĽ áááááľ á ááĽá ᣠááĽáĽ á¨á áĽááľ áľáĽáľáĽ áĽáť áá áĽá áŁá˘áŤá˝á á¨ááá ááŁá¸áá á áá˝ áŤááááá˘
áĽáá° ááĽáĽ áĽáá áááá
áአáľáŠá¨áľ ááľá áľ áĽááááá á ááŽáááłá˝á áá¨ááť ááľáĽ á¨áá˝áł áááá˝á ááľááἠá áŤáľááááá ááááá á ááá á áá áá áááááľ áĽáá˝ááá. git áááľ ááąá:
git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn
áľááá á¨ááŽáááłá˝á áá á ááĽáł á¨ááááą áááá˝ áĽáť á áĽá áá¨ááť ááľáĽ áááá ᣠáĽá á¨á°áááá ááĽáĽ áá ááľ á¨á°áá°á áá¨ááť áááá áĽá á áĽáą ááľáĽ áá áááŁáą áááŤá ᣠáááľá ᣠáááá á¨ááá ááá ááłáĽ áĽá áááŤáľ á¨áá áľáᢠá¨áááŁáŁá áááŚá˝.
á ááááŠá áĽááľá°áŤááá config.toml:
baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"
ááľááá á áá á°á¨á, ááŽáĽ áá˝áá:
hugo server
áĽá á á áľáŤáťá
á¨áááľ áá˝ áááá á áĽáááá áááľ/_index.md:
# My docs site
## Welcome to the docs!
You will be very smart :-)
á á˛áľ á¨á°áá ᨠáá˝ á á˝á áłá áá˝ áĽááł
áŁá˘áŤ áááá áᣠá ááá áŤááąáĄ-
hugo
á¨áá፠áááľ á¨á
ááĽ/ áĽá á¨áĽááľá áŁá˘áŤ áááá.
á áá, á áááŤá˝á áá, áá˛áŤáá áĽááľááŁááá .gitignore:
echo /public > .gitignore
áááŚáťá˝áá ááľá¨áá á áááą-
git add .
git commit -m "New site created"
2. Dockerfile á áááááľ áá
á¨áá áŤáááŤá˝áá á áááá á¨ááááá˝á áľ áá ááᢠáĽá áĽááá áá áĽáá°áá áŤá ááá áĽá áááá-
.
âââ deploy
â âââ app1
â âââ app2
âââ dockerfiles
âââ image1
âââ image2
- áśá¨ááááá˝/ - á¨Dockerfiles áá áááŤáá˝á áĽá á¨áĽáá ááá°áť ááľáá˝á áááááŁáľ á¨ááŤáľááááľá áááŽá˝ áá áááá˘
- áá°ááŤáľ/ - áá°áá áŞáŤááťá˝áá á áŠá áááľáľ ááľáĽ ááá°ááŤáľ áááŤáá˝á ááá
áľááá , á ááááľ áá á¨ááááŞáŤáá 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 áááľ ááá á¨, áá
ááľá ááŁáá
áľááá
, á¨áá¨á¨áťá ááľá áĽáť áááá á¨ááhttpd (ááá ááĽá°áľ HTTP á áááá) áĽá á¨á
ááĽ/ - á áľáłá˛áľá˛ááľ á¨ááá¨á áŁá˘áŤá˝á áááľá˘
áááŚáťá˝áá ááľá¨áá á áááą-
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. áŤáᎠáá°ááá
áĽáá° áśá¨á ááľáá˝ ááá˘áŁ ááá áá áá°ááŠá˘
ááľáá áááááŁáľ, ááŤáŁáá áĽáť áŤááą kaniko á áľááá áĽá á¨á ááá á¨áááŁáł á ááľ áŤáľá°ááááľáŁ á á áá ááľáĽáŁ á áśáá°á á áŠá ááľá¨á áá˝áááĄ-
docker run -ti --rm
-v $PWD:/workspace
-v ~/.docker/config.json:/kaniko/.docker/config.json:ro
gcr.io/kaniko-project/executor:v0.15.0
--cache
--dockerfile=dockerfiles/website/Dockerfile
--destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1
á¨áľ registry.gitlab.com/kvaps/docs.example.org/website - á¨áśáá°á ááľáá áľá ᣠá¨á°ááᣠá áá á áŤáľ-á°á á áśáá°á áááἠááľáĽ ááááŤáá˘
áááŞáŤ --áá¸á፠á áśáá°á áááἠá¤áľ ááľáĽ ááĽááĽáŽá˝á ááá¸áἠááá áľáááłá, áá°á áá°á ááłá ááááŁá registry.gitlab.com/kvaps/docs.example.org/website/cache, ááá áá á áááŞáŤá áá ááááľ áááá˝ áá˝áá --cache-repo.
á¨áśáá°á-áááἠá¤áľ á á˝á áłá áá˝ áĽááł
4. á¨qbec ááá˘áŤ
áá á á°áá á¨á°ááŤáŠ áááŞáŤáá˝ á áááŹá˝áá áá° áĽá ááááá˝ áá°ááŤáľ á ááááá áľ áĽá á ááľ ááľáĽ ááá á áá ááአáááá˝ á ááááá áľ áá áá áĽáááľ ááá áá˝ááá˘
Qbec á á°á¨ááŞá á áľááááá áááŞáŤáá˝ á ááá ᨠHelm áťááśá˝á áĽáá˛áŤááᥠááá áľáááłá áĽá áĽáá° áá°á á ááááŤáá˝ á á°ááłáłá ááááľ áĽáá˛á አááá áľáááłá ᣠáá á á¨á°ááŤáŠ áááŚá˝á ááĽááą á¨áá°áá á á˝ááłá á¨áᎠᣠáĽá áá á°áá ChartMuseum á¨áá ááá á áľáááááľ áŤáľáááłáᢠáááľáᣠáá áłáá˝á á¨ááľ á ááĽáł áá¨áá¸áľ áĽá ááľáŤáľ áľá˝ááá á˘
á áľááľá áĽáá°á°ááááŠáľ áááá áá°ááŤáśá˝ á áááŤá ááľáĽ áĽáá¨ááťáá áá°ááŤáľ/:
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.á áŤáŁá˘áá˝, qbec á áľááľá ááŁáŞ á áŤáŁá˘á ááĽáŻá áĽá á¨á ááááŠá á áľáŤáť áĽá á¨áľá áŚáł á áá áŤáá kubeconfig ááľáˇáá˘
á áá á˛á°áŤá ááŁáŞ á áŤáŁá˘áŁ qbec áááá áá°á°ááá¸á á¨áŠá áááľáľ áááľá°á áĽá áá°á°ááá¸á á¨áľá áŚáł áĽáť áá á¨ááá¨ááᣠáááľáᥠááá°ááŤáľ á¨á áá á áá á á ááśá˝ áĽá á áľá áŚáłáá˝ ááŤá¨á áááŤá¨á á ááááĽááľáá˘
á áľááá á¨áá áááá á áá
ááá ááľáĽ áŤááľá á
ááĽáŽá˝ áááá áá˝ááá˘
ááá á áŤáŁá˘áá˝á á¨á°ááášáľ á qbec.yaml, áĽá á ááá ááľáĽ params.libsonnetááĽááą áááŞáŤáá˝á á¨áľ ááá°áľ áĽááłááŚáľ á¨áááá¨á.
á ááá á áááľ áááŤáá˝á áĽááŤáááĄ-
- á áŤááľ/ ááá°áá áŞáŤá˝á ááá ááááŤáá˝ áĽáá ááááŁá ᣠáĽááą á áááąá á jsonnet áĽá á áá°á á ᨠyaml áááá˝ ááľáĽ ááááš áá˝ááá˘
- á á¨áŁá˘áá˝/ - áĽáá á¨á áŤáŁá˘áŤá˝áá áááá á°ááááŽá˝ (áááŞáŤáá˝) áĽáááááá.
á ááŁáŞ áááľ áááá˝ á áá:
- á á¨áŁá˘áá˝/base.libsonnet - áááá á áŤáŁá˘áá˝ á¨á፠áááŞáŤáá˝á áááá
- á áŤáŁá˘/default.libsonnet - áá áŤáŁá˘á áĽáá°áá á¨á°áááš áááŞáŤáá˝ ááá ááŁáŞ
áĽáá¨ááľ á á¨áŁá˘áá˝/base.libsonnet áĽá áááááŞáŤá áááá˝á áá¤áśá˝á áĽá፠áŤááá˘
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
á¨ááááŞáŤ áááá˝ááá áĽááá á áááá˝ / áľá áŁá˘áŤ.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-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-áŻáá á Kubernetes-executor ááááŠ
áĽáľá¨ á áἠáá áľá¨áľ áá°á ááá áĽáť áá á¨á°á áááŠáľ gitlab-áŻá á áľááľá á á°ááá áá˝á (LXC áŽáá´ááá) áá á¨áźá ááá á¨áśá¨á-á áľááá áá. ááááŞáŤ ááᣠá áĽá gitlab ááľáĽ á á ááá áá á°á¨á á¨á°áááš á¨áĽááá áŻáŽá˝ ááŤá¨á á ááŤáśá˝ áá áŠáᢠáááá ááŽáááśá˝ á¨ááá¨áĽ ááľáá˝á áááĽá°ááá˘
ááá áá áĽáá° ááááľ áĽáá°ááŤáłá¨á áá á ááŤá á á°ááŁáŤáááľ áĽá á á°á áááľ á¨ááľ á áŁá á°áľáá á áá°áá. ááĽáŤááłááą ááŽáááľáŁ áĽá ááĽáŤááłááą á áŤáŁá˘ áĽááłá á¨á°ááŤáŠ áŻáŽá˝ áĽáá˛á°áአááľá¨á á áŁá á¨á°áťá áĽá á áááŽá° ááá áľááá ááá˘
áĽáá° áĽáľá áá, áá á ááŤá˝ á˝áá á áá°áá, ááááŤáąá á áá áĽáá°ááŤáá gitlab-áŻá á ááĽáł á áŠá áááľáľ á¨ááŽáááłá˝á á áŤá ááá˘
Gitlab gitlab-áŻáá áá° áŠá áááľáľ ááá°ááŤáľ á¨á°ááá á¨ááá áťááľ áá°áŁáᢠáľááá ááá áŤááĽááľ ááá á˘áá ááᢠá¨áááᣠááľáá°áŤ áááŽáááłá˝á á á ááĽáŽá˝ -> CI / á˛á˛ -> áŻáŽá˝ áĽá áá° ááŞá áŤáľá°ááá:
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á á áá áá á°ááŁáŽáťá˝áá ááá¨ááá ááśá˝á ááá á áĽáá˛á˝á áŻáŠ á áľááááá áአáአááĽáśá˝á áá°áŁáá˘
ááá ááá á áľááá á¨á°á°áŤ, á ááá ááľáĽ á¨á°áááá áá áŻá áá¨áľ á ááĽááľ áŻáŽá˝, á ááŽáááľá á ááĽáŽá˝ ááľáĽ.
á¨áłá¨áá áŻá á á˝á áłá áá˝ áĽááł
áá á áŤá á ááá áá? - á á, á áŁá ááá áá! áŻáŽá˝á á áĽá á ááááἠááá á˝áá á¨áá á¨á áá á áá áŻáŽá˝ ááá áŤá áĽá áá°áá°áłáá˘
6. ᨠHelm áá áłáá˝á á¨QBEC áá áŤá°ááŠ
áááááἠáľááá°áá gitlab-áŻá á¨ááŽáááłá˝á á áŤáᣠá áĽá Git áá¨ááť ááľáĽ á¨ááááá˝á áľ áá á áá ááá˘
áĽáá° á¨á°áᨠá áŤá ááááá¸á áĽáá˝ááá áľá á¨áá áá°ááľ áá á¨á°ááŤáŠ á ááá˝á ááá°ááŤáľ á á á°ááᢠáľá á¨áá á áŁá á á°á°ááá, á á°áᨠgitlab-áŻá, áĽáąá á áŠá áááľáľ áááľá°á á ááľ áá áĽáť á¨áá°ááŤ. áľááá ááĽáą á¨á°áᨠáá°áá áŞáŤ áĽááľááááĄ-
cd deploy
qbec init gitlab-runner
cd gitlab-runner
á áá áá á¨áŠá áááľáľ á áŤááľá á áĽá á áááá˝á ᣠáá ááá á¨áá ᨠHelm áá áł ááá°áąá˘ á¨qbec á ááą áĽá áὠᨠHelm áá áłáá˝á á ááĽáł ᨠGit áá¨ááť á¨ááľáŤáľ á˝ááł ááá˘
git submoduleá á áá áá áĽááľá˝áááĄ-
git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner
á áá áááŤá áťá/ááľááĽ-áŻá á¨áĽáá áá¨ááť ágitlab-áŻá áá áł áááá˘
ááá˝ áá¨ááťáá˝ á á°ááłáłá ááááľ áááá áá˝áá, áááłá, áááá áá¨ááť á¨áŚáá´áá áá áłáá˝ áá
https://github.com/helm/charts
áááá áĽáááá˝ áááá˝/gitlab-runner.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;
std.native('expandHelmTemplate')(
'../vendor/gitlab-runner',
params.values,
{
nameTemplate: params.name,
namespace: env.namespace,
thisFile: std.thisFile,
verbose: true,
}
)
á¨ááááŞáŤá áááá áá° expandHelmTemplate áá° áá áłá ááááąá áĽááááá, á¨á፠params.áĽá´áśá˝, á¨á áŤáŁá˘á áááŞáŤáá˝ á¨ááááľá°á, á¨ááŤá áĽáá áááŁá
- áľá á áĽááľ - á¨áááá፠áľá
- á¨áľá áŚáł - á¨áľá áŚáł áá° ááá á°áááá
- áá ááá - áá° á¨á áá ááá á¨áááľá°áá ááááľ á¨ááŤáá á áľááá áááŞáŤ
- ááľ - áľááá áŤáłáŤá helm á áĽááľ áá áł á áá°áĄá áľ áá á¨ááá áá᪠áĽá´áśá˝ áá
á áá á¨áĽáá ááá á ááľáĽ áŤááľá áááŞáŤáá˝ áĽáááá˝ á á¨áŁá˘áá˝/base.libsonnet:
local secrets = import '../secrets/base.libsonnet';
{
components: {
gitlabRunner: {
name: 'gitlab-runner',
values: {
gitlabUrl: 'https://gitlab.com/',
rbac: {
create: true,
},
runnerRegistrationToken: secrets.runnerRegistrationToken,
},
},
},
}
áľáŠá¨áľ ááľáĄ runnerRegistrationToken á¨ááŤá ááá áĽáááŁáá ááľáĽáŽá˝/base.libsonnetᣠáĽáááĽá¨ááĄ-
{
runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}
ááá ááá áĽáá°áá°áŤ áĽáááľá˝áĄ-
qbec show default
ááá ááá á áĽáááľ á¨ááᣠá¨áá áá°á á¨á°á°ááŤáá á ááá áááľ áááľááá°á áĽáá˝ááááĄ-
helm uninstall gitlab-runner
áĽá áŤá°ááŠáľáŁ áá á qbec á áŠááĄ
qbec apply default
7. ᨠgit-crypt ááá˘áŤ
á á áá áá á¨ááľáἠáŻá á¨á áá፠ááá á áá á áááľááá˘
.
âââ components
â âââ gitlab-runner.jsonnet
âââ environments
â âââ base.libsonnet
â âââ default.libsonnet
âââ params.libsonnet
âââ qbec.yaml
âââ secrets
â âââ base.libsonnet
âââ vendor
âââ gitlab-runner (submodule)
áá á ááľ ááľáĽ ááľáĽáŽá˝á áá¨áá¸áľ á°á áááą á¨á°á á á á áá°áá ᣠá áá°á? áľááá áĽááąá á áľááá áááľá á á ááĽáá˘
á áĽáááá áá áá ááľ á°áááá á˛áŁá áááá áľááá á áá°áĽá. ááľáĽáŽá˝á ááľá°ááá áá˝ááᢠqbec áĽá á áĽááľá CI áľáááľ á¨á áŤáŁá˘ á°ááááŽá˝ á áŠáá˘
ááá áá áĽá ááľáĽáŽá˝á ááá á¨áá˝á á áŁá ááľáĽáľáĽ ááŽáááśá˝ áááŤá¸áá áἠááŁá á¨áááŁá áá, áááá á á áŤáŁá˘áŤá á°ááááŽá˝ ááľáĽ ááá á áŁá á áľá¸á᪠áááá.á á°á¨ááŞá, á áá ááłá áá, áľá áĽáá°áá á áááľ áľáá ááłáŞáŤ ááááá á áá˝áá git-crypt.
git-crypt áĽáá˛áá áááá á¨ááľá˘á áłáŞá áĽááľáłáľáááĄáŁ áĽáá˛áá áááśá˝á á áááááᣠá ááááľ áĽá á ááľ ááłá áá áľáá°áá áĽáá°áá á¨á á á°ááłáłá ááááľ ááááłáľ á¨ááŤáľá˝á á ááá ááš ááá˘
á¨á°áŤá á áá á¨ááááŞáŤá ááá git-crypt ááá¨ááťá˝á áááá˝á ááá á á ááĽááĄ-
git crypt init
á¨ááá ááá áŤáááľáŁ áá˛áŤáá ááá ááŽáááľ á°áŁáŁáŞ á ááá áĽáŤáľáá áá¨á áá˝ááá˘
git-crypt add-gpg-user [email protected]
á áá ááááľ áá áá á¨áá ááááá á°á á áá áá áá áá¨ááť áááłáľ áá˝ááá˘
á¨ááá ááá á¨ááá áĽá áŤáá á á á á áá ááááľ ááś á¨ááŽáááľ áááá áá° áá ááá áľá˝ááá áĄ-
git crypt export-key /path/to/keyfile
áľááá áá° áá á¨á°áᨠááááá á°á ááá ááá á¨áĽááľáá áá¨ááť á˛ááŞááľ ááľá¨á áá˝ááá˘
á¨ááááŞáŤ ááľá˘áŤá˝áá á¨ááááá
á áľ áá ááá˘
á ááá á áááŤá ááľáĽ áĽááłáá ááľáłááľá
á á°áá/ááľááĽ-áŻá/áá፠áŤááá áľ ááľáĽáŽá˝/, á ááľáĄ áŤááľá áááá áááá˝ á˘áááŞááľ áĽááľáá, ááá
á ááá áĽáááĽáŤáá ááľáĽáŽá˝ / .gitattributes áĽáá°áá
á áááľ áááľ áŤáááĄ-
* 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 áŻá áĽá á áá ááááá˘
áĽáá ááá ááá ááá áá, á á˛áľ áĽáááĽáŤáá dockerfiles/á¨ááłáŞáŤ áłáĽá/Dockerfile áĽáá°áá á áááľ áááľ áŤáááĄ-
FROM alpine:3.11
RUN apk add --no-cache git git-crypt
RUN QBEC_VER=0.10.3
&& wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz
| tar -C /tmp -xzf -
&& mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/
RUN KUBECTL_VER=1.17.0
&& wget -O /usr/local/bin/kubectl
https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl
&& chmod +x /usr/local/bin/kubectl
RUN HELM_VER=3.0.2
&& wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz
| tar -C /tmp -zxf -
&& mv /tmp/linux-amd64/helm /usr/local/bin/helm
áĽáá°áááá¨áąáľ, á áá ááľá áá á¨áĽáá áá°áá áŞáŤ ááá°ááŤáľ á¨á°á ááááŁá¸áá áááá áááááŤáá˝á áĽáááááá. áŤááá á áľá°áá áĽáá á áááááᢠkubectlááá áá á¨á§á᧠ááľááá á ááŤáááá áľ áá á¨áĽáą áá ááŤááľ áááá áááá.
áĽáá˛áá á¨áŠá áááľáľ áá ááááááľ áĽá áá° áĽáą ááá°ááŤáľ á gitlab-runner áá°áá áŠáľ ááľáá˝ áá áááááľ á ááĽáá˘
áá áá áááľá¨á á¨gitlab-runner'om áá áá° áááŤá áááąáĄ
cd deploy/gitlab-runner
áĽá á á˛áľ á áŤá áá¨áአáááá˝ / rbac.jsonnet:
local env = {
name: std.extVar('qbec.io/env'),
namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;
[
{
apiVersion: 'v1',
kind: 'ServiceAccount',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'Role',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
rules: [
{
apiGroups: [
'*',
],
resources: [
'*',
],
verbs: [
'*',
],
},
],
},
{
apiVersion: 'rbac.authorization.k8s.io/v1',
kind: 'RoleBinding',
metadata: {
labels: {
app: params.name,
},
name: params.name,
},
roleRef: {
apiGroup: 'rbac.authorization.k8s.io',
kind: 'Role',
name: params.name,
},
subjects: [
{
kind: 'ServiceAccount',
name: params.name,
namespace: env.namespace,
},
],
},
]
áĽáá˛áá á á˛áśášá áááŞáŤáá˝ á ááľáĽ áĽáááááá á á¨áŁá˘áá˝/base.libsonnetá áá áá á áááľáááĄ-
local secrets = import '../secrets/base.libsonnet';
{
components: {
gitlabRunner: {
name: 'gitlab-runner',
values: {
gitlabUrl: 'https://gitlab.com/',
rbac: {
create: true,
},
runnerRegistrationToken: secrets.runnerRegistrationToken,
runners: {
serviceAccountName: $.components.rbac.name,
image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
},
},
},
rbac: {
name: 'gitlab-runner-deploy',
},
},
}
áľáŠá¨áľ ááľáĄ $.components.rbac.áľá áááłá¨á áľá áááá á áŤá 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 --áááŤáá˝áĽá á¨ááááŞáŤáá á¨á§á᧠ááľááŽáťá˝áá áááá¨áą-
á¨ááááŞáŤá á¨á§á᧠ááľáá á á˝á áłá áá˝ áĽááł
áááŤá áá°á¨áľ áŤá°á¨á áááŁáłáá˝ áśá¨á ááľáá˝á áááááŁáľ áĽáŠ áá¸á ááá áá áá°áá áŞáŤá áá° áŠá áááľáľ ááá°ááŤáľ áĽááłááá áá áá á°áᢠááᢠá á˛áľ áááŤáá˝á áá áŽá ááážáá˝ ááá°áĄ áľááá˝á, á áá áááł, á¨á§á᧠ááľáá ááĽááą ááľááá áá° á áŽáá áľáŞáľ áááááľ áááŤáá.
áá áá á˝áá ááááłáľ á¨áśáá°á ááľáá˝á ááááŁáľ áĽááá áá á¨áááŤáá˝ áá á¨á°ááŤá áá, áĽá á áááŹá˝áá áá° á áááŤá áááááľ. áŁáá¤áľ, á¨á°á°á á°áĄ ááľáá˝ áľáŞáśá˝ á áááľ áŽáľ á¨á°áááĄá áľ. á ááá ááááť ááááľá ááľááá á¨áá˝ááľ á áá á ááŁá ááᢠáŁáá¤áľ- á áááŤáá˝.
10. á ááśáá˛á áá°ááŤáľ
Gitlab-áŻá ááľá˘áŤá˝áá áĽáá˛ááłáŁ á¨áá áŤáá፠áááá áá° áá ááá áĽá áá° CI á áŤáŁá˘ á°ááááŽá˝ áá¨á á ááĽáá˘
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo
á¨á°áááá ááĽá¨ááá á Gitlab ááľáĽ áĽááľáááŁáá ᣠááá
á áá° ááŽáááłá˝á á
ááĽáŽá˝ áĽáááłáá-
á
ááĽáŽá˝ -> CI / á˛á˛ -> á°ááááŽá˝
áĽá á á˛áľ á°áááá ááá áŠ:
ááááľ
ááá
áá
áĽá á á¨áá°á¨áááľ
áááĽá
á áľááľ
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 á ááłááľ á áłá˛áľ á ááŤáŽá˝á á áá á°áááĄ-
- á ááłááľ/áá°áá áŞáŤá áŠáľ - á¨á ááľ á¨á°áá°á áá°áá áŞáŤ áááŤá áĽáá˛áááš áŤáľá˝áááłá
- --á áľááľáľáĄk8s-á ááľ __incluster__ - áá áá°ááŤáľ gtilab-áŻá á áá áŤá áľ á°ááłáłá áááľá°á ááľáĽ áĽáá°áá¨á°áľ á¨áááá á áľááłá á°áááá ááᢠáá á áľááá ááᣠá áá áá፠qbec á áĽááľá kubeconfig ááľáĽ á°áľáá á¨áŠá áááľáľ á áááá áááááľ ááááŤáá˘
- -á áĽá - qbec á¨áááĽáŤá¸á ááĽáśá˝ áá° ááá áą áááł áĽáľáŞáᥠáľá¨áľ áĽáá˛á áĽá áŤáľááľá°áá áĽá á¨á፠á áá á á°áłáŤ á¨áá፠áŽáľ áĽáľáŞá ááá áľá¨áľá˘
- -á á - á ááá°ááá á áááąá áĽáť áŤá°áááá áĽááá á áá ? á áá°ááŤáľ áá.
áááŚáťá˝áá ááľá¨áá á áááą-
git add .gitlab-ci.yml
git commit -m "Automate deploy"
áĽá á áá git push áááá¨áťááťá˝á áĽáá´áľ áĽáá°á°á°áአáĽáááá¨áłáááĄ-
á¨ááá°áá á¨á§á᧠ááľáá á á˝á áłá áá˝ áĽááł
11. áá° ááłá á áááá áľ áá á
ááśá˝ áĽá áľáĽá°áŁáá˝
á áĽáááá ááᣠá¨áá áŤááľ áĽááááá˝ áááááá áááᎠá áááááľ áááááŁáľ áĽá áááľá¨áľ á á áá¸áᣠáá áŁá˘áŤáá ááááá á áááá ááĽá áá፠áá¨á á áááááᢠáľááá , á¨á áá á°áááá á áá ááááľ áĽáááłáá áĽá á ááá á áááŤá ááľáĽ á¨ááἠáá፠áá°ááŤáľá áĽáááááá.
ááłáĄ ááá áá: á áá á¨áĽá ááľá áľá á¨áá á ááá ááĽá áĽáá°áá ááááŁáᢠáŁáá¤áľ, áĽá á¨á፠á áŤáľ-á°á áá° Kubernetes áŤá°áŤáŠá˘
áĽááá á áááľ áľáŤáá˝ á áĽá ááľáĽ áĽáááá .gitlab-ci.yml:
build_website:
extends: .build_docker_image
variables:
GIT_SUBMODULE_STRATEGY: normal
script:
- mkdir -p $CI_PROJECT_DIR/artifacts
- /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
artifacts:
paths:
- artifacts/
only:
refs:
- master
- tags
deploy_website:
extends: .deploy_qbec_app
script:
- DIGEST="$(cat artifacts/website.digest)"
- qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"
áĽáŁááá á áááŤá áĽáá°á¨ááá áŤáľá°áá áŁáá¤áľ Đş ááŁááť ááĽáŤ á¨áááŁáł_áľá¨-áá˝ áĽá á áá áĽáá áááá $CI_COMMIT_REF_NAME á $CI_COMMIT_TAG, áááľá, á Git ááľáĽ áŤááľá áááŤáá˝ áĽááľáááłáá áĽá á áá ááľáá á¨á§á᧠ááľáááá áŤáľááá¨áá á¨áŽáá˝á á áááŤá áľá áĽáááááá. áá á°áá á¨áááŤáá˝ áá áĽáá°áá°áŤ áἠááŁá á¨áááŁá áá, áá á á¨áŁá˘áŤá á á˝á á°-ááśáá˝á á áśá-áááἠá¤áľ ááľáĽ áŤáá á¨á°áá°á áľáŞáľ áááľááἠáŤáľá˝ááá.
áá á˛áą á¨áŁá˘áŤá áľáŞáľ á¨áśá¨á áá፠áľá ááá¨á á áá˝áá áľ áá á ááá á Kubernetes áááŚá˝á áááá˝ á ááĽá ᣠá áá áá፠áá°áá áŞáŤáá á¨á á˛áą ááľá áá áĽáá°áá á ááá¨áá ᣠááááŤáąá ááá áááŚá˝á á áŤáľá°ááá ᢠá¨áá°ááŤáľ ááááŤ.
á ááŤá --vm:ext-str digest="$DIGEST" á qbec - ááŤá á°áááá áá° jsonnet áĽáá˛áŤáłáá ááá áľáááłá. áááá¨áťá˝á á¨áĽáŤááłááą áááá áá á áááľá°á ááľáĽ áĽáá°áá áĽáá˛á°áŤá áĽááááááᢠá¨á°áá°á á¨ááľá áĽáľá áá áááááľ áĽá á˛áá¨á áá°ááŤáąá áááľááľ áľáááŤáľáááá á áá ááá¨á á¨áá˝ááá á¨áá፠áľá áá áá á áá˝ááá˘
áĽáá
ᣠáŤáᎠá¨ááľáá ááá¨áľ áá° ááá á¨ááłá á˝ááłá áá¨áłáá (á ááŤá --ááá¨áľ-ááá)
á¨á፠áá
áá ááá áĽááľá°ááááá áĽá á áá°ááŠá áľ áá áĽáááŁááá˘
á¨áĽáá áááŞáŤáá˝ áĽáááá áá°ááŤáľ/áľá¨-áá˝/á áŤáŁá˘/base.libsonnet á áá áĽáá°áá áááľáá
{
components: {
website: {
name: 'example-docs',
image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
replicas: 1,
containerPort: 80,
servicePort: 80,
nodeSelector: {},
tolerations: [],
ingressClass: 'nginx',
domain: 'docs.example.org',
},
},
}
á°á¨ááááᣠá áá ááááá áá áááŁáľ áŁáá¤áľ á¨áśáá°á ááľá áááŁáłá ááááŤá á áľá á¨áá , áĽá á¨á፠áá° Kubernetes áŤá°ááŠáľ.
áááŚáťá˝áá ááľá¨áá á áááą-
git add .
git commit -m "Configure dynamic build"
á áá áááá¨áąáľá˘ git push áĽáá°áá áŤá ááá áá¨áľ á ááĽá
á¨á§á᧠ááľáá á á˝á áłá áá˝ áĽááł áááľá°á
á ááá á°á¨á 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/**/*
áááŚá˝ ááľáĽ áááŚá˝á áá¨áłá°áá á á°áá/ááľááĽ-áŻá/ áĽá áľáŤá˝áá á¨ááá°á á°á áŤá áĽáť ááá˘
áááŚáťá˝áá ááľá¨áá á áááą-
git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"
git push, áá á¨á°áťá áá:
á¨áááá á¨á§á᧠ááľáá á á˝á áłá áá˝ áĽááł
12. á°áááá á áŤáŁá˘áá˝
á¨á§á᧠ááľááŽáťá˝áá á á°áááá á á¨áŁá˘áá˝ áááŁááľ ááá á áá ááá˘
ááááŞáŤ áľáŤáá áĽááááá á¨áááŁáł_áľá¨-áá˝ á áĽá .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:
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 á á˛áľ á ááŤá áĽááŤáááĄ- --áá°áá áŞáŤ-áá፠- á¨á°áá¨ááľá á¨áá°áá áŞáŤ áľáŞáśá˝ áá፠áĽáá˛á°áĄ áĽá á áá
áá፠ááľáĽ áĽáť áĽáá˛á°áŠ ááá
áľáááłá ᣠá Kubernetes ááľáĽ ááĽáśá˝á á˛ááĽáŠ áĽá á˛áŤá á qbec á áĽááą áá áĽáť áá°áŤáá˘
áľááá
, ááĽáŤááłááą áááá á¨á°áᨠá áŤáŁá˘ ááá á á áá˝áá, ááá áá á ááá á°ááłáłááá áĽáá°áá áá áá.
áĽáá á áĽáá áááá qbec áááá á°ááĽá, á¨áą ááá qbec ááŁáŞ áá°ááĽáŠ á¨á áŤáŁá˘áŤá˝áá ááŠááśá˝ ááááá˝ á¨áááááá áľ áá áá áá (áááá áĽá ááŁáŞ)
áŤáá áááá á áŤáŁá˘ á áá°ááŤáľ/áľá¨-áá˝/qbec.yaml
spec:
environments:
review:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
á¨ááŤá áá° ááľáĽ áĽááááá áá°ááŤáľ/áľá¨-áá˝/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
áĽá ááĽáą áĽá áááŞáŤáá˝á ááá áá°ááŤáľ/áľá¨-áá˝/á áŤáŁá˘/áááł.libsonnet:
// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');
base {
components+: {
website+: {
name: 'example-docs-' + slug,
domain: subdomain + '.docs.example.org',
},
},
}
áĽáŤáá á áá
áĽáá áĽááááá á áá_ááááá
áááŤá á˛áááľ á¨ááá°á
á°á áĽá gitlab áĽááłááá°á˝á áľ áĽá
á áá ááááᢠGIT_STRATEGYᥠá¨áá, á áá áĽá áááá áŁáá¤áľ- á
áááŤá áĽá á áĽáą á áŠá ááááá á°ááá˘
áľáá˝ á፠á¨ááŤáᣠááá áá á¨á áá ááá ááááľ á áááááá˘
á ááŤá á ááŤá áĽáŤááłááąá áááá á áá´á áľá áŚáł áá áá°ááŤáľ áá, áá
á áááá áá á áá ááááľ áá˝áá.
áááŚáťá˝áá ááľá¨áá á áááą-
git add .
git commit -m "Enable automatic review"
git push, git Checkout -b áá°á, á¨ááľ áááľ áááť áá¨áŤ, á á¨áááĽ:
á ááľáἠááľáĽ á¨á°áá አá áŤáŁá˘áá˝ á á˝á áłá áá˝ áĽááł
ááá ááá áĽá¨á°áŤ áá? - á áŁá áĽáŠáŁ á¨áá¨áŤ á ááŤáá˝áá á°áááĄ- git Checkout ááł, git push á ááŁáĽ: áá¨áŤá áŤáŁá˘á ááá°á¨á á¨áá°áŠáľ áľáŤáá˝ áŤáááá áľá á°áľ ááľáŤáłá¸áá áĽáá¨áááŁááá˘
áĽáá á ááŽáááą ááľáĽ áŤá ááááá ááᢠá áááŤáá˝á ááá á áĽáá°áá˝á áá˛áŤáá ááá˝ ááľá¨á áĽááááá, áĽáą ááááĽá áá˝áá .gitlab-ci.yml ááľáĽáŤá á°ááááŽá˝á ááá áŤáľáá áĽá ááľá¨áąá˘
áľááá á¨áĽááą áĽá á áá°á á á á áááŤáá˝ áĽáť áĽáá˛áááľ á áĽáĽá ááá¨áŤá, áááłá á áŁáá¤áľ, ááá ááĽáŤááłááą á áŤáŁá˘ á¨á°áᨠá¨á°ááááŽá˝ áľáĽáľáĽ ááá áŠ.
13 áá°áá áŞáŤáá˝á ááááá
áĽááá á ááŤáŽá˝ áĽáá˛áłáŠ, ááá ááá á áŤáľáááááłá .gitlab/route-map.yml áĽá á ááľáĄ áŤááľá áááá á¨ááááśá˝ áááŚá˝ áááᚠᣠá áĽá áááł á áŁá ááá áááá-
# Indices
- source: /content/(.+?)_index.(md|html)/
public: '1'
# Pages
- source: /content/(.+?).(md|html)/
public: '1/'
áááŚáťá˝áá ááľá¨áá á áááą-
git add .gitlab/
git commit -m "Enable review apps"
git push, áĽá áŤá¨áááĄ:
á¨áááá áá°áá áŞáŤ á ááŤá á á˝á áłá áá˝ áĽááł
áĽáŤ á°á ááá!
á¨ááŽáááľ áááŽá˝áĄ-
- á ááľáἠáááĄ-
https://gitlab.com/kvaps/docs.example.org - GitHub áááĄ
https://github.com/kvaps/docs.example.org
áľá áľáŠá¨áľá áĽááá°áááá, áĽáá°áá°áąáľ á°áľá á á°áááá
ááá: hab.com