Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Салом! Ба наздикӣ, бисёр абзорҳои олитарини автоматизатсия ҳам барои сохтани тасвирҳои Docker ва ҳам барои ҷойгиркунӣ дар Kubernetes бароварда шуданд. Дар робита ба ин, ман қарор додам, ки бо GitLab бозӣ кунам, қобилиятҳои онро бодиққат омӯзам ва, албатта, қубурро насб кунам.

Ин кор аз вебсайт илҳом гирифта шудааст kubernetes.io, ки аз он тавлид мешавад рамзҳои манбаъ ба таври худкор ва барои ҳар як дархости ҳавзи ирсолшуда, робот ба таври худкор версияи пешнамоиши сайтро бо тағиротҳои шумо тавлид мекунад ва истинодро барои тамошо таъмин мекунад.

Ман кӯшиш кардам, ки як раванди шабеҳро аз сифр созам, аммо комилан дар Gitlab CI ва абзорҳои ройгон, ки ман барои ҷойгиркунии барномаҳо дар Kubernetes истифода мебурдам, сохта шудаам. Имрӯз ман ниҳоят ба шумо дар бораи онҳо бештар нақл мекунам.

Дар мақола воситаҳо ба монанди:
Уго, qbec, канико, git-crypt и GitLab CI бо эҷоди муҳити динамикӣ.

Мундариҷа

  1. Бо Ҳуго вохӯред
  2. Омода кардани файли Docker
  3. Шиносоии канико
  4. Шинос шудан бо qbec
  5. Озмоиши Gitlab-давон бо Кубернетес-иҷрокунанда
  6. Ҷойгир кардани диаграммаҳои Helm бо qbec
  7. Муаррифии git-crypt
  8. Эҷоди тасвири қуттии асбобҳо
  9. Аввалин лӯлаи мо ва васлкунии тасвирҳо аз рӯи тегҳо
  10. Автоматикунонии ҷойгиркунӣ
  11. Артефактҳо ва васлкунӣ ҳангоми тела ба усто
  12. Муҳити динамикӣ
  13. Баррасии барномаҳо

1. Шинос шудан бо Гюго

Ҳамчун намунаи лоиҳаи мо, мо кӯшиш хоҳем кард, ки сайти нашри ҳуҷҷатҳо дар Hugo сохта шавад. Ҳуго як тавлидкунандаи мундариҷаи статикӣ мебошад.

Барои онҳое, ки бо генераторҳои статикӣ шинос нестанд, ман ба шумо дар бораи онҳо каме бештар мегӯям. Баръакси муҳаррикҳои маъмулии вебсайт бо пойгоҳи додаҳо ва баъзе PHP, ки ҳангоми дархости корбар саҳифаҳоро зуд тавлид мекунанд, генераторҳои статикӣ каме ба таври дигар тарҳрезӣ шудаанд. Онҳо ба шумо имкон медиҳанд, ки манбаъҳо, одатан маҷмӯи файлҳо дар Markdown ва қолибҳои мавзӯъро гиред ва сипас онҳоро ба вебсайти комилан тайёр тартиб диҳед.

Яъне, дар натиҷа, шумо сохтори директория ва маҷмӯи файлҳои HTML-и тавлидшударо мегиред, ки шумо метавонед онҳоро ба ҳама гуна хостинги арзон бор кунед ва вебсайти корӣ гиред.

Шумо метавонед Hugo-ро ба таври маҳаллӣ насб кунед ва онро санҷед:

Оғози сайти нав:

hugo new site docs.example.org

Ва дар айни замон анбори git:

cd docs.example.org
git init

То ба ҳол, сайти мо тоза аст ва барои он ки чизе дар он пайдо шавад, мо аввал бояд мавзӯъро пайваст кунем; мавзӯъ ин танҳо маҷмӯи қолибҳо ва қоидаҳои муайяншуда мебошад, ки мувофиқи он сайти мо тавлид мешавад.

Барои мавзӯъ мо истифода хоҳем кард омӯхтан, ки ба назари ман, барои сайти ҳуҷҷатгузорӣ комилан мувофиқ аст.

Ман мехоҳам ба он диққати махсус диҳам, ки ба мо лозим нест, ки файлҳои мавзӯъро дар анбори лоиҳаи худ захира кунем; ба ҷои ин, мо метавонем онро бо истифода аз пайвастшавӣ пайваст кунем. зермодули git:

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

