Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Nnọọ! N'oge na-adịbeghị anya, ewepụtala ọtụtụ ngwaọrụ akpaaka dị mma maka iwulite onyonyo Docker yana maka ibuga na Kubernetes. N'akụkụ a, ekpebiri m igwu egwu na GitLab, mụọ nke ọma ike ya na, n'ezie, guzobe pipeline.

Ọrụ a sitere na weebụsaịtị webụsaịtị kubernets.io, nke sitere na koodu isi mmalite na-akpaghị aka, na maka ọdọ mmiri ọ bụla a na-ezigara ya, robot na-ewepụta ụdị nlele nke saịtị ahụ na mgbanwe gị ma na-enye njikọ maka ikiri.

Agbalịrị m ịmepụta usoro yiri nke ahụ site na ọkọ, mana arụnyere kpamkpam na Gitlab CI na ngwaọrụ efu nke m na-eji na-ebuga ngwa na Kubernetes. Taa, m ga-emecha gwa gị ihe gbasara ha.

Isiokwu a ga-atụle ngwaọrụ ndị dị ka:
Hugo, qbec, kaniko, git-crypt и GitLab CI na okike nke gburugburu ebe obibi.

Ọdịnaya

  1. Zute Hugo
  2. Na-akwado Dockerfile
  3. Ịmata kaniko
  4. Ịmata qbec
  5. Na-agbalị Gitlab-ọsọ na Kubernetes-executor
  6. Na-ebunye chaatị Helm na qbec
  7. Na-ewebata git-crypt
  8. Ịmepụta onyonyo igbe ngwaọrụ
  9. Pipeline mbụ anyị na mgbakọ nke onyonyo site na mkpado
  10. Akpaaka nnyekwasa
  11. Artifacts na mgbakọ mgbe ị na-akwali ka nna ukwu
  12. gburugburu dị ike
  13. Nyochaa ngwa

1. Ịmata Hugo

Dịka ọmụmaatụ nke ọrụ anyị, anyị ga-agbalị ịmepụta saịtị mbipụta akwụkwọ nke e wuru na Hugo. Hugo bụ ihe na-emepụta ọdịnaya kwụ ọtọ.

Maka ndị na-amaghị nke ọma na ndị na-emepụta static, m ga-agwa gị ntakịrị banyere ha. N'adịghị ka engines webụsaịtị nwere nchekwa data na ụfọdụ PHP, nke, mgbe onye ọrụ rịọrọ ya, na-emepụta ibe na ofufe, a na-emepụta ndị na-emepụta ihe dị iche iche. Ha na-enye gị ohere iwere isi mmalite, na-abụkarị otu faịlụ dị na Markdown markup na ndebiri isiokwu, wee chịkọta ha na webụsaịtị emechachara.

Nke ahụ bụ, n'ihi ya, ị ga-enweta usoro ndekọ aha yana otu faịlụ HTML emepụtara, nke ị nwere ike bulite na nnabata ọ bụla dị ọnụ ala wee nweta ebe nrụọrụ weebụ na-arụ ọrụ.

Ị nwere ike iwunye Hugo na mpaghara wee nwalee ya:

Ịmalite saịtị ọhụrụ:

hugo new site docs.example.org

Ma n'otu oge ahụ git repository:

cd docs.example.org
git init

Ka ọ dị ugbu a, saịtị anyị dị ọcha ma ka ihe wee pụta na ya, anyị ga-ebu ụzọ jikọọ isiokwu; isiokwu bụ naanị ndebiri na iwu akọwapụtara nke sitere na saịtị anyị.

Maka isiokwu anyị ga-eji ịmụta, nke, n'echiche m, dabara nke ọma maka saịtị akwụkwọ.

Ọ ga-amasị m itinye uche pụrụ iche na eziokwu ahụ adịghị anyị mkpa ịchekwa faịlụ isiokwu na ebe nchekwa ọrụ anyị; kama, anyị nwere ike ijikọ ya naanị site na iji. git submodule:

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

Ya mere, ebe nchekwa anyị ga-enwe naanị faịlụ ndị metụtara ọrụ anyị kpọmkwem, isiokwu ahụ jikọtara ya ga-anọgide dị ka njikọ nke otu ebe nchekwa na ntinye n'ime ya, ya bụ, enwere ike ịdọrọ ya mgbe niile site na isi mmalite ma ghara ịtụ egwu. mgbanwe ekwekọghị.

Ka anyị dozie nhazi ahụ config.toml:

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

Ugbua na ọkwa a ị nwere ike ịgba ọsọ:

