Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Aloha! I kēia mau lā, ua hoʻokuʻu ʻia nā mea hana automation maikaʻi loa no ke kūkulu ʻana i nā kiʻi Docker a no ka hoʻoili ʻana iā Kubernetes. Ma kēia mea, ua hoʻoholo wau e pāʻani me GitLab, e aʻo pono i kona hiki a, ʻoiaʻiʻo, hoʻonohonoho i ka pipeline.

Ua hoʻoikaika ʻia kēia hana e ka pūnaewele kubernetes.io, i hanaia mai code kumu 'akomi, a no kēlā me kēia noi wai i ho'ouna 'ia, ho'opuka 'akomi ka lopako i ka mana o ka paena me kāu mau ho'ololi a hā'awi i kahi loulou no ka nānā 'ana.

Ua hoʻāʻo wau e kūkulu i kahi kaʻina hana like mai ka wā ʻōpala, akā ua kūkulu ʻia ma Gitlab CI a me nā mea hana manuahi aʻu i hoʻohana ai e hoʻohana i nā noi i nā Kubernetes. I kēia lā e haʻi hope wau iā ʻoe e pili ana iā lākou.

E kūkākūkā ka ʻatikala i nā mea hana e like me:
Hugo, qbec, kaniko, git-crypt и GitLab CI me ka hoʻokumu ʻana i nā kaiapuni dynamic.

ʻIke maʻiʻo

  1. E hui me Hugo
  2. Ke hoʻomākaukau nei i ka Dockerfile
  3. E ʻike i kaniko
  4. ʻO ka ʻike ʻana iā qbec
  5. Ke ho'āʻo nei iā Gitlab-runner me Kubernetes-executor
  6. Ke hoʻohana nei i nā palapala Helm me qbec
  7. Ke hoʻolauna nei i ka git-crypt
  8. Ke hana nei i kiʻi pahu hana
  9. ʻO kā mākou pipeline mua a me ka hui ʻana o nā kiʻi ma nā lepili
  10. ʻOmomikia hoʻolālā
  11. Nā mea hana a me ka hui ʻana i ka wā e paʻi ana i ka haku
  12. Kaiapuni ikaika
  13. Nānā i nā polokalamu

1. Ka ike ana ia Hugo

Ma ke ʻano he laʻana o kā mākou papahana, e hoʻāʻo mākou e hana i kahi kahua paʻi palapala i kūkulu ʻia ma Hugo. ʻO Hugo kahi mea hana maʻiʻo paʻa.

No ka poʻe i kamaʻāina ʻole i nā generator static, e haʻi hou aku wau iā ʻoe e pili ana iā lākou. ʻAʻole like me nā ʻenekini pūnaewele maʻamau me kahi waihona a me kekahi PHP, i ka wā i noi ʻia e ka mea hoʻohana, e hoʻopuka i nā ʻaoʻao ma ka lele, ua hoʻolālā ʻia nā mea hana static. Hāʻawi lākou iā ʻoe e lawe i nā kumu, maʻamau i kahi hoʻonohonoho o nā faila ma Markdown markup a me nā kumu hoʻohālike, a laila e hōʻuluʻulu iā lākou i kahi pūnaewele paʻa.

ʻO ia, ma muli o ka hopena, e loaʻa iā ʻoe kahi papa kuhikuhi a me kahi hoʻonohonoho o nā faila HTML i hana ʻia, hiki iā ʻoe ke hoʻouka i kahi hoʻokipa haʻahaʻa a loaʻa kahi pūnaewele hana.

Hiki iā ʻoe ke hoʻokomo iā Hugo ma ka ʻāina a hoʻāʻo iā ia:

Ke hoʻomaka nei i kahi pūnaewele hou:

hugo new site docs.example.org

A i ka manawa like ka waihona git:

cd docs.example.org
git init

I kēia manawa, maʻemaʻe kā mākou pūnaewele a i mea e ʻike ʻia ai kekahi mea ma luna, pono mākou e hoʻohui i kahi kumumanaʻo; ʻo kahi kumumanaʻo he hoʻonohonoho o nā templates a me nā lula kikoʻī i hana ʻia ai kā mākou pūnaewele.

No ke kumuhana a mākou e hoʻohana ai E aʻo, ʻo ia, i koʻu manaʻo, kūpono loa no kahi kahua palapala.

Makemake wau e nānā nui i ka ʻoiaʻiʻo ʻaʻole pono mākou e mālama i nā faila kumuhana i kā mākou waihona papahana; akā, hiki iā mākou ke hoʻohui iā ia me ka hoʻohana ʻana. git submodule:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

No laila, ʻo kā mākou waihona e loaʻa wale nā ​​faila e pili pono ana i kā mākou papahana, a e mau ke kumuhana pili i kahi loulou i kahi waihona kikoʻī a me kahi hana i loko, ʻo ia hoʻi, hiki ke huki mau ʻia mai ke kumu kumu a ʻaʻole makaʻu. hoʻololi like ʻole.