Ҳамин тариқ, анбори мо танҳо файлҳои мустақими ба лоиҳаи мо алоқамандро дар бар хоҳад гирифт ва мавзӯи пайвастшуда ҳамчун пайванд ба анбори мушаххас ва ӯҳдадорӣ дар он боқӣ мемонад, яъне онро ҳамеша аз манбаи аслӣ кашидан мумкин аст ва аз он наметарсад. тағйироти номувофиқ.

Биёед конфигуратсияро ислоҳ кунем config.toml:

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

Аллакай дар ин марҳила шумо метавонед иҷро кунед:

hugo server

Ва дар адреси http://localhost:1313/ вебсайти навтаъсиси моро санҷед, ҳама тағиротҳои дар феҳрист воридшуда ба таври худкор саҳифаи кушодаи браузерро навсозӣ мекунанд, хеле қулай!

Биёед кӯшиш кунем, ки саҳифаи муқоваро дар content/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

Скриншоти саҳифаи навтаъсис

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Барои эҷоди сайт, танҳо иҷро кунед:

hugo

Мундариҷаи директория ҷамъиятӣ/ ва вебсайти шумо хоҳад буд.
Бале, дар омади гап, фавран ба он илова мекунем .гитинор:

echo /public > .gitignore

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

2. Омода кардани файли Docker

Вакти муайян кардани сохтори анбори мо расидааст. Ман одатан чизеро истифода мебарам:

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

  • файлҳои докер/ — дорои феҳристҳо бо Dockerfiles ва ҳама чизҳое, ки барои сохтани тасвирҳои Docker мо заруранд.
  • ҷойгир кардан/ — дорои феҳристҳо барои ҷойгиркунии замимаҳои мо ба Kubernetes

Ҳамин тариқ, мо аввалин файли Docker-и худро дар роҳ эҷод мекунем 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 дорои ду Аз ФР, ин имконият номида мешавад сохтмони бисёрсоҳавӣ ва ба шумо имкон медиҳад, ки ҳама чизи нолозимро аз тасвири ниҳоии Docker хориҷ кунед.
Ҳамин тариқ, тасвири ниҳоӣ танҳо дар бар мегирад торикhttpd (сервери сабуки HTTP) ва ҷамъиятӣ/ — мундариҷаи вебсайти статикии мо.

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

3. Шинос шудан бо канико

Ҳамчун як созандаи тасвири докер, ман қарор додам, ки истифода барам канико, зеро кори он демони докерро талаб намекунад ва худи сохтмонро метавон дар ҳама гуна мошин анҷом дод ва кэшро мустақиман дар реестр нигоҳ доштан мумкин аст ва ба ин васила зарурати доштани нигаҳдории доимии мукаммалро аз байн мебарад.

Барои сохтани тасвир, танҳо контейнерро бо он иҷро кунед иҷрокунандаи канико ва онро контексти сохти кунунӣ гузаронед; ин метавонад ба таври маҳаллӣ тавассути docker анҷом дода шавад:

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

Дар куҷо registry.gitlab.com/kvaps/docs.example.org/website — номи тасвири докери шумо; пас аз сохтан, он ба таври худкор дар феҳристи докерҳо оғоз мешавад.

Параметр --кеш ба шумо имкон медиҳад, ки қабатҳоро дар реестри докер кэш кунед; барои мисоли овардашуда, онҳо дар захира карда мешаванд registry.gitlab.com/kvaps/docs.example.org/website/cache, аммо шумо метавонед бо истифода аз параметр роҳи дигарро муайян кунед --cache-repo.

Скриншоти docker-registry

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

4. Шинос шудан бо qbec

Qbec воситаи ҷойгиркунӣ мебошад, ки ба шумо имкон медиҳад, ки манифестҳои аризаи худро ба таври декларатсия тавсиф кунед ва онҳоро дар Kubernetes ҷойгир кунед. Истифодаи Jsonnet ҳамчун синтаксиси асосӣ ба шумо имкон медиҳад, ки тавсифи фарқиятҳоро дар муҳитҳои гуногун хеле содда гардонед ва инчунин такрори кодро тақрибан пурра аз байн мебарад.

Ин метавонад махсусан дар ҳолатҳое дуруст бошад, ки ба шумо лозим аст, ки барномаро дар якчанд кластерҳо бо параметрҳои гуногун ҷойгир кунед ва мехоҳед онҳоро дар Git ба таври декларатсия тавсиф кунед.