hugo server

Na na adreesị http://localhost:1313/ lelee webụsaịtị anyị emepụtara ọhụrụ, mgbanwe niile emere na ndekọ na-akpaghị aka melite ibe mepere emepe na ihe nchọgharị ahụ, dịkwa mma!

Ka anyị gbalịa ịmepụta ibe mkpuchi n'ime ọdịnaya/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

nseta ihuenyo nke ibe emepụtara ọhụrụ

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Iji mepụta saịtị, gbaa ọsọ:

hugo

Ndekọ ọdịnaya ọha/ ma ga-abụ weebụsaịtị gị.
Ee, n'agbanyeghị, ka anyị tinye ya ozugbo .gitigo:

echo /public > .gitignore

Echefula ime mgbanwe anyị:

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

2. Na-akwado Dockerfile

Ọ bụ oge ịkọwapụta nhazi nke ebe nchekwa anyị. M na-ejikarị ihe dị ka:

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

  • dockerfiles/ - nwere akwụkwọ ndekọ aha nwere Dockerfiles yana ihe niile dị mkpa maka iwulite onyonyo Docker anyị.
  • tinye/ - nwere akwụkwọ ndekọ aha maka ibuga ngwa anyị na Kubernetes

Yabụ, anyị ga-emepụta Dockerfile mbụ anyị n'okporo ụzọ dockerfiles/webụsaịtị/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" ]

Dị ka ị pụrụ ịhụ, Dockerfile nwere abụọ SITE, a na-akpọ ohere a multi-ogbo ewu ma na-enye gị ohere iwepụ ihe niile na-adịghị mkpa na foto docker ikpeazụ.
Ya mere, onyonyo ikpeazụ ga-enwe naanị ọchịchịrịhttpd (ihe nkesa HTTP dị arọ) na ọha/ - ọdịnaya nke webụsaịtị anyị emepụtara nke ọma.

Echefula ime mgbanwe anyị:

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

3. Ịmata kaniko

Dịka onye na-ewu ihe onyonyo docker, ekpebiri m iji kaniko, ebe ọ bụ na ọrụ ya adịghị achọ docker daemon, na-ewu n'onwe ya nwere ike ịrụ na igwe ọ bụla na cache nwere ike ịchekwa ozugbo na ndekọ, si otú ahụ na-ewepụ mkpa ọ dị inwe nchekwa na-adịgide adịgide zuru oke.

Iji wuo ihe onyonyo a, naanị were were gbaa akpa ahụ kaniko executor ma nyefee ya ọnọdụ ụlọ ugbu a; nke a nwekwara ike ime na mpaghara, site na 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

Ebee registry.gitlab.com/kvaps/docs.example.org/website - aha onyonyo docker gị; mgbe emechara ya, a ga-ewepụta ya na-akpaghị aka na ndekọ docker.

Ogologo --cache na-enye gị ohere ịchebe akwa akwa na ndekọ docker; maka ọmụmaatụ enyere, a ga-echekwa ha na registry.gitlab.com/kvaps/docs.example.org/website/cache, mana ị nwere ike ịkọwa ụzọ ọzọ site na iji paramita --cache-repo.

Nseta ihuenyo nke docker-registry

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

4. Ịmata qbec

Qbec bụ ngwa mbugharị nke na-enye gị ohere ịkọwapụta ngwa ngwa gị n'ụzọ doro anya wee bufee ya na Kubernetes. Iji Jsonnet dị ka syntax bụ isi na-enye gị ohere ime ka nkọwa dị iche iche dị mfe n'ofe gburugburu ebe dị iche iche, yana ọ fọrọ nke nta ka ọ kwụsị kpamkpam ikwughachi koodu.

Nke a nwere ike bụrụ eziokwu n'ọnọdụ ebe ịchọrọ ibuga ngwa n'ọtụtụ ụyọkọ nwere oke dị iche iche ma chọọ ịkọwapụta ha na Git.

Qbec na-enye gị ohere ịnye chaatị Helm site na ịfefe ha ihe ndị dị mkpa wee rụọ ọrụ n'otu ụzọ ahụ dị ka ihe ngosi mgbe niile, gụnyere ị nwere ike itinye mgbanwe dị iche iche na ha, nke a, n'aka nke ya, na-enye gị ohere iwepụ mkpa ọ dị. jiri ChartMuseum. Ya bụ, ị nwere ike chekwaa ma nyekwa eserese ozugbo site na git, ebe ha nwere.

Dị ka m kwuru na mbụ, anyị ga-echekwa ihe niile n'ime akwụkwọ ndekọ aha tinye/:

mkdir deploy
cd deploy

Ka anyị bido ngwa mbụ anyị:

qbec init website
cd website

Ugbu a usoro nke ngwa anyị dị ka nke a:

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

ka anyị lee faịlụ ahụ qbec.yaml:

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

Ebe a anyị bụ isi mmasị spec.gburugburu, qbec emebelarị anyị ọnọdụ ndabara wee were adreesị nkesa, yana oghere aha site na kubeconfig anyị ugbu a.
Ugbu a mgbe ebuga na ndabara gburugburu ebe obibi, qbec ga-ebuga naanị na ụyọkọ Kubernetes akọwapụtara yana na oghere aha akọwapụtara, ya bụ, ị gaghịzi agbanwe n'etiti ọnọdụ na oghere aha iji bugharịa.
Ọ bụrụ na ọ dị mkpa, ị nwere ike imelite ntọala dị na faịlụ a mgbe niile.

A kọwapụtara gburugburu gị niile na qbec.yaml, na faịlụ params.libsonnet, ebe ọ na-ekwu ebe a ga-enweta paramita maka ha.

Ọzọ anyị na-ahụ akwụkwọ ndekọ aha abụọ:

  • akụrụngwa/ - A ga-echekwa ihe ngosi niile maka ngwa anyị ebe a; enwere ike ịkọwa ha na jsonnet na faịlụ yaml oge niile
  • gburugburu/ - ebe a anyị ga-akọwa ihe niile variables (parameters) maka gburugburu anyị.

Site na ndabara anyị nwere faịlụ abụọ:

  • gburugburu/base.libsonnet - ọ ga-enwe paramita nkịtị maka gburugburu niile
  • gburugburu/default.libsonnet - nwere paramita ndị agbaghapụrụ maka gburugburu ebe obibi ndabara

ka anyị mepee gburugburu/base.libsonnet ma tinye parampat maka akụrụngwa mbụ anyị ebe ahụ:

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

Ka anyị mepụtakwa akụrụngwa nke mbụ anyị components/website.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

Na faịlụ a anyị kọwara ụlọ ọrụ Kubernetes atọ n'otu oge, ndị a bụ: Ịnye ọrụ, Service и Nje. Ọ bụrụ na anyị chọrọ, anyị nwere ike itinye ha n'ime akụkụ dị iche iche, ma n'oge a otu ga-ezuru anyị.

syntax jsonnet yiri json nkịtị, n'ụkpụrụ, regular json adịlarị jsonnet, yabụ na mbụ ọ nwere ike dịrị gị mfe iji ọrụ ịntanetị dị ka. yaml2json iji tọghata yaml gị ka ọ bụrụ json, ma ọ bụ, ọ bụrụ na akụrụngwa gị enweghị mgbanwe ọ bụla, mgbe ahụ enwere ike ịkọwa ya n'ụdị yaml oge niile.

Mgbe ị na -arụ ọrụ jsonnet Ana m akwado ịwụnye ngwa mgbakwunye maka onye ndezi gị

Dịka ọmụmaatụ, enwere ngwa mgbakwunye maka vim vim-jsonnet, nke na-agbanye akara syntax ma na-eme ya ozugbo jsonnet fmt oge ọ bụla ị na-echekwa (chọrọ ka etinyere jsonnet).

Ihe niile dị njikere, ugbu a anyị nwere ike ịmalite ibuga:

Ka anyị hụ ihe anyị nwetara, ka anyị gbaa ọsọ:

qbec show default

Na mmepụta, ị ga-ahụ ngosipụta yaml egosipụtara nke a ga-etinye na ụyọkọ ndabara.

Ọ dị mma, tinye ugbu a:

qbec apply default

Na mmepụta, ị ga-ahụ mgbe niile ihe a ga-eme na ụyọkọ gị, qbec ga-ajụ gị ka ị kwenye na mgbanwe ndị ahụ site na ịpị. y ị ga-enwe ike kwado ebumnobi gị.

Ngwa anyị adịla njikere ma ebuga ya!

Ọ bụrụ na ịmee mgbanwe, ị nwere ike ime:

qbec diff default

ka ịhụ ka mgbanwe ndị a ga-esi metụta ntinye nke ugbu a

Echefula ime mgbanwe anyị:

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

5. Na-agbalị Gitlab-ọsọ na Kubernetes-executor