E hoʻoponopono i ka config config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

I kēia manawa hiki iā ʻoe ke holo:

hugo server

A ma ka helu wahi http://localhost:1313/ e nānā i kā mākou pūnaewele hou i hana ʻia, nā hoʻololi a pau i hana ʻia i ka papa kuhikuhi e hoʻohou i ka ʻaoʻao wehe i ka polokalamu kele pūnaewele, kūpono loa!

E ho'āʻo kākou e hana i kahi ʻaoʻao uhi ma maʻiʻo/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

Kiʻi kiʻi o ka ʻaoʻao hou i hana ʻia

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

No ka hana ʻana i kahi pūnaewele, holo wale:

hugo

Nā mea waihona lehulehu/ a ʻo ia kāu pūnaewele.
ʻAe, ma ke ala, e hoʻohui koke kākou iā ia .gigignore:

echo /public > .gitignore

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .
git commit -m "New site created"

2. Hoʻomākaukau i ka Dockerfile

ʻO ka manawa kēia e wehewehe i ke ʻano o kā mākou waihona. Hoʻohana pinepine au i kekahi mea e like me:

.
├── deploy
│   ├── app1
│   └── app2
└── dockerfiles
    ├── image1
    └── image2

  • dockerfiles/ - loaʻa nā papa kuhikuhi me Dockerfiles a me nā mea āpau e pono ai no ke kūkulu ʻana i kā mākou kiʻi Docker.
  • kau aku/ — aia nā papa kuhikuhi no ka hoʻolele ʻana i kā mākou mau noi iā Kubernetes

No laila, e hana mākou i kā mākou Dockerfile mua ma ke ala 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" ]

E like me kāu e ʻike ai, aia i ka Dockerfile ʻelua FROM, kapa ʻia kēia hiʻohiʻona hana nui-pae a hiki iā ʻoe ke hoʻokaʻawale i nā mea āpau ʻole mai ke kiʻi docker hope loa.
No laila, e loaʻa wale ke kiʻi hope poulihttpd (māmā HTTP kikowaena) a lehulehu/ - ka ʻike o kā mākou pūnaewele i hoʻokumu ʻia.

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. ʻIke i kaniko

Ma ke ʻano he mea hana kiʻi docker, ua hoʻoholo wau e hoʻohana kaniko, no ka mea ʻaʻole pono kāna hana i kahi docker daemon, a hiki ke hana ʻia ke kūkulu ponoʻī ma luna o kekahi mīkini a hiki ke mālama pono ʻia ka cache i loko o ka papa inoa, a laila e hoʻopau i ka pono e loaʻa kahi waihona hoʻomau piha.

No ke kūkulu ʻana i ke kiʻi, e holo wale i ka ipu me kaniko executor a hāʻawi iā ia i ka pōʻaiapili kūkulu o kēia manawa; hiki ke hana ʻia kēia ma ka wahi, ma o 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

'Ahea registry.gitlab.com/kvaps/docs.example.org/website - ka inoa o kāu kiʻi docker; ma hope o ke kūkulu ʻana, e hoʻokuʻu ʻia ia i loko o ka papa inoa docker.

ʻO ka pākuhi --cache hiki iā ʻoe ke hūnā i nā papa ma ka papa inoa docker; no ka laʻana i hāʻawi ʻia, e mālama ʻia lākou i loko registry.gitlab.com/kvaps/docs.example.org/website/cache, akā hiki iā ʻoe ke kuhikuhi i kahi ala ʻē aʻe me ka hoʻohana ʻana i ka parameter --cache-repo.

Kiʻi o ka docker-registry

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

4. Ka ike ana i qbec

Qbec he mea hana e hiki ai iā ʻoe ke wehewehe wehewehe i kāu mau palapala noi a kau iā lākou i nā Kubernetes. ʻO ka hoʻohana ʻana iā Jsonnet ma ke ʻano he syntax nui e hiki ai iā ʻoe ke maʻalahi i ka wehewehe ʻana i nā ʻokoʻa ma waena o nā kaiapuni he nui, a aneane hoʻopau loa i ka hana hou ʻana i nā code.

Hiki ke ʻoiaʻiʻo loa kēia i nā hihia kahi e pono ai ʻoe e kau i kahi noi i kekahi mau pūʻulu me nā ʻokoʻa ʻokoʻa a makemake e wehewehe wehewehe iā lākou ma Git.

ʻAe ʻo Qbec iā ʻoe e hāʻawi i nā palapala Helm ma ka hāʻawi ʻana iā lākou i nā palena kūpono a laila e hana iā lākou ma ke ʻano like me nā hōʻike maʻamau, me ka hiki iā ʻoe ke hoʻopili i nā ʻano like ʻole iā lākou, a ʻo ia hoʻi, hiki iā ʻoe ke hoʻopau i ka pono. hoʻohana i ChartMuseum. ʻO ia hoʻi, hiki iā ʻoe ke mālama a hāʻawi pololei i nā pakuhi mai git, kahi o lākou.