Qbec инчунин ба шумо имкон медиҳад, ки диаграммаҳои Ҳелмро тавассути додани параметрҳои зарурӣ нишон диҳед ва сипас онҳоро ба ҳамон тарзе, ки манифестҳои муқаррарӣ доранд, кор кунед, аз ҷумла шумо метавонед ба онҳо мутатсияҳои гуногунро татбиқ кунед ва ин, дар навбати худ, ба шумо имкон медиҳад, ки аз зарурати ChartMuseum-ро истифода баред. Яъне, шумо метавонед диаграммаҳоро мустақиман аз git, ки ба он ҷо тааллуқ доранд, нигоҳ доред ва пешниҳод кунед.

Тавре ки ман қаблан гуфтам, мо ҳама ҷойгиркуниро дар директория нигоҳ медорем ҷойгир кардан/:

mkdir deploy
cd deploy

Биёед барномаи аввалини худро оғоз кунем:

qbec init website
cd website

Акнун сохтори замимаи мо чунин менамояд:

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

биёед файлро бубинем qbec.yaml:

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

Дар ин ҷо мо пеш аз ҳама ба он таваҷҷӯҳ дорем мушаххас.муҳитҳо, qbec аллакай барои мо муҳити пешфарз эҷод кардааст ва суроғаи сервер ва инчунин фазои номро аз kubeconfig ҷории мо гирифтааст.
Ҳоло ҳангоми ҷойгиркунӣ ба Пешфарз Муҳити зист, qbec ҳамеша танҳо ба кластери муайяншудаи Kubernetes ва ба фазои номҳои мушаххас ҷойгир карда мешавад, яъне барои иҷрои ҷойгиркунӣ дигар ба шумо лозим нест, ки байни контекстҳо ва фазои номҳо гузаред.
Агар лозим бошад, шумо метавонед ҳамеша танзимоти ин файлро навсозӣ кунед.

Ҳамаи муҳитҳои шумо дар тавсиф карда шудаанд qbec.yaml, ва дар файл params.libsonnet, ки дар он гуфта мешавад, ки параметрҳоро барои онҳо аз куҷо гирифтан мумкин аст.

Баъдан мо ду директорияро мебинем:

  • ҷузъҳо/ — ҳама манифестҳои барномаи мо дар ин ҷо нигоҳ дошта мешаванд; онҳоро ҳам дар файлҳои jsonnet ва ҳам дар файлҳои муқаррарии yaml тавсиф кардан мумкин аст
  • муҳитҳо/ - дар ин ҷо мо ҳама тағирёбандаҳоро (параметрҳоро) барои муҳити худ тавсиф хоҳем кард.

Бо нобаёнӣ мо ду файл дорем:

  • environments/base.libsonnet - он параметрҳои умумиро барои ҳама муҳитҳо дар бар мегирад
  • environments/default.libsonnet — дорои параметрҳое, ки барои муҳити атроф бекор карда шудаанд Пешфарз

кушоем environments/base.libsonnet ва параметрҳоро барои ҷузъи якуми мо дар он ҷо илова кунед:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

Биёед ҷузъи аввалини худро низ созем компонентҳо/website.jsonnet:

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

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

Дар ин файл мо якбора се объекти Kubernetes-ро тавсиф кардем, инҳоянд: љойгиркунии, хизматрасонӣ и Ingress. Агар мо мехостем, онҳоро ба ҷузъҳои гуногун гузошта метавонистем, аммо дар ин марҳила барои мо як нафар кофӣ хоҳад буд.

наҳвӣ jsonnet ба json муқаррарӣ хеле монанд аст, аслан, json муқаррарӣ аллакай jsonnet эътибор дорад, бинобар ин дар аввал истифода бурдани хидматҳои онлайн барои шумо осонтар мешавад, ба монанди yaml2json барои табдил додани yaml муқаррарии худро ба json, ё, агар ҷузъҳои шумо ягон тағирёбанда надошта бошанд, пас онҳоро метавон дар шакли yaml муқаррарӣ тавсиф кард.

Ҳангоми кор бо jsonnet Ман тавсия медиҳам, ки плагинро барои муҳаррири худ насб кунед

Масалан, як плагин барои vim мавҷуд аст vim-jsonnet, ки равшансозии синтаксисро фаъол мекунад ва ба таври худкор иҷро мешавад jsonnet fmt ҳар дафъае, ки шумо захира мекунед (барои jsonnet насбшударо талаб мекунад).