Ruo n'oge na-adịbeghị anya, naanị m na-eji oge niile gitlab-ọsọ n'igwe akwadoro akwadoro (akpa LXC) nwere shei ma ọ bụ docker-executor. Na mbido, anyị nwere ọtụtụ ndị ọgba ọsọ akọwapụtara n'ụwa niile na gitlab anyị. Ha chịkọtara onyonyo docker maka ọrụ niile.

Ma dị ka omume gosipụtara, nhọrọ a abụghị nke kachasị mma, ma n'ihe gbasara uru na nchekwa. Ọ ka mma na echiche ziri ezi ka ewepụta ndị ọgba ọsọ dị iche iche maka ọrụ ọ bụla, ma ọ bụ ọbụna maka gburugburu ebe ọ bụla.

Ọ dabara nke ọma, nke a abụghị nsogbu ma ọlị, ebe ọ bụ na ugbu a anyị ga-ebuga gitlab-ọsọ ozugbo dị ka akụkụ nke ọrụ anyị na Kubernetes.

Gitlab na-enye eserese hel dị njikere maka ibuga gitlab-ọsọ na Kubernetes. Yabụ na ihe ị ga - eme bụ ịchọpụta ndebanye aha maka oru ngo anyi in Ntọala -> CI / CD -> Ndị na-agba ọsọ ma nyefee ya n'isi:

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

Ebee:

  • https://gitlab.com - adreesị nke sava Gitlab gị.
  • yga8y-jdCusVDn_t4Wxc - ndebanye aha maka ọrụ gị.
  • rbac.create=ezi - na-enye onye na-agba ọsọ ohere dị mkpa iji nwee ike ịmepụta pods iji rụọ ọrụ anyị site na iji kubernetes-executor.

Ọ bụrụ na emechara ihe niile nke ọma, ị ga-ahụ onye na-agba ọsọ edebanyere aha na ngalaba Ndị na-agba ọsọ, na ntọala oru ngo gị.

Nseta ihuenyo nke onye na-agba ọsọ agbakwunyere

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Ọ dị mfe otú ahụ? - ee, ọ dị mfe! Enweghị nsogbu ọzọ na ịdebanye aha ndị ọgba ọsọ aka, site ugbu a gaa n'ihu, a ga-emepụta ndị na-agba ọsọ ma bibie ya ozugbo.

6. Tinye chaatị Helm na QBEC

Ebe ọ bụ na anyị kpebiri ịtụle gitlab-ọsọ akụkụ nke ọrụ anyị, oge eruola ịkọwa ya na ebe nchekwa Git anyị.

Anyị nwere ike ịkọwa ya dị ka akụkụ dị iche iche website, ma n'ọdịnihu anyị na-eme atụmatụ ibuga mbipụta dị iche iche website ọtụtụ mgbe, n'adịghị ka gitlab-ọsọ, nke a ga-ebuga naanị otu ugboro kwa ụyọkọ Kubernetes. Yabụ ka anyị bido ngwa dị iche maka ya:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

Oge a anyị agaghị eji aka kọwaa ụlọ ọrụ Kubernetes, mana anyị ga-ewere chaatị Helm emebere. Otu n'ime uru qbec bụ ikike ịmegharị chaatị Helm ozugbo site na ebe nchekwa Git.

Ka anyị jiri git submodule jikọọ ya:

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

Ugbu a ndekọ onye na-ere ere/gitlab-ọsọ Anyị nwere ebe nchekwa nwere eserese maka gitlab-ọsọ.

N'otu aka ahụ, ị ​​nwere ike jikọọ ebe nchekwa ndị ọzọ, dịka ọmụmaatụ, ebe nchekwa niile nwere chaatị ndị ọrụ https://github.com/helm/charts

Ka anyị kọwaa akụkụ ahụ components/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

Arụmụka mbụ ka gbasaaHelmTemplate anyị na-agafe ụzọ na chaatị ahụ, mgbe ahụ params.uru, nke anyị na-ewere site na paramita gburugburu ebe obibi, wee bịa ihe ahụ

  • aha Template - aha ntọhapụ
  • aha - aha oghere agafere na helm
  • faịlụ a - oke achọrọ nke na-agafe ụzọ faịlụ dị ugbu a
  • ngwaa - na-egosi iwu template helm na arụmụka niile mgbe ị na-enye eserese ahụ

Ugbu a, ka anyị kọwaa paramita maka akụrụngwa anyị gburugburu/base.libsonnet:

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

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

Lezienụ anya runnerRegistrationToken anyị na-ewere site na faịlụ mpụga nzuzo/base.libsonnet, ka anyị mepụta ya:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

Ka anyị lelee ma ihe niile na-arụ ọrụ:

qbec show default

Ọ bụrụ na ihe niile dị n'usoro, mgbe ahụ anyị nwere ike ihichapụ ntọhapụ anyị ebugara na mbụ site na Helm:

helm uninstall gitlab-runner

ma tinye ya n'otu ụzọ ahụ, mana site na qbec:

qbec apply default

7. Ewebata git-crypt

Git-crypt bụ ngwá ọrụ na-enye gị ohere ịmepụta nzuzo nzuzo maka ebe nchekwa gị.

N'oge a, usoro ndekọ aha anyị maka gitlab-runner dị ka nke a:

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

Mana ịchekwa ihe nzuzo na Git adịghị mma, ọ bụ ya? Yabụ na anyị kwesịrị izobe ha nke ọma.

Ọtụtụ mgbe, n'ihi otu mgbanwe, nke a anaghị eme mgbe niile. Ị nwere ike ịnyefe ihe nzuzo na qbec yana site na mgbanwe gburugburu ebe obibi nke usoro CI gị.
Mana ọ dị mma ịmara na enwerekwa ọrụ dị mgbagwoju anya nke nwere ike ịnwe ọtụtụ ihe nzuzo ndị ọzọ; ibufe ha niile site na mgbanwe gburugburu ebe obibi ga-esi ezigbo ike.

Ọzọkwa, na nke a, agaghị m enwe ike ịgwa gị banyere ngwá ọrụ dị ebube dị ka git-crypt.

git-crypt Ọ dịkwa mma n'ihi na ọ na-enye gị ohere ịchekwa akụkọ ihe mere eme nke nzuzo niile, yana atụnyere, jikọta na dozie esemokwu n'otu ụzọ ahụ anyị si eme n'ihe banyere Git.

Ihe mbụ mgbe echichi git-crypt anyị kwesịrị ịmepụta igodo maka ebe nchekwa anyị:

git crypt init

Ọ bụrụ na ị nwere igodo PGP, ị nwere ike tinye onwe gị ozugbo ka onye na-arụkọ ọrụ maka ọrụ a:

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

Otu a ị nwere ike iji igodo nzuzo gị decrypto ebe nchekwa a mgbe niile.

Ọ bụrụ na ịnweghị igodo PGP ma atụghị anya ya, ị nwere ike ịga n'ụzọ ọzọ wee bupụ igodo ọrụ ahụ:

git crypt export-key /path/to/keyfile

Ya mere, onye ọ bụla nwere mbupụ igodo faịlụ ga-enwe ike decrypt gị ebe nchekwa.

Oge erugo ịtọlite ​​ihe nzuzo mbụ anyị.
Ka m chetara gị na anyị ka nọ na ndekọ aha tinye / gitlab-ọsọ /, ebe anyị nwere ndekọ nzuzo/, ka anyị zoo faịlụ niile dị na ya, maka nke a anyị ga-emepụta faịlụ nzuzo / .gitattributes ya na ọdịnaya ndị a:

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

Dị ka a na-ahụ site na ọdịnaya, faịlụ niile na-ekpuchi * a ga-ebufe ya git-crypt, ma e wezụga nke kacha .gitattributes

Anyị nwere ike ịlele nke a site na ịgba ọsọ:

git crypt status -e

Mpụta ga-abụ ndepụta faịlụ niile dị na ebe nchekwa nke enyere ezoro ezo

Nke ahụ bụ naanị, ugbu a anyị nwere ike ịme mgbanwe anyị n'enweghị nsogbu:

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

Iji gbochie ebe nchekwa, dị nnọọ ọsọ:

git crypt lock

na ozugbo faịlụ niile ezoro ezo ga-aghọ ọnụọgụ abụọ, ọ gaghị ekwe omume ịgụ ha.
Iji mebie ebe nchekwa ahụ, gbaa ọsọ:

git crypt unlock

8. Mepụta ihe oyiyi igbe ngwaọrụ

Onyonyo igbe ngwaọrụ bụ onyonyo nwere ngwa niile anyị ga-eji wepụta ọrụ anyị. Onye na-agba ọsọ Gitlab ga-eji ya rụọ ọrụ mbugharị ahụkarị.

Ihe niile dị mfe ebe a, ka anyị mepụta nke ọhụrụ dockerfiles/igbe ngwaọrụ/Dockerfile ya na ọdịnaya ndị a:

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

Dịka ị na-ahụ, n'onyinyo a anyị wụnye ngwa ngwa niile anyị ji ebubata ngwa anyị. Anyị achọghị ya ebe a belụsọ kubectl, ma ị nwere ike ịchọrọ iji ya gwuo egwu n'oge nhazi pipeline.