E like me kaʻu i ʻōlelo ai ma mua, e mālama mākou i nā deployments āpau i ka papa kuhikuhi kau aku/:

mkdir deploy
cd deploy

E hoʻomaka kākou i kā mākou noi mua:

qbec init website
cd website

I kēia manawa ua like ke ʻano o kā mākou noi:

.
├── components
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
└── qbec.yaml

e nana i ka waihona qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

Maanei mākou makemake nui i spec.environments, ua hana mua ʻo qbec i kahi kaiapuni paʻamau no mākou a lawe i ka helu kikowaena, a me ka inoa inoa mai kā mākou kubeconfig o kēia manawa.
I kēia manawa i ka hoʻolaha ʻana i ka paʻamau kaiapuni, e hoʻoili mau ʻo qbec i ka puʻupuʻu Kubernetes i ʻōlelo ʻia a i ka inoa inoa i ʻōlelo ʻia, ʻo ia hoʻi, ʻaʻole pono ʻoe e hoʻololi i waena o nā pōʻaiapili a me nā inoa inoa i mea e hana ai i kahi hoʻolālā.
Inā pono, hiki iā ʻoe ke hoʻololi mau i nā hoʻonohonoho i kēia faila.

Ua wehewehe ʻia kāu mau kaiapuni a pau ma qbec.yaml, a ma ka waihona params.libsonnet, kahi e ʻōlelo ai kahi e loaʻa ai nā ʻāpana no lākou.

A laila ʻike mākou i ʻelua papa kuhikuhi:

  • eiiiiiaiou / - E mālama ʻia nā hōʻike a pau no kā mākou noi; hiki ke wehewehe ʻia ma jsonnet a me nā faila yaml maʻamau
  • kaiapuni/ - maanei e wehewehe mākou i nā ʻano like ʻole (parameters) no kā mākou kaiapuni.

Ma ka maʻamau, loaʻa iā mākou ʻelua faila:

  • environments/base.libsonnet - e loaʻa nā ʻāpana maʻamau no nā kaiapuni āpau
  • environments/default.libsonnet — loaʻa nā ʻāpana ʻokoʻa no ke kaiapuni ka paʻamau

e wehe kakou environments/base.libsonnet a hoʻohui i nā ʻāpana no kā mākou mea mua ma laila:

{
  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',
    },
  },
}

E hana pū kākou i kā mākou ʻāpana mua component/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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

Ma kēia faila ua wehewehe mākou i ʻekolu hui Kubernetes i ka manawa hoʻokahi, penei: kuhikuhi i ka hana, Service и Pau. Inā makemake mākou, hiki iā mākou ke hoʻokomo iā lākou i loko o nā ʻāpana like ʻole, akā i kēia manawa e lawa ia no mākou.

Ka Mooolelo O jsonnet Ua like loa ia me ka json maʻamau, ma ke kumu, ua kūpono ʻo json maʻamau i ka jsonnet, no laila i ka wā mua e maʻalahi paha ʻoe e hoʻohana i nā lawelawe pūnaewele e like me yaml2json e hoʻololi i kāu yaml maʻamau i json, a i ʻole, inā ʻaʻole i loaʻa i kāu mau mea hoʻololi, a laila hiki ke wehewehe ʻia ma ke ʻano o ka yaml maʻamau.

Ke hana pū nei jsonnet Manaʻo nui wau e hoʻokomo i kahi plugin no kāu hoʻoponopono

No ka laʻana, aia kahi plugin no vim vim-jsonnet, e ho'ā ana i ka hōʻailona syntax a hoʻokō 'akomi jsonnet fmt i kēlā me kēia manawa āu e mālama ai (pono i hoʻokomo ʻia ʻo jsonnet).

Ua mākaukau nā mea a pau, i kēia manawa hiki iā mākou ke hoʻomaka e kau:

E ʻike i ka mea i loaʻa iā mākou, e holo kāua:

qbec show default

Ma ka hopena, e ʻike ʻoe i nā hōʻike yaml i hoʻohana ʻia i ka hui paʻamau.

Maikaʻi, e hoʻohana i kēia manawa:

qbec apply default

Ma ka hopena e ʻike mau ʻoe i nā mea e hana ʻia i kāu hui, e noi ʻo qbec iā ʻoe e ʻae i nā loli ma ke kākau ʻana. y hiki iā ʻoe ke hōʻoia i kou manaʻo.

Ua mākaukau a hoʻolālā ʻia kā mākou noi!

Inā hoʻololi ʻoe, hiki iā ʻoe ke hana i nā manawa a pau:

qbec diff default

e ʻike i ka hopena o kēia mau hoʻololi i ka hoʻolaha ʻana i kēia manawa

Mai poina e hoʻokomo i kā mākou hoʻololi:

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. Ke ho'āʻo nei iā Gitlab-runner me Kubernetes-executor