Ҳама чиз омода аст, ҳоло мо метавонем ба ҷойгиркунӣ шурӯъ кунем:

Барои дидани он чизе ки мо дорем, биёед давем:

qbec show default

Дар баромад шумо манифестҳои yaml-ро мебинед, ки ба кластери пешфарз татбиқ карда мешаванд.

Аҷоиб, ҳоло муроҷиат кунед:

qbec apply default

Дар баромад шумо ҳамеша мебинед, ки дар кластери шумо чӣ кор карда мешавад, qbec аз шумо хоҳиш мекунад, ки бо навиштан ба тағиротҳо розӣ шавед y шумо метавонед ниятҳои худро тасдиқ кунед.

Замимаи мо омода ва ҷойгир карда шудааст!

Агар шумо тағирот ворид кунед, шумо ҳамеша метавонед иҷро кунед:

qbec diff default

то бубинед, ки ин тағиротҳо ба ҷойгиркунии ҷорӣ чӣ гуна таъсир мерасонанд

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

5. Кӯшиши Gitlab-давон бо Kubernetes-иҷрокунанда

То ба наздикӣ ман танҳо мунтазам истифода мебурдам gitlab-давон дар мошини қаблан омодашуда (контейнери LXC) бо ниҳонӣ ё докер-иҷрокунанда. Дар аввал, мо якчанд чунин давандагонро дар саросари ҷаҳон дар gitlab-и мо муайян кардем. Онҳо барои ҳама лоиҳаҳо тасвирҳои докер ҷамъ оварданд.

Аммо тавре ки амалия нишон дод, ин вариант ҳам аз ҷиҳати амалӣ ва ҳам бехатарӣ беҳтарин нест. Барои ҳар як лоиҳа ё ҳатто барои ҳар як муҳит ҷойгир кардани давандагони алоҳида беҳтар ва аз ҷиҳати идеологӣ дурусттар аст.

Хушбахтона, ин умуман мушкил нест, зеро ҳоло мо ҷойгир мекунем gitlab-давон бевосита ҳамчун як қисми лоиҳаи мо дар Кубернетес.

Gitlab як диаграммаи тайёрро барои ҷойгиркунии gitlab-runner ба Kubernetes пешниҳод мекунад. Пас, танҳо ба шумо лозим аст, ки бидонед аломати бақайдгирӣ барои лоиҳаи мо дар Танзимот -> CI / CD -> Давандагон ва онро ба руль гузаронед:

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

Дар куҷо:

  • https://gitlab.com — суроғаи сервери Gitlab-и шумо.
  • yga8y-jdCusVDn_t4Wxc — аломати бақайдгирии лоиҳаи шумо.
  • rbac.create=true — ба даванда миқдори зарурии имтиёзҳоро медиҳад, то тавонанд подкаҳоро барои иҷрои вазифаҳои мо бо истифода аз kubernetes-executor эҷод кунад.

Агар ҳама чиз дуруст анҷом дода шуда бошад, шумо бояд дар бахш давандаи ба қайд гирифташударо бинед Ронандагон, дар танзимоти лоиҳаи худ.

Скриншоти давандаи иловашуда

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Оё ин қадар оддӣ? - Ҳа, ин қадар оддӣ! Бо ба таври дастӣ сабти ном кардани давандагон дигар душворӣ нест, аз ин ба баъд давандагон ба таври худкор эҷод ва нобуд карда мешаванд.

6. Ҷойгир кардани диаграммаҳои Helm бо QBEC

Азбаски мо тасмим гирифтем, ки баррасӣ кунем gitlab-давон қисми лоиҳаи мо, вақти он расидааст, ки онро дар анбори Git мо тавсиф кунем.

Мо метавонем онро ҳамчун ҷузъи алоҳида тавсиф кунем сомона, аммо дар оянда мо нақша дорем, ки нусхаҳои гуногунро ҷойгир кунем сомона бисёр вақт, баръакс gitlab-давон, ки танҳо як маротиба дар як кластери Kubernetes ҷойгир карда мешавад. Пас, биёед як барномаи алоҳидаро барои он оғоз кунем:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

Ин дафъа мо объектҳои Kubernetes-ро дастӣ тавсиф намекунем, балки диаграммаи тайёри Helm-ро мегирем. Яке аз бартариҳои qbec ин қобилияти намоиш додани диаграммаҳои Helm аз анбори Git мебошад.