Ọzọkwa, ka anyị na Kubernetes nwee ike ịkparịta ụka na ibuga ya, anyị kwesịrị ịhazi ọrụ maka pọd nke gitlab-runner mepụtara.

Iji mee nke a, ka anyị gaa na ndekọ na gitlab-runner:

cd deploy/gitlab-runner

ma tinye ihe ọhụrụ components/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

Anyị ga-akọwakwa paramita ọhụrụ n'ime gburugburu/base.libsonnet, nke dị ugbu a dị ka nke a:

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

Lezienụ anya $.components.rbac.aha na-ezo aka aha maka akụrụngwa rbac

Ka anyị lelee ihe gbanwere:

qbec diff default

ma tinye mgbanwe anyị na Kubernetes:

qbec apply default

Ọzọkwa, echefula ime mgbanwe anyị na 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. pipeline mbụ anyị na mgbakọ nke ihe oyiyi site na mkpado

Na mgbọrọgwụ nke ọrụ ahụ anyị ga-emepụta .gitlab-ci.yml ya na ọdịnaya ndị a:

.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

Biko mara na anyị na-eji GIT_SUBMODULE_STRATEGY: nkịtị maka ọrụ ndị ahụ ebe ịkwesịrị ịmalite ịmalite submodules n'ụzọ doro anya tupu e gbuo ya.

Echefula ime mgbanwe anyị:

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

Echere m na anyị nwere ike ịkpọ nke a ụdị v0.0.1 ma tinye mkpado:

git tag v0.0.1

Anyị ga-agbakwunye mkpado mgbe ọ bụla anyị kwesịrị ịhapụ ụdị ọhụrụ. A ga-ejikọta mkpado dị na onyonyo Docker na mkpado Git. Ntugharị ọ bụla nwere mkpado ọhụrụ ga-eji mkpado a malite nrụpụta onyonyo.

Ka anyị mee ya git push --tags, ka anyị leba anya na pipeline nke mbụ anyị:

Nseta ihuenyo nke pipeline mbụ

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Ọ bara uru ịdọrọ uche gị n'eziokwu na mgbakọ site na mkpado dabara adaba maka iwuli ihe onyonyo docker, mana ọ dabaraghị maka ibuga ngwa na Kubernetes. Ebe ọ bụ na enwere ike kenye mkpado ọhụrụ maka ihe ochie, na nke a, ịmalite pipeline maka ha ga-eduga na ntinye nke ụdị ochie.

Iji dozie nsogbu a, a na-ejikọkarị ihe owuwu docker na mkpado, yana ibuga ngwa ahụ na ngalaba. nwe-, nke ụdị ihe onyonyo a na-anakọta bụ hardcode. Nke a bụ ebe ị nwere ike ibido nlọghachi azụ site na iji ntụgharị dị mfe nwe-- alaka.

10. Akpaaka nke ntinye

Ka Gitlab-ọsọ wee mebie ihe nzuzo anyị, anyị ga-ebupụ igodo nchekwa ma tinye ya na mgbanwe gburugburu CI anyị:

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

Anyị ga-echekwa ahịrị ga-apụta na Gitlab; iji mee nke a, ka anyị gaa na ntọala ọrụ anyị:
Ntọala -> CI / CD -> mgbanwe

Ka anyị mepụta mgbanwe ọhụrụ:

ụdị
Key
uru
Chebe
Masked
akporo