A hiki i kēia manawa ua hoʻohana maʻamau wale au gitlab-runner ma ka mīkini i hoʻomākaukau mua ʻia (LXC pahu) me ka pūpū a i ʻole docker-executor. I ka wā mua, ua loaʻa iā mākou kekahi mau mea holo i ka honua i wehewehe ʻia i kā mākou gitlab. Ua hōʻiliʻili lākou i nā kiʻi docker no nā papahana āpau.

Akā, e like me ka hoʻomaʻamaʻa i hōʻike ʻia, ʻaʻole kēia koho ka mea kūpono loa, ma ke ʻano o ka pono a me ka palekana. ʻOi aku ka maikaʻi a me ka noʻonoʻo pono e hoʻokaʻawale ʻia nā mea holo kaʻawale no kēlā me kēia papahana, a i ʻole no kēlā me kēia kaiapuni.

ʻO ka mea pōmaikaʻi, ʻaʻole pilikia kēia, no ka mea i kēia manawa e hoʻolaha mākou gitlab-runner pololei ma ke ʻano he ʻāpana o kā mākou papahana ma Kubernetes.

Hāʻawi ʻo Gitlab i kahi pakuhi helm i mākaukau no ka hoʻoili ʻana i ka gitlab-runner iā Kubernetes. No laila ʻo ka ʻike wale nō āu e hana ai hōʻailona hōʻailona no kā mākou papahana ma Nā hoʻonohonoho -> CI / CD -> Nā mea holo a hāʻawi aku i ka hoʻokele.

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

ʻAuhea:

  • https://gitlab.com - ka helu wahi o kāu kikowaena Gitlab.
  • yga8y-jdCusVDn_t4Wxc — hōʻailona hoʻopaʻa inoa no kāu papahana.
  • rbac.create=ʻoiaʻiʻo - hāʻawi i ka mea holo i ka nui o nā pono e hiki ai ke hana i nā pods e hana i kā mākou mau hana me ka hoʻohana ʻana i ka kubernetes-executor.

Inā hana pololei nā mea a pau, pono ʻoe e ʻike i kahi mea holo i hoʻopaʻa inoa ʻia ma ka ʻāpana Holoholo, ma kāu hoʻonohonoho papahana.

Kiʻi kiʻi o ka mea holo i hoʻohui ʻia

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

He maʻalahi anei ia? - ʻAe, maʻalahi kēlā! ʻAʻohe pilikia hou me ka hoʻopaʻa inoa ʻana i nā kukini me ka lima, mai kēia manawa e hana ʻia a luku ʻia nā mea holo.

6. E hoʻolālā i nā palapala Helm me QBEC

Mai ko makou manao e noonoo gitlab-runner ʻāpana o kā mākou papahana, ʻo ia ka manawa e wehewehe ai i kā mākou waihona Git.

Hiki iā mākou ke wehewehe ma ke ʻano he ʻāpana ʻokoʻa paena, akā i ka wā e hiki mai ana mākou e hoʻolālā e kau i nā kope like ʻole paena pinepine loa, like ole gitlab-runner, e kau ʻia hoʻokahi wale nō no ka hui Kubernetes. No laila e hoʻomaka kākou i kahi noi kaʻawale no ia:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

I kēia manawa ʻaʻole mākou e wehewehe lima i nā hui Kubernetes, akā e lawe i kahi pakuhi Helm i mākaukau. ʻO kekahi o nā mea maikaʻi o qbec ka hiki ke hāʻawi pololei i nā palapala Helm mai kahi waihona Git.

E hoʻohui iā ia me ka hoʻohana ʻana i ka submodule git:

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

I kēia manawa ka papa kuhikuhi mea kūʻai/gitlab-runner Loaʻa iā mākou kahi waihona me kahi pakuhi no gitlab-runner.

Ma ke ʻano like, hiki iā ʻoe ke hoʻohui i nā waihona ʻē aʻe, no ka laʻana, ka waihona holoʻokoʻa me nā palapala kiʻi https://github.com/helm/charts

E wehewehe kākou i ka ʻāpana component/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,
  }
)

ʻO ka hoʻopaʻapaʻa mua i expandHelmTemplate hele mākou i ke ala i ka pakuhi, a laila params.values, ka mea a mākou e lawe ai mai nā ʻāpana kaiapuni, a laila hele mai ka mea me

  • nameTemplate - inoa hoʻokuʻu
  • namespace - hoʻoili ʻia ka inoa inoa i ka hoʻokele
  • keiaPila - kahi ʻāpana e pono ai e hele i ke ala i ka faila o kēia manawa
  • haʻi waha - hōʻike i ke kauoha kāʻei hoʻokele me nā hoʻopaʻapaʻa a pau i ka wā e hāʻawi ai i ka pakuhi

I kēia manawa e wehewehe mākou i nā ʻāpana no kā mākou ʻāpana i environments/base.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