Биёед онро бо истифода аз submodule git пайваст кунем:

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

Акнун директория фурӯшанда/gitlab-runner Мо як анбори дорои диаграмма барои gitlab-runner дорем.

Ба ҳамин тариқ, шумо метавонед дигар анборҳоро пайваст кунед, масалан, тамоми анборро бо диаграммаҳои расмӣ пайваст кунед https://github.com/helm/charts

Биёед компонентро тавсиф кунем компонентҳо/gitlab-runner.jsonnet:

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

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

Аввалин далел ба васеъ кардани HelmTemplate мо рохро ба диаграмма мегузарем, пас параметрҳо, ки мо аз параметрҳои муҳити зист мегирем, пас объект бо он меояд

  • ном Шаблон - номи нашр
  • ном — фазои ном ба руль интиқол дода шуд
  • ин Файл — параметри зарурӣ, ки роҳро ба файли ҷорӣ мегузарад
  • муфассал — фармонро нишон медихад қолаби руль бо тамоми далелҳо ҳангоми пешниҳоди диаграмма

Акнун биёед параметрҳои компоненти худро дар 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,
      },
    },
  },
}

Диққат диҳед runnerRegistrationToken мо аз файли беруна мегирем secrets/base.libsonnet, биёед онро эҷод кунем:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

Биёед тафтиш кунем, ки оё ҳама чиз кор мекунад:

qbec show default

агар ҳама чиз дуруст бошад, мо метавонем версияи қаблан ҷойгиршударо тавассути Helm нест кунем:

helm uninstall gitlab-runner

ва онро ҳамин тавр ҷойгир кунед, аммо тавассути qbec:

qbec apply default

7. Муқаддима ба git-crypt

Git-crypt асбобест, ки ба шумо имкон медиҳад рамзгузории шаффофро барои анбори худ танзим кунед.

Дар айни замон сохтори феҳристи мо барои gitlab-runner чунин менамояд:

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

Аммо нигоҳ доштани асрор дар Git бехатар нест, ҳамин тавр не? Пас, мо бояд онҳоро дуруст рамзгузорӣ кунем.

Одатан, ба хотири як тағирёбанда, ин на ҳамеша маъно дорад. Шумо метавонед сирри худро ба qbec ва тавассути тағирёбандаҳои муҳити системаи CI шумо.
Аммо бояд қайд кард, ки лоиҳаҳои мураккабтаре мавҷуданд, ки метавонанд асрори бештарро дар бар гиранд; интиқоли ҳамаи онҳо тавассути тағирёбандаҳои муҳити зист ниҳоят душвор хоҳад буд.

Гузашта аз ин, дар ин ҳолат ман наметавонам ба шумо дар бораи чунин асбоби олиҷаноб нақл кунам git-crypt.

git-crypt Он инчунин қулай аст, ки он ба шумо имкон медиҳад, ки тамоми таърихи асрорро захира кунед, инчунин муқоиса, муттаҳид ва ҳалли низоъҳоро ҳамон тавре ки мо дар мавриди Git одат кардаем.

Аввалин чизе, ки пас аз насб git-crypt мо бояд калидҳоро барои анбори худ тавлид кунем:

git crypt init

Агар шумо калиди PGP дошта бошед, шумо метавонед фавран худро ҳамчун шарики ин лоиҳа илова кунед:

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

Бо ин роҳ шумо ҳамеша метавонед ин анборро бо истифода аз калиди шахсии худ рамзкушоӣ кунед.

Агар шумо калиди PGP надошта бошед ва онро интизор набошед, шумо метавонед бо роҳи дигар равед ва калиди лоиҳаро содир кунед:

git crypt export-key /path/to/keyfile

Ҳамин тариқ, ҳар касе, ки содирот дорад файли калидӣ қодир ба рамзкушоӣ кардани анбори шумо хоҳад буд.

Вақти он расидааст, ки сирри аввалини худро созем.
Хотиррасон мекунам, ки мо хануз дар феҳрист ҳастем deploy/gitlab-runner/, ки мо директория дорем асрор/, биёед ҳамаи файлҳои дар он бударо рамзгузорӣ кунем, барои ин мо файл эҷод мекунем секретҳо/.gitattributes бо мазмуни зерин:

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

Тавре ки аз мундариҷа дида мешавад, ҳама файлҳо ниқоб шудаанд * ронда мешавад git-crypt, гайр аз аксарият .gitattributes