File
GITCRYPT_KEY
<your string>
true (n'oge ọzụzụ ị nwere ike false)
true
All environments

nseta ihuenyo nke mgbanwe agbakwunyere

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Ugbu a, ka emelite nke anyị .gitlab-ci.yml na-agbakwunye ya:

.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

N'ebe a, anyị enyerela ọtụtụ nhọrọ ọhụrụ maka qbec:

  • --mgbọrọgwụ ụfọdụ/ngwa - na-enye gị ohere ikpebi ndekọ nke otu ngwa
  • --ike:k8s-okwu __incluster__ - nke a bụ mgbanwe anwansi nke na-ekwu na ntinye ga-eme na otu ụyọkọ nke gtilab-ọsọ na-agba ọsọ. Nke a dị mkpa n'ihi na ma ọ bụghị qbec ga-anwa ịchọta sava Kubernetes kwesịrị ekwesị na kubeconfig gị
  • --echere - na-amanye qbec ka ọ chere ruo mgbe akụrụngwa ọ na-emepụta ga-abanye na steeti njikere wee jiri koodu ọpụpụ na-aga nke ọma pụọ.
  • — ee - naanị gbanyụọ shei mmekọrịta O doro gị anya? mgbe etinyere ya.

Echefula ime mgbanwe anyị:

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

Na mgbe gbaa ọsọ anyị ga-ahụ ka esi etinye ngwa anyị:

Nseta ihuenyo nke pipeline nke abụọ

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

11. Artifacts na mgbakọ mgbe ị na-akwagharị ka nna ukwu

Dịka, usoro ndị a kọwara n'elu zuru ezu iji wuo ma nyefee ihe fọrọ nke nta ka ọ bụrụ microservice ọ bụla, mana anyị achọghị itinye mkpado oge ọ bụla anyị chọrọ imelite saịtị ahụ. Ya mere, anyị ga-aga n'ụzọ dị ike karị ma guzobe ntinye ngwa ngwa na alaka ụlọ ọrụ.

Echiche dị mfe: ugbu a oyiyi nke anyị website a ga-ewughachi mgbe ọ bụla ị na-agbanye n'ime nwe-, wee bugharịa na Kubernetes na-akpaghị aka.

Ka anyị kwalite ọrụ abụọ a na nke anyị .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"

Biko mara na anyị atụkwasịla eri nwe- к zaghachi maka ọrụ build_website na anyị na-eji ugbu a $CI_COMMIT_REF_NAME kama nke $CI_COMMIT_TAG, ya bụ, a tọhapụrụ anyị site na mkpado na Git ma ugbu a, anyị ga-atụgharị ihe oyiyi na aha ngalaba ntinye nke malitere pipeline. Ọ dị mma ịmara na nke a ga-arụkwa ọrụ na mkpado, nke ga-enye anyị ohere ịchekwa foto nke saịtị nwere ụdị dị na docker-registry.

Mgbe aha mkpado docker maka ụdị saịtị ọhụrụ ahụ enweghị ike ịgbanwe, anyị ka ga-akọwa mgbanwe ndị ahụ na Kubernetes, ma ọ bụghị ya, ọ gaghị emegharị ngwa ahụ site na onyonyo ọhụrụ, ebe ọ bụ na ọ gaghị achọpụta mgbanwe ọ bụla na ntinye. gosi.

Nhọrọ —vm:ext-str digest=”$ DIGEST” maka qbec - na-enye gị ohere ịnyefe mgbanwe mpụga na jsonnet. Anyị chọrọ ka ewegharịa ya na ụyọkọ na mwepụta ọ bụla nke ngwa anyị. Anyị enweghị ike iji aha mkpado ahụ, nke nwere ike ugbu a enweghị ike ịgbanwe, ebe ọ bụ na ọ dị anyị mkpa ijikọ na ụdị onyonyo a kapịrị ọnụ wee kpalite ntinye mgbe ọ gbanwere.

N'ebe a, ikike Kaniko ga-enyere anyị aka ịchekwa onyonyo mgbari na faịlụ (nhọrọ --dijist-faịlụ)
Mgbe ahụ, anyị ga-ebufe faịlụ a ma gụọ ya n'oge ebuga ya.

Ka anyị melite parameters maka anyị deploy/website/environments/base.libsonnet nke ga-adị ugbu a dị ka nke a:

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

Emechaala, ugbu a tinye aka ọ bụla nwe- na-ebido wuo onyonyo docker maka website, wee bunye ya na Kubernetes.

Echefula ime mgbanwe anyị:

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

Anyị ga-elele ya ma emechaa gbaa ọsọ anyị kwesịrị ịhụ ihe dị ka nke a:

Nseta ihuenyo nke pipeline maka nna ukwu

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

N'ụkpụrụ, ọ dịghị mkpa ka anyị degharịa gitlab-agba ọsọ na ntanye ọ bụla, ọ gwụla ma, n'ezie, ọ dịghị ihe gbanwere na nhazi ya, ka anyị dozie ya. .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/**/*

mgbanwe ga-enye gị ohere inyocha mgbanwe na tinye / gitlab-ọsọ / na ọ ga-akpalite ọrụ anyị naanị ma ọ bụrụ na ọ dị

Echefula ime mgbanwe anyị:

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

gbaa ọsọ, nke ka mma:

nseta ihuenyo nke pipeline emelitere

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

12. gburugburu gburugburu

Oge erugo iji gbanwee pipeline anyị na gburugburu dị ike.

Mbụ, ka anyị melite ọrụ build_website n'ime anyị .gitlab-ci.yml, wepụ ihe mgbochi ahụ na ya naanị, nke ga-amanye Gitlab ịkpalite ya na ntinye aka ọ bụla na alaka ọ bụla:

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/

Mgbe ahụ melite ọrụ ahụ webụsaịtị deploy, tinye ngọngọ ebe ahụ gburugburu ebe obibi:

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"

Nke a ga-enye Gitlab ohere ijikọ ọrụ ahụ eb gburugburu ebe obibi ma gosipụta njikọ ziri ezi na ya.

Ugbu a, ka anyị gbakwunye ọrụ abụọ ọzọ:

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

A ga-ewepụta ha n'ịkwanye alaka ọ bụla ma e wezụga nna ukwu ma wepụta ụdị nlele nke saịtị ahụ.

Anyị na-ahụ nhọrọ ọhụrụ maka qbec: --app mkpado - ọ na-enye gị ohere ịkpado ụdị ngwa ahụ etinyere ma rụọ ọrụ naanị n'ime mkpado a; mgbe ị na-eke ma na-emebi akụrụngwa na Kubernetes, qbec ga-eji ha rụọ ọrụ naanị.
N'ụzọ dị otú a, anyị enweghị ike ịmepụta ebe dị iche iche maka nyocha ọ bụla, mana naanị iji otu ihe ahụ.

Ebe a anyị na-ejikwa qbec tinye nyocha, kama qbec tinye ndabara - Nke a bụ oge anyị ga-agbalị ịkọwapụta ọdịiche maka gburugburu anyị (nyocha na ndabara):

Ka anyị tinye review gburugburu ebe obibi deploy/webụsaịtị/qbec.yaml

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

Mgbe ahụ, anyị ga-ekwupụta ya na deploy/webụsaịtị/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

Ma dee paramita omenala maka ya n'ime 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',
    },
  },
}