E hoʻolohe runnerRegistrationToken lawe mākou mai kahi faila waho mea huna/base.libsonnet, e hana kākou:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

E nānā inā hana nā mea a pau:

qbec show default

inā pololei nā mea a pau, a laila hiki iā mākou ke holoi i kā mākou hoʻokuʻu mua ʻia ma o Helm:

helm uninstall gitlab-runner

a hoʻonoho iā ia ma ke ala like, akā ma o qbec:

qbec apply default

7. Hoʻomaka i ka git-crypt

Git-crypt He mea hana ia e hiki ai iā ʻoe ke hoʻonohonoho i ka hoʻopunipuni akaka no kāu waihona.

I kēia manawa, ua like kā mākou papa kuhikuhi no ka gitlab-runner:

.
├── components
│   ├── gitlab-runner.jsonnet
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
├── qbec.yaml
├── secrets
│   └── base.libsonnet
└── vendor
    └── gitlab-runner (submodule)

Akā ʻaʻole palekana ka mālama ʻana i nā mea huna ma Git, ʻaʻole anei? No laila pono mākou e hoʻopili pono iā lākou.

ʻO ka mea maʻamau, no ka manaʻo o hoʻokahi hoʻololi, ʻaʻole kūpono kēia i nā manawa a pau. Hiki iā ʻoe ke hoʻololi i nā mea huna i qbec a ma o nā hoʻololi kaiapuni o kāu ʻōnaehana CI.
Akā he mea pono ke hoʻomaopopo ʻia aia kekahi mau papahana paʻakikī i hiki ke loaʻa i nā mea huna hou aʻe; e paʻakikī loa ka hoʻoili ʻana iā lākou āpau ma o nā ʻano hoʻololi.

Eia kekahi, i kēia hihia ʻaʻole hiki iaʻu ke haʻi iā ʻoe e pili ana i kahi mea hana kupanaha e like me git-crypt.

git-crypt He mea maʻalahi hoʻi ia e hiki ai iā ʻoe ke mālama i ka mōʻaukala holoʻokoʻa o nā mea huna, a me ka hoʻohālikelike ʻana, hoʻohui a hoʻoholo i nā paio e like me kā mākou maʻamau e hana ai i ka hihia o Git.

ʻO ka mea mua ma hope o ke kau ʻana git-crypt pono mākou e hana i nā kī no kā mākou waihona:

git crypt init

Inā loaʻa iā ʻoe kahi kī PGP, a laila hiki iā ʻoe ke hoʻohui koke iā ʻoe iho ma ke ʻano he hoa hana no kēia papahana:

git-crypt add-gpg-user [email protected]

Ma kēia ala hiki iā ʻoe ke hoʻokaʻawale i kēia waihona me ka hoʻohana ʻana i kāu kī pilikino.

Inā ʻaʻohe kī PGP a manaʻo ʻole ʻoe, a laila hiki iā ʻoe ke hele ma ke ala ʻē aʻe a hoʻokuʻu aku i ke kī pāhana:

git crypt export-key /path/to/keyfile

No laila, ʻo kēlā me kēia mea i lawe ʻia i waho waihona kī hiki iā ia ke hoʻokaʻawale i kāu waihona.

ʻO ka manawa kēia e hoʻonohonoho i kā mākou mea huna mua.
E hoʻomanaʻo wau iā ʻoe aia mākou i ka papa kuhikuhi deploy/gitlab-runner/, kahi i loaʻa iā mākou kahi papa kuhikuhi mea huna/, e hoʻopili kākou i nā faila a pau i loko, no kēia e hana mākou i faila mea huna/.gitattributes me keia mau mea:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

E like me ka ʻike ʻia mai ka ʻike, ua uhi ʻia nā faila āpau * e hoʻokele ʻia git-crypt, koe wale no ka nui loa .gitattributes

Hiki iā mākou ke nānā i kēia ma ka holo ʻana:

git crypt status -e

He papa inoa o nā faila a pau i loko o ka waihona kahi i hiki ai ke hoʻopili ʻia

ʻO ia wale nō, i kēia manawa hiki iā mākou ke hana palekana i kā mākou mau hoʻololi:

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

No ka pale ʻana i kahi waihona, holo wale:

git crypt lock

a e lilo koke nā faila i hoʻopili ʻia i mea binary, ʻaʻole hiki ke heluhelu iā lākou.
No ka wehe ʻana i ka waihona, holo:

git crypt unlock

8. E hana i kahi kiʻi pahu hana

ʻO ke kiʻi pahu pahu hana he kiʻi me nā mea hana a pau a mākou e hoʻohana ai no ka hoʻolālā ʻana i kā mākou papahana. E hoʻohana ʻia e ka mea holo Gitlab e hana i nā hana hoʻonohonoho maʻamau.

Maʻalahi nā mea a pau ma ʻaneʻi, e hana kākou i mea hou dockerfiles/toolbox/Dockerfile me keia mau mea:

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