Мо метавонем инро тавассути иҷро тафтиш кунем:

git crypt status -e

Натиҷа рӯйхати ҳамаи файлҳои репозиторӣ хоҳад буд, ки барои онҳо рамзгузорӣ фаъол аст

Ҳамааш ин аст, ҳоло мо метавонем тағиротҳои худро бехатар ворид кунем:

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

Барои бастани анбор, танҳо иҷро кунед:

git crypt lock

ва фавран ҳамаи файлҳои рамзгузоришуда ба чизи дуӣ табдил меёбанд, хондани онҳо ғайриимкон хоҳад буд.
Барои рамзкушоӣ кардани анбор, иҷро кунед:

git crypt unlock

8. Тасвири қуттии асбобҳо эҷод кунед

Тасвири қуттии асбобҳо тасвирест, ки бо тамоми асбобҳое, ки мо барои татбиқи лоиҳаи худ истифода хоҳем кард. Он аз ҷониби давандаи Gitlab барои иҷрои вазифаҳои маъмулии ҷойгиркунӣ истифода мешавад.

Дар ин чо хама чиз оддй аст, биёед навашро созем dockerfiles/toolbox/Dockerfile бо мазмуни зерин:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

Тавре ки шумо мебинед, дар ин тасвир мо ҳама утилитҳоро насб мекунем, ки барои ҷойгиркунии замимаи мо истифода мешуданд. Дар ин ҷо ба мо лозим нест, магар ин ки кубектл, аммо шумо метавонед дар марҳилаи насби қубур бо он бозӣ кунед.

Инчунин, барои он ки бо Кубернетес муошират карда тавонем ва ба он ҷобаҷо кунем, мо бояд нақшро барои pods тавлидкардаи gitlab-runner танзим кунем.

Барои ин, биёед ба директория бо gitlab-runner равем:

cd deploy/gitlab-runner

ва ҷузъи нав илова кунед komponents/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,
      },
    ],
  },
]

Мо инчунин параметрҳои навро дар тасвир тавсиф хоҳем кард 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,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

Диққат диҳед $.components.rbac.name ишора мекунад ном барои компонент rbac

Биёед бубинем, ки чӣ тағир ёфтааст:

qbec diff default

ва тағиротҳои моро ба Kubernetes татбиқ кунед:

qbec apply default

Инчунин, фаромӯш накунед, ки тағиротҳои моро ба git ворид кунед:

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. Аввалин лӯлаи мо ва васл кардани тасвирҳо аз рӯи тегҳо

Дар решаи лоиҳа мо эҷод мекунем .gitlab-ci.yml бо мазмуни зерин:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

Лутфан қайд кунед, ки мо истифода мебарем GIT_SUBMODULE_STRATEGY: муқаррарӣ барои он корҳое, ки шумо бояд пеш аз иҷроиш зермодулҳоро ба таври возеҳ оғоз кунед.

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

Ман фикр мекунам, ки мо метавонем онро бехатар номида версияи v0.0.1 ва тегро илова кунед:

git tag v0.0.1

Ҳар вақте ки мо версияи навро баровардан лозим аст, тегҳоро илова мекунем. Тегҳо дар тасвирҳои Docker ба барчаспҳои Git пайваст карда мешаванд. Ҳар як тела бо теги нав сохтани тасвирҳоро бо ин тег оғоз мекунад.

Амал кунед git push --tegs, ва биёед ба лӯлаи аввалини худ назар андозем:

Скриншот аз қубури аввал

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Диққати шуморо ба он ҷалб кардан лозим аст, ки васлкунӣ аз рӯи тегҳо барои сохтани тасвирҳои докер мувофиқ аст, аммо барои ҷойгиркунии барнома ба Kubernetes мувофиқ нест. Азбаски барчаспҳои навро инчунин ба ӯҳдадориҳои кӯҳна таъин кардан мумкин аст, дар ин ҳолат, оғоз кардани лӯла барои онҳо боиси густариши версияи кӯҳна мегардад.

Барои ҳалли ин мушкилот, одатан сохтани тасвирҳои докер ба тегҳо ва ҷойгиркунии барнома дар филиал пайваст карда мешавад. усто, ки дар он версияҳои тасвирҳои ҷамъшуда сахт код карда шудаанд. Дар ин ҷо шумо метавонед бозгаштро бо баргардонидани оддӣ оғоз кунед усто-филиалҳо.

10. Автоматикунонии ҷойгиркунӣ