Ka anyị lebakwuo anya na jobu stop_review, a ga-akpalite ya mgbe ehichapụ alaka ahụ ka gitlab ghara ịnwa ịlele ya, a na-eji ya. GIT_STRATEGY: onweghị, emesia anyị clone nwe--alaka ma hichapụ nyochaa site na ya.
Ọ dị ntakịrị mgbagwoju anya, mana ahụbeghị m ụzọ mara mma karịa.
Nhọrọ ọzọ ga-abụ ibugharị nyocha ọ bụla na oghere aha ụlọ oriri na ọṅụṅụ, nke enwere ike ịkwatu kpamkpam.

Echefula ime mgbanwe anyị:

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

gbaa ọsọ, git checkout -b ule, git push isi ule, lelee:

nseta ihuenyo nke gburugburu emepụtara na Gitlab

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Ihe niile na-arụ ọrụ? - Ọ dị mma, hichapụ ngalaba nnwale anyị: nna ukwu ndenye ego, git push origin:ule, anyị na-enyocha na ọrụ mkpochapụ gburugburu ebe obibi na-arụ ọrụ na-enweghị njehie.

N'ebe a, m ga-achọ ịkọwa ozugbo na onye ọ bụla na-emepụta ihe na ọrụ nwere ike ịmepụta alaka, ọ nwekwara ike ịgbanwe .gitlab-ci.yml faịlụ na ịnweta mgbanwe nzuzo.
Ya mere, a na-atụ aro ike ikwe ka ojiji ha naanị maka alaka ndị echekwara, dịka ọmụmaatụ na nwe-, ma ọ bụ mepụta ụdị mgbanwe dị iche iche maka gburugburu ọ bụla.

13. Nyochaa ngwa

Nyochaa ngwa Nke a bụ njirimara GitLab nke na-enye gị ohere itinye bọtịnụ maka faịlụ ọ bụla na ebe nchekwa iji lelee ya ngwa ngwa na gburugburu ebe ebugara.

Ka bọtịnụ ndị a pụta, ịkwesịrị ịmepụta faịlụ .gitlab/ụzọ-map.yml ma kọwaa mgbanwe ụzọ niile n'ime ya; n'ọnọdụ anyị ọ ga-adị nnọọ mfe:

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

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

Echefula ime mgbanwe anyị:

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

gbaa ọsọ, wee lelee:

Nseta ihuenyo nke bọtịnụ Ngwa Nyochaa

Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

Emeela ọrụ!

Isi mmalite ọrụ:

Daalụ maka nlebara anya gị, enwere m olileanya na ọ masịrị gị Na-anwale ngwaọrụ ọhụrụ maka iwulite na nhazi ọkwa na Kubernetes

isi: www.habr.com

Tinye a comment