E like me kāu e ʻike ai, ma kēia kiʻi mākou e hoʻokomo ai i nā pono āpau a mākou i hoʻohana ai e kau i kā mākou noi. ʻAʻole pono mākou ma ʻaneʻi ke ʻole kubectl, akā makemake paha ʻoe e pāʻani me ia i ka wā hoʻonohonoho pipeline.

Eia kekahi, i hiki iā mākou ke kamaʻilio me nā Kubernetes a kau aku iā ia, pono mākou e hoʻonohonoho i kahi kuleana no nā pods i hana ʻia e gitlab-runner.

No ka hana ʻana i kēia, e hele kāua i ka papa kuhikuhi me gitlab-runner:

cd deploy/gitlab-runner

a hoʻohui i kahi mea hou component/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,
      },
    ],
  },
]

E wehewehe pū mākou i nā ʻāpana hou i environments/base.libsonnet, e like me kēia i kēia manawa:

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',
    },
  },
}

E hoʻolohe $.components.rbac.name pili i inoa no ka ʻāpana rbac

E nānā kākou i ka mea i loli:

qbec diff default

a hoʻohana i kā mākou hoʻololi i nā Kubernetes:

qbec apply default

Eia kekahi, mai poina e hoʻololi i kā mākou hoʻololi i 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. ʻO kā mākou pipeline mua a me ka hui ʻana o nā kiʻi ma nā hōʻailona

Ma ke kumu o ka papahana mākou e hana ai .gitlab-ci.yml me keia mau mea:

.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

E ʻoluʻolu e hoʻohana mākou GIT_SUBMODULE_STRATEGY: maʻamau no kēlā mau hana kahi e pono ai ʻoe e hoʻomaka i nā submodules ma mua o ka hoʻokō ʻana.

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .gitlab-ci.yml
git commit -m "Automate docker build"

Manaʻo wau hiki iā mākou ke kapa palekana i kēia he mana v0.0.1 a hoʻohui i ka tag:

git tag v0.0.1

E hoʻohui mākou i nā hōʻailona i ka wā e pono ai mākou e hoʻokuʻu i kahi mana hou. E hoʻopaʻa ʻia nā kiʻi ma nā kiʻi Docker i nā inoa Git. E hoʻomaka ana kēlā me kēia paʻi me kahi hōʻailona hou i ke kūkulu ʻana i nā kiʻi me kēia tag.

E hana kāua git push --tags, a e nānā kākou i kā mākou paipu mua:

Kiʻi kiʻi o ka paipu mua

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

He mea pono ke kau ʻana i kou manaʻo i ka ʻoiaʻiʻo o ka hui ʻana ma nā hōʻailona kūpono no ke kūkulu ʻana i nā kiʻi docker, akā ʻaʻole kūpono no ka hoʻoili ʻana i kahi noi iā Kubernetes. No ka mea hiki ke hāʻawi ʻia nā hōʻailona hou i nā hana kahiko, i kēia hihia, ʻo ka hoʻomaka ʻana i ka pipeline no lākou e alakaʻi i ka hoʻolaha ʻana o ka mana kahiko.

No ka hoʻoponopono ʻana i kēia pilikia, hoʻopaʻa ʻia ke kūkulu ʻana i nā kiʻi docker i nā hōʻailona, ​​​​a me ka waiho ʻana o ka noi i kahi lālā. haku, kahi i hoʻopaʻa inoa ʻia ai nā mana o nā kiʻi i hōʻiliʻili ʻia. ʻO kēia kahi e hiki ai iā ʻoe ke hoʻomaka i ka rollback me kahi hoʻihoʻi maʻalahi haku- nā lālā.

10. 'Otomatika o ka hoʻolaha

I mea e hoʻokaʻawale ai ʻo Gitlab-runner i kā mākou mea huna, pono mākou e hoʻokuʻu aku i ke kī waihona a hoʻohui iā ia i kā mākou mau mea hoʻololi CI:

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

E mālama mākou i ka laina hopena ma Gitlab; e hana i kēia, e hele mākou i kā mākou papahana papahana:
Nā hoʻonohonoho -> CI / CD -> Nā mea hoʻololi

A e hana kākou i mea hoʻololi hou:

ʻAno
Key
Value
Ua paleʻia
Masked
laulā

File
GITCRYPT_KEY
<your string>
true (i ka wā hoʻomaʻamaʻa hiki iā ʻoe false)
true
All environments

Kiʻi kiʻi o ka hoʻololi i hoʻohui ʻia

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

I kēia manawa e hōʻano hou i kā mākou .gitlab-ci.yml e hoʻohui ana iā ia:

.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