Барои он ки Gitlab-runner сирри моро рамзкушоӣ кунад, мо бояд калиди анборро содир кунем ва онро ба тағирёбандаҳои муҳити CI-и худ илова кунем:

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

Мо сатри ҳосилшударо дар Gitlab захира мекунем; Барои ин, биёед ба танзимоти лоиҳаи худ равем:
Танзимот -> CI / CD -> Тағирёбандаҳо

Ва биёед як тағирёбандаи нав эҷод кунем:

Намуди
калид
арзиши
Ҳифзшуда
бинам
доираи

File
GITCRYPT_KEY
<your string>
true (дар рафти таълим шумо метавонед false)
true
All environments

Скриншоти тағирёбандаи иловашуда

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Акнун биёед навсозӣ кунем .gitlab-ci.yml илова бар он:

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

Дар ин ҷо мо якчанд имконоти навро барои qbec фаъол кардем:

  • --root some/app — ба шумо имкон медиҳад, ки каталоги барномаи мушаххасро муайян кунед
  • --force:k8s-контекст __incluster__ - ин як тағирёбандаи ҷодугарест, ки мегӯяд, ки ҷойгиркунӣ дар ҳамон кластере сурат мегирад, ки дар он gtilab-runner кор мекунад. Ин зарур аст, зеро дар акси ҳол qbec кӯшиш мекунад, ки дар kubeconfig шумо сервери мувофиқи Kubernetes пайдо кунад.
  • --интизор — qbec-ро маҷбур мекунад, ки то он даме, ки захираҳои эҷодкардааш ба ҳолати омодагӣ ворид шаванд, интизор шаванд ва танҳо пас бо рамзи баромади муваффақ бароед.
  • — бале - танҳо қабати интерактивиро хомӯш мекунад Шумо мутмаин ҳастед? вақте ки ҷойгир карда шудааст.

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

Ва баъд тела додан мо мебинем, ки барномаҳои мо чӣ гуна ҷойгир шудаанд:

Скриншот аз қубури дуюм

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

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 ҷудо шудаем ва ҳоло мо тасвиреро бо номи филиали commit, ки лӯларо оғоз кардааст, тела медиҳем. Қобили зикр аст, ки ин инчунин бо барчаспҳо кор хоҳад кард, ки ба мо имкон медиҳад, ки аксҳои сайтро бо версияи мушаххас дар реестри docker захира кунем.

Вақте ки номи теги докер барои версияи нави сайт метавонад тағир наёбад, мо бояд тағиротро ба Kubernetes тавсиф кунем, вагарна он танҳо барномаро аз тасвири нав дубора ҷойгир намекунад, зеро он ҳеҷ гуна тағиротро дар густариш пайхас намекунад. ошкор.

Интихоб —vm:ext-str дайджест ="$DIGEST" барои qbec - ба шумо имкон медиҳад, ки тағирёбандаи берунаро ба jsonnet гузаронед. Мо мехоҳем, ки он бо ҳар як нашри замимаи мо дар кластер дубора ҷойгир карда шавад. Мо дигар наметавонем номи барчаспро, ки ҳоло тағирнопазир аст, истифода барем, зеро мо бояд ба версияи мушаххаси тасвир пайваст шавем ва ҳангоми тағир додани он ҷойгиркуниро оғоз кунем.

Дар ин ҷо ба мо қобилияти Канико барои захира кардани тасвири ҳазм дар файл кӯмак хоҳад кард (ихтиёрӣ --диҷест-файл)
Сипас, мо ин файлро интиқол медиҳем ва ҳангоми ҷойгиркунӣ онро мехонем.

Биёед параметрҳоро барои худ навсозӣ кунем deploy/website/environments/base.libsonnet ки ҳоло чунин хоҳад буд:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

Иҷро шуд, акнун ҳама гуна ӯҳдадорӣ кунед усто сохтани тасвири докерро барои оғоз мекунад сомона, ва сипас онро ба Kubernetes ҷойгир кунед.

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

Мо баъдтар тафтиш мекунем тела додан мо бояд чунин чизеро бубинем:

Скриншоти лӯла барои усто

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Аслан, ба мо лозим нест, ки gitlab-runner-ро бо ҳар як фишор дубора ҷойгир кунем, агар дар конфигуратсияи он, албатта, ҳеҷ чиз тағир наёфта бошад, биёед онро ислоҳ кунем. .gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