Eia mākou i hiki ai i kekahi mau koho hou no qbec:

  • --root kekahi/app - hiki iā ʻoe ke hoʻoholo i ka papa kuhikuhi o kahi noi kikoʻī
  • --ikaika:k8s-context __incluster__ - he mea hoʻololi kilokilo kēia e ʻōlelo ana e hoʻokō ʻia ka hoʻolaha ʻana i ka pūʻulu like kahi e holo ai ʻo gtilab-runner. Pono kēia no ka mea inā ʻaʻole e hoʻāʻo ʻo qbec e ʻimi i kahi kikowaena Kubernetes kūpono i kāu kubeconfig
  • --kali — hoʻoikaika iā qbec e kali a hiki i nā kumuwaiwai āna i hana ai e hele i loko o ke kūlana Mākaukau a laila e puka wale me kahi code exit-code.
  • -ʻAe - hoʻopau wale i ka pūpū pili He 'oiaʻiʻo kēnā? i ka wā i hoʻoili ʻia.

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .gitlab-ci.yml
git commit -m "Automate deploy"

A mahope iho pahu kuʻi git e ʻike mākou pehea i kau ʻia ai kā mākou mau noi:

Kiʻi kiʻi o ka paipu lua

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

11. Nā mea hana a me ka hui ʻana i ka wā e paʻi ana i ka haku

ʻO ka maʻamau, lawa nā ʻanuʻu i hōʻike ʻia ma luna nei e kūkulu a hāʻawi i kahi microservice, akā ʻaʻole mākou makemake e hoʻohui i kahi hōʻailona i kēlā me kēia manawa e pono ai mākou e hoʻonui i ka pūnaewele. No laila, e lawe mākou i kahi ala ʻoi aku ka ikaika a hoʻonohonoho i kahi hoʻoili ʻana ma ka lālā kumu.

He maʻalahi ka manaʻo: i kēia manawa ke kiʻi o kā mākou paena e kūkulu hou ʻia i kēlā me kēia manawa āu e hoʻokomo ai haku, a laila hoʻopololei i nā Kubernetes.

E hōʻano hou i kēia mau hana ʻelua i kā mākou .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"

E ʻoluʻolu, ua hoʻohui mākou i kahi pae haku к refs no na hana build_website a ke hoʻohana nei mākou i kēia manawa $CI_COMMIT_REF_NAME ma kahi o $CI_COMMIT_TAG, ʻo ia hoʻi, ua wehe ʻia mākou mai nā hōʻailona ma Git a i kēia manawa e pana mākou i kahi kiʻi me ka inoa o ka lālā commit i hoʻomaka i ka pipeline. He mea pono e hoʻomaopopo e hana pū kēia me nā hōʻailona, ​​​​e hiki ai iā mākou ke mālama i nā kiʻi paʻi o kahi pūnaewele me kahi kikoʻī kikoʻī i ka docker-registry.

Ke hoʻololi ʻole ʻia ka inoa o ka docker tag no kahi mana hou o ka pūnaewele, pono mākou e wehewehe i nā loli i nā Kubernetes, inā ʻaʻole ia e hoʻihoʻi hou i ka noi mai ke kiʻi hou, ʻoiai ʻaʻole ia e ʻike i nā loli i ka hōʻike hoʻolaha.

Koho —vm:ext-str digest = “$DIGEST” no qbec - hiki iā ʻoe ke hāʻawi i kahi hoʻololi waho i jsonnet. Makemake mākou e hoʻihoʻi ʻia i loko o ka pūpū me kēlā me kēia hoʻokuʻu ʻana o kā mākou noi. ʻAʻole hiki iā mākou ke hoʻohana hou i ka inoa inoa, ʻaʻole hiki ke hoʻololi ʻia i kēia manawa, no ka mea pono mākou e hoʻopaʻa ʻia i kahi mana kikoʻī o ke kiʻi a hoʻomaka i ka hoʻoili ʻana i ka wā e loli ai.

Ma ʻaneʻi e kōkua ʻia mākou e ka hiki iā Kaniko ke mālama i kahi kiʻi digest i kahi faila (koho --digest-file)
A laila e hoʻoili mākou i kēia faila a heluhelu iā ia i ka manawa o ka waiho ʻana.

E hōʻano hou i nā ʻāpana no kā mākou deploy/website/environments/base.libsonnet e like me kēia:

{
  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',
    },
  },
}

Hana ʻia, i kēia manawa ke komo i loko haku hoʻomaka i ke kūkulu ʻana i ke kiʻi docker no paena, a laila e kau iā Kubernetes.

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .
git commit -m "Configure dynamic build"

E nānā mākou ma hope pahu kuʻi git pono mākou e ʻike i kekahi mea e like me kēia:

Kiʻi kiʻi o ka paipu no ka haku

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Ma ke kumu, ʻaʻole pono mākou e hoʻihoʻi hou i ka gitlab-runner me kēlā me kēia pana, ke ʻole, ʻoiaʻiʻo, ʻaʻohe mea i loli i kāna hoʻonohonoho ʻana, e hoʻoponopono i loko. .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/**/*

Nā loli hou e ʻae iā ʻoe e nānā i nā loli i loko deploy/gitlab-runner/ a e hoʻomaka i kā mākou hana inā loaʻa kekahi

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