тағйиротҳо ба шумо имкон медиҳад, ки тағиротро назорат кунед deploy/gitlab-runner/ ва танҳо дар сурати мавҷуд будани онҳо кори моро ба вуҷуд меорад

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

тела додан, Он беҳтар аст:

Скриншоти лӯлаи навшуда

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

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, дар он ҷо блок илова кунед муҳит:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

Ин ба Gitlab имкон медиҳад, ки кор бо он алоқаманд бошад маҳсулот муҳити зист ва нишон додани пайванди дуруст ба он.

Акнун биёед ду кори дигарро илова кунем:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

Онҳо пас аз пахш кардан ба ҳама гуна филиалҳо ба ҷуз усто оғоз карда мешаванд ва версияи пешнамоиши сайтро ҷойгир мекунанд.

Мо як варианти навро барои qbec мебинем: --app-teg — он ба шумо имкон медиҳад, ки версияҳои ҷойгиршудаи барномаро нишон диҳед ва танҳо дар дохили ин тег кор кунед; ҳангоми эҷод ва нобуд кардани захираҳо дар Kubernetes, qbec танҳо бо онҳо кор мекунад.
Бо ин роҳ мо наметавонем барои ҳар як барраси муҳити алоҳида эҷод кунем, балки ҳамон якро дубора истифода барем.

Дар ин ҷо мо низ истифода мебарем qbec баррасии муроҷиат, ба ҷои qbec пешфарзро татбиқ мекунад - маҳз ҳамин лаҳзаест, ки мо кӯшиш мекунем фарқиятҳоро барои муҳитҳои худ тавсиф кунем (баррасӣ ва пешфарз):

Биёед илова кунем Шарҳи муҳити зист дар deploy/website/qbec.yaml

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

Он гоҳ мо онро дар он эълон мекунем deploy/website/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

Ва параметрҳои фармоишии онро дар он нависед deploy/website/environments/review.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

Биёед ба jobu низ муфассалтар назар андозем бознигарии_истеъдод, он ҳангоми нест кардани филиал оғоз мешавад ва то gitlab кӯшиш накунад, ки онро тафтиш кунад GIT_STRATEGY: ҳеҷ, баъдтар мо клон мекунем усто-филиал ва нест кардани барраси тавассути он.
Ин каме печида аст, аммо ман то ҳол роҳи зеботареро наёфтаам.
Варианти алтернативӣ ин ҷойгир кардани ҳар як барраси дар фазои номи меҳмонхона аст, ки ҳамеша метавонад комилан хароб карда шавад.

Фаромӯш накунед, ки тағиротҳои моро ворид кунед:

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

тела додан, санҷиши git checkout -b, санҷиши пайдоиши git push, санҷед:

Скриншоти муҳити сохташуда дар Gitlab

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Ҳама чиз кор мекунад? - хуб, филиали санҷиши моро нест кунед: устои касс, git push Origin :test, мо тафтиш мекунем, ки корҳои ҳазфи муҳити зист бе хато кор кардаанд.

Дар ин ҷо ман мехоҳам фавран фаҳмонам, ки ҳар як таҳиякунанда дар лоиҳа метавонад филиалҳо эҷод кунад, вай инчунин метавонад тағир ёбад .gitlab-ci.yml файл ва дастрасӣ ба тағирёбандаҳои махфӣ.
Аз ин рӯ, тавсия дода мешавад, ки истифодаи онҳо танҳо барои шохаҳои муҳофизатшуда иҷозат дода шавад, масалан дар усто, ё маҷмӯи алоҳидаи тағирёбандаҳоро барои ҳар як муҳит эҷод кунед.

13. Баррасии барномаҳо

Баррасии барномаҳо Ин як хусусияти GitLab аст, ки ба шумо имкон медиҳад тугмаро барои ҳар як файл дар анбор илова кунед, то онро дар муҳити ҷойгиршуда зуд дидан кунед.

Барои он ки ин тугмаҳо пайдо шаванд, шумо бояд файл эҷод кунед .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"

тела додан, ва санҷед:

Скриншоти тугмаи Баррасии барнома

Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Кор анҷом ёфт!

Сарчашмаҳои лоиҳа:

Ташаккур барои таваҷҷуҳ, умедворам, ки ба шумо писанд омад Озмоиши асбобҳои нав барои сохтан ва автоматикунонии ҷойгиркунӣ дар Kubernetes

Манбаъ: will.com

Илова Эзоҳ