pahu kuʻi git, ʻoi aku ka maikaʻi:

Kiʻi kiʻi o ka paipu hou

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

12. Nā kaiapuni ikaika

ʻO ka manawa kēia e hoʻololi i kā mākou pipeline me nā kaiapuni ikaika.

ʻO ka mua, e hoʻohou i ka hana build_website i loko o kā mākou .gitlab-ci.yml, e wehe ana i ka poloka mai ia mea wale no, ka mea e koi ai iā Gitlab e hoʻomaka iā ia ma kekahi hana i kekahi lālā:

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/

A laila hoʻohou i ka hana deploy_website, hoʻohui i kahi poloka ma laila 'ia:

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"

E ʻae kēia iā Gitlab e hoʻopili i ka hana me prod kaiapuni a hōʻike i ka loulou pololei iā ia.

I kēia manawa, e hoʻohui kākou i ʻelua mau hana:

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

E hoʻokuʻu ʻia lākou ma ka pana ʻana i kekahi mau lālā koe wale nō ka haku a e kau i ka mana o ka paena.

ʻIke mākou i kahi koho hou no qbec: --app-tag - hiki iā ʻoe ke hoʻopaʻa inoa i nā mana o ka noi a hana wale i loko o kēia tag; i ka wā e hana ai a luku i nā kumuwaiwai ma Kubernetes, e hana wale ʻo qbec me lākou.
Ma kēia ala ʻaʻole hiki iā mākou ke hana i kahi kaʻawale no kēlā me kēia loiloi, akā hoʻohana hou i ka mea like.

Maʻaneʻi mākou hoʻohana qbec noi i ka loiloi, ma kahi o qbec hoʻohana paʻamau - ʻo kēia ka manawa e hoʻāʻo ai mākou e wehewehe i nā ʻokoʻa no kā mākou kaiapuni (nānā a me ka paʻamau):

E hoʻohui kākou manual kaiapuni i deploy/website/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

A laila e haʻi aku mākou i loko 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

A kākau iho i nā ʻāpana maʻamau no ia i loko 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',
    },
  },
}

E nānā pono kākou i ka jobu stop_review, e hoʻoulu ʻia i ka wā i holoi ʻia ai ka lālā a no laila ʻaʻole hoʻāʻo ʻo gitlab e nānā aku ua hoʻohana ʻia. GIT_STRATEGY: ʻaʻohe, ma hope mākou clone haku- lālā a holoi i ka loiloi ma o ia.
He mea huikau iki, akā, ʻaʻole au i ʻike i kahi ala ʻoi aku ka nani.
ʻO kahi koho ʻē aʻe, ʻo ia ke kau ʻana i kēlā me kēia loiloi i kahi inoa inoa hōkele, hiki ke hoʻopau loa ʻia.

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .
git commit -m "Enable automatic review"

pahu kuʻi git, git checkout -b ho'āʻo, hoʻāʻo kumu git push, nānā:

Kiʻi kiʻi o nā kaiapuni i hana ʻia ma Gitlab

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Ke hana nei nā mea a pau? - maikaʻi, holoi i kā mākou lālā hoʻāʻo: haku ʻoki puka, git push kumu: ho'āʻo, ʻike mākou i ka hana ʻana o nā hana holoi kaiapuni me ka hewa ʻole.

Maʻaneʻi makemake wau e wehewehe koke e hiki i kekahi mea hoʻomohala i kahi papahana ke hana i nā lālā, hiki iā ia ke hoʻololi .gitlab-ci.yml waihona a komo i nā mea huna.
No laila, koi ikaika ʻia e ʻae i kā lākou hoʻohana wale ʻana no nā lālā i pale ʻia, no ka laʻana ma haku, a i ʻole e hana i kahi ʻokoʻa o nā mea hoʻololi no kēlā me kēia kaiapuni.

13. Nānā Apps

Nānā i nā polokalamu ʻO kēia kahi hiʻohiʻona GitLab e hiki ai iā ʻoe ke hoʻohui i kahi pihi no kēlā me kēia faila i loko o ka waihona e ʻike koke iā ia i kahi wahi i hoʻonohonoho ʻia.

I mea e ʻike ʻia ai kēia mau pihi, pono ʻoe e hana i kahi faila .gitlab/route-map.yml a wehewehe i nā hoʻololi ala āpau i loko; i kā mākou hihia he mea maʻalahi loa ia:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

Mai poina e hoʻokomo i kā mākou hoʻololi:

git add .gitlab/
git commit -m "Enable review apps"

pahu kuʻi git, a nānā:

Kiʻi kiʻi o ke pihi Review App

Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Ua pau ka hana!

Nā kumu papahana:

Mahalo iā ʻoe no kou nānā ʻana, manaʻolana wau ua makemake ʻoe Ke hoʻāʻo nei i nā mea hana hou no ke kūkulu ʻana a me ka hoʻopololei ʻana i ka hoʻolaha ʻana ma Kubernetes

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka