ProHoster > блог > Администрација > Испробување нови алатки за градење и автоматизирање на распоредувањето во Кубернетес
Испробување нови алатки за градење и автоматизирање на распоредувањето во Кубернетес
Здраво! Неодамна, беа објавени многу кул алатки за автоматизација и за градење на слики на Docker и за распоредување на Kubernetes. Во овој поглед, решив да си поиграм со GitLab, темелно да ги проучувам неговите способности и, се разбира, да го поставам гасоводот.
Ова дело е инспирирано од веб-страницата kubernetes.io, кој е генериран од изворни кодови автоматски и за секое испратено барање за базен, роботот автоматски генерира верзија за преглед на страницата со вашите промени и обезбедува врска за прегледување.
Се обидов да изградам сличен процес од нула, но целосно изграден на Gitlab CI и бесплатни алатки што сум навикнат да ги користам за распоредување апликации на Kubernetes. Денес конечно ќе ви кажам повеќе за нив.
Написот ќе разговара за алатки како што се: Хуго, qbec, канико, git-crypt и GitLab CI со создавање на динамични средини.
Како пример за нашиот проект, ќе се обидеме да создадеме страница за објавување документација изградена на Hugo. Hugo е генератор на статична содржина.
За оние кои не се запознаени со статичките генератори, ќе ви кажам малку повеќе за нив. За разлика од конвенционалните мотори на веб-локации со база на податоци и некои PHP, кои, кога ги бара корисникот, генерираат страници во лет, статичните генератори се дизајнирани малку поинаку. Тие ви дозволуваат да земете извори, обично збир на датотеки во шаблони за обележување и теми на Markdown, а потоа да ги компајлирате во целосно завршена веб-локација.
Тоа е, како резултат на тоа, ќе добиете структура на директориуми и збир на генерирани HTML-датотеки, кои едноставно можете да ги поставите на кој било евтин хостинг и да добиете работна веб-страница.
Можете да го инсталирате Hugo локално и да го испробате:
Иницијализирање на нова страница:
hugo new site docs.example.org
И во исто време складиштето за git:
cd docs.example.org
git init
Досега, нашата страница е недопрена и за да се појави нешто на неа, прво треба да поврземе тема; темата е само збир на шаблони и одредени правила со кои се генерира нашата страница.
За темата што ќе ја користиме Научете, што, според мое мислење, е совршено прилагодено за локација за документација.
Би сакал да обрнам посебно внимание на фактот дека не треба да ги зачувуваме датотеките со теми во складиштето на нашиот проект; наместо тоа, можеме едноставно да го поврземе користејќи подмодул git:
Така, нашето складиште ќе содржи само датотеки директно поврзани со нашиот проект, а поврзаната тема ќе остане како врска до одредено складиште и заложба во него, односно секогаш може да се повлече од оригиналниот извор и да не се плаши од некомпатибилни промени.
Ајде да ја поправиме конфигурацијата config.toml:
baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"
Веќе во оваа фаза можете да трчате:
hugo server
И на адресата http://localhost:1313/ проверете ја нашата новосоздадена веб-страница, сите промени направени во директориумот автоматски ја ажурираат отворената страница во прелистувачот, многу погодно!
Ајде да се обидеме да создадеме насловна страница во содржина/_индекс.мд:
# My docs site
## Welcome to the docs!
You will be very smart :-)
Слика од екранот на новосоздадената страница
За да генерирате локација, само стартувајте:
hugo
Содржина на директориумот публика/ и ќе биде вашата веб-страница.
Да, патем, веднаш да го додадеме .гитинор:
echo /public > .gitignore
Не заборавајте да ги извршите нашите промени:
git add .
git commit -m "New site created"
2. Подготовка на Dockerfile
Време е да ја дефинираме структурата на нашето складиште. Јас обично користам нешто како:
dockerfiles/ — содржи директориуми со Dockerfiles и се што е потребно за градење на нашите Docker слики.
распоредување/ — содржи директориуми за распоредување на нашите апликации на Kubernetes
Така, ќе го создадеме нашиот прв Dockerfile по патеката dockerfiles/веб-страница/Dockerfile
FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src
FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]
Како што можете да видите, Dockerfile содржи два ОД, оваа функција се нарекува повеќестепена изградба и ви овозможува да исклучите сè што е непотребно од конечната слика на Docker.
Така, конечната слика ќе содржи само темноhttpd (лесен HTTP сервер) и публика/ — содржината на нашата статички генерирана веб-локација.
Не заборавајте да ги извршите нашите промени:
git add dockerfiles/website
git commit -m "Add Dockerfile for website"
3. Запознавање со канико
Како градител на слики докер, решив да користам канико, бидејќи за неговото работење не е потребен докер демон, а самата градба може да се изврши на која било машина и кешот може да се складира директно во регистарот, со што се елиминира потребата да се има полноправно постојано складирање.
За да ја изградите сликата, само стартувајте го контејнерот со канико извршител и префрлете му го тековниот контекст на изградбата; ова може да се направи и локално, преку докер:
Каде registry.gitlab.com/kvaps/docs.example.org/website — името на вашата докер-слика; по изградбата, таа автоматски ќе биде лансирана во регистарот на докер.
Параметар -- кеш ви овозможува да ги кеширате слоевите во регистарот на докер; за дадениот пример, тие ќе бидат зачувани во registry.gitlab.com/kvaps/docs.example.org/website/cache, но можете да наведете друга патека користејќи го параметарот -- кеш-репо.
Слика од екранот на докер-регистарот
4. Запознавање со qbec
Кјубек е алатка за распоредување која ви овозможува декларативно да ги опишете вашите манифестации на апликацијата и да ги распоредите на Kubernetes. Користењето на Jsonnet како главна синтакса ви овозможува значително да го поедноставите описот на разликите во повеќе средини, а исто така речиси целосно го елиминира повторувањето на кодот.
Ова може да биде особено точно во случаи кога треба да распоредите апликација во неколку кластери со различни параметри и сакате декларативно да ги опишете во Git.
Qbec, исто така, ви овозможува да ги прикажувате табелите на Helm со предавање на потребните параметри и потоа да управувате со нив на ист начин како и редовните манифестации, вклучително и да можете да примените разни мутации на нив, а тоа, пак, ви овозможува да се ослободите од потребата за користете ChartMuseum. Односно, можете да складирате и прикажувате графикони директно од git, каде што припаѓаат.
Како што реков претходно, ќе ги складираме сите распоредувања во директориум распоредување/:
mkdir deploy
cd deploy
Ајде да ја иницијализираме нашата прва апликација:
qbec init website
cd website
Сега структурата на нашата апликација изгледа вака:
Овде првенствено не интересира спец.средини, qbec веќе создаде стандардна околина за нас и ја зеде адресата на серверот, како и просторот за имиња од нашата актуелна kubeconfig.
Сега кога се распоредува на стандардно околина, qbec секогаш ќе се распоредува само во наведениот кластер Kubernetes и во наведениот именски простор, односно, повеќе не мора да се префрлате помеѓу контексти и простори за имиња за да извршите распоредување.
Доколку е потребно, секогаш можете да ги ажурирате поставките во оваа датотека.
Сите ваши средини се опишани во qbec.yaml, и во датотеката парами.libsonnet, каде што пишува каде да се добијат параметрите за нив.
Следно, гледаме два директориуми:
компоненти/ - сите манифестации за нашата апликација ќе бидат зачувани овде; тие може да се опишат и во jsonnet и во обичните yaml датотеки
средини/ — овде ќе ги опишеме сите променливи (параметри) за нашите средини.
Стандардно имаме две датотеки:
средини/база.libsonnet - ќе содржи заеднички параметри за сите средини
околини/стандардно.libsonnet — содржи параметри префрлени за животната средина стандардно
да отвориме средини/база.libsonnet и додадете параметри за нашата прва компонента таму:
Во оваа датотека опишавме три Кубернетес ентитети одеднаш, тоа се: распоредување, Сервис и Целосно. Ако сакавме, можевме да ги ставиме во различни компоненти, но во оваа фаза една ќе ни биде доволна.
синтакса jsonnet е многу сличен на обичниот json, во принцип, обичниот json е веќе валиден jsonnet, така што на почетокот можеби ќе ви биде полесно да користите онлајн услуги како yaml2json да го конвертирате вашиот вообичаен yaml во json или, ако вашите компоненти не содржат никакви променливи, тогаш тие може да се опишат во форма на обичен yaml.
Кога работите со jsonnet Силно препорачувам да инсталирате приклучок за вашиот уредник
На пример, постои приклучок за vim vim-jsonnet, кој го вклучува означувањето на синтаксата и автоматски се извршува jsonnet fmt секој пат кога зачувувате (потребно е инсталирано jsonnet).
Сè е подготвено, сега можеме да започнеме со распоредување:
За да видиме што добивме, да трчаме:
qbec show default
На излезот, ќе видите рендерирани yaml манифестации кои ќе се применат на стандардниот кластер.
Одлично, сега аплицирајте:
qbec apply default
На излезот секогаш ќе видите што ќе се прави во вашиот кластер, qbec ќе ве замоли да се согласите со промените со пишување y ќе можете да ги потврдите вашите намери.
Нашата апликација е подготвена и распоредена!
Ако правите промени, секогаш можете да направите:
qbec diff default
за да видите како овие промени ќе влијаат на тековното распоредување
Не заборавајте да ги извршите нашите промени:
cd ../..
git add deploy/website
git commit -m "Add deploy for website"
5. Пробување на Gitlab-runner со Kubernetes-executor
До неодамна користев само обична gitlab-тркач на претходно подготвена машина (LXC контејнер) со школка или докер-извршител. Првично, имавме неколку такви тркачи глобално дефинирани во нашата gitlab. Тие собраа докер слики за сите проекти.
Но, како што покажа практиката, оваа опција не е најидеална, и во однос на практичноста и безбедноста. Многу е подобро и идеолошки покоректно да се распоредат посебни тркачи за секој проект, па дури и за секоја средина.
За среќа, тоа воопшто не е проблем, бидејќи сега ќе се распоредиме gitlab-тркач директно како дел од нашиот проект токму во Кубернетес.
Gitlab обезбедува готова шема на кормило за распоредување на gitlab-runner на Kubernetes. Значи, сè што треба да направите е да дознаете токен за регистрација за нашиот проект во Поставки -> CI / CD -> Тркачи и префрли го на кормилото:
yga8y-jdCusVDn_t4Wxc — токен за регистрација за вашиот проект.
rbac.создаде=точно — му дава на тркачот потребната количина на привилегии за да може да создава подлоги за извршување на нашите задачи користејќи kubernetes-executor.
Ако сè е направено правилно, треба да видите регистриран тркач во делот Тркачите, во поставките на вашиот проект.
Слика од екранот на додадениот тркач
Дали е толку едноставно? - Да, толку е едноставно! Нема повеќе проблеми со рачно регистрирање на тркачите, отсега па натаму тркачите ќе се креираат и уништуваат автоматски.
6. Распоредете ги табелите на Helm со QBEC
Бидејќи решивме да размислиме gitlab-тркач дел од нашиот проект, време е да го опишеме во нашето складиште на Git.
Можеме да го опишеме како посебна компонента , но во иднина планираме да распоредиме различни копии многу често, за разлика од gitlab-тркач, кој ќе биде распореден само еднаш по кластер на Kubernetes. Значи, ајде да иницијализираме посебна апликација за тоа:
cd deploy
qbec init gitlab-runner
cd gitlab-runner
Овој пат нема рачно да ги опишуваме ентитетите на Кубернетес, туку ќе земеме готова шема на Хелм. Една од предностите на qbec е можноста за прикажување на табелите на Helm директно од складиштето на Git.
Сега директориумот продавач/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,
}
)
Првиот аргумент за прошируваХелмШаблон го поминуваме патот до табелата, тогаш парами.вредности, кои ги земаме од параметрите на околината, а потоа доаѓа објектот со
име Шаблон - име на издавање
именски простор — именскиот простор префрлен на кормилото
оваа Датотека — потребен параметар што ја поминува патеката до тековната датотека
гласно - ја покажува командата шаблон за кормило со сите аргументи при рендерирање на графиконот
Сега да ги опишеме параметрите за нашата компонента во средини/база.libsonnet:
Но, складирањето тајни во Git не е безбедно, нели? Затоа треба да ги шифрираме правилно.
Обично, за доброто на една променлива, ова не секогаш има смисла. Можете да ги пренесете тајните на qbec и преку променливите на околината на вашиот CI систем.
Но, вреди да се напомене дека има и посложени проекти кои можат да содржат многу повеќе тајни; пренесувањето на сите нив преку променливите на животната средина ќе биде исклучително тешко.
Покрај тоа, во овој случај не би можел да ви кажам за таква прекрасна алатка како git-crypt.
git-crypt Погодно е и по тоа што ви овозможува да ја зачувате целата историја на тајни, како и да споредувате, спојувате и решавате конфликти на ист начин како што сме навикнати да правиме во случајот со Git.
Првото нешто по инсталацијата git-crypt треба да генерираме клучеви за нашето складиште:
git crypt init
Ако имате PGP клуч, тогаш можете веднаш да се додадете себеси како соработник за овој проект:
На овој начин секогаш можете да го дешифрирате ова складиште користејќи го вашиот приватен клуч.
Ако немате PGP клуч и не го очекувате, тогаш можете да одите на друг начин и да го извезете клучот на проектот:
git crypt export-key /path/to/keyfile
Така, секој што има извезено клучна датотека ќе може да го дешифрира вашето складиште.
Време е да ја поставиме нашата прва тајна.
Да ве потсетам дека сè уште сме во именикот распореди/gitlab-runner/, каде што имаме директориум тајни/, ајде да ги криптираме сите датотеки во него, за ова ќе создадеме датотека тајни/.гитатрибути со следнава содржина:
Како што може да се види од содржината, сите датотеки се маскирани * ќе се вози низ git-crypt, освен повеќето .гитатрибути
Можеме да го провериме ова со трчање:
git crypt status -e
Излезот ќе биде список на сите датотеки во складиштето за кои е овозможено шифрирање
Тоа е сè, сега можеме безбедно да ги извршиме нашите промени:
cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"
За да блокирате складиште, само стартувајте:
git crypt lock
и веднаш сите шифрирани датотеки ќе се претворат во бинарно нешто, ќе биде невозможно да се прочитаат.
За да го дешифрирате складиштето, извршете:
git crypt unlock
8. Направете слика од кутијата со алатки
Сликата на кутијата со алатки е слика со сите алатки што ќе ги користиме за да го распоредиме нашиот проект. Ќе се користи од страна на Gitlab тркачот за извршување на типични задачи за распоредување.
Сè е едноставно овде, ајде да создадеме ново dockerfiles/Toolbox/Dockerfile со следнава содржина:
FROM alpine:3.11
RUN apk add --no-cache git git-crypt
RUN QBEC_VER=0.10.3
&& wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz
| tar -C /tmp -xzf -
&& mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/
RUN KUBECTL_VER=1.17.0
&& wget -O /usr/local/bin/kubectl
https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl
&& chmod +x /usr/local/bin/kubectl
RUN HELM_VER=3.0.2
&& wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz
| tar -C /tmp -zxf -
&& mv /tmp/linux-amd64/helm /usr/local/bin/helm
Како што можете да видите, на оваа слика ги инсталираме сите алатки што ги користевме за распоредување на нашата апликација. Не ни треба овде освен ако кубектел, но можеби ќе сакате да си играте со него за време на фазата на поставување на гасоводот.
Исто така, за да можеме да комуницираме со Kubernetes и да се распоредиме на него, треба да конфигурираме улога за pods генерирани од gitlab-runner.
За да го направите ова, ајде да одиме во директориумот со gitlab-runner:
cd deploy/gitlab-runner
и додадете нова компонента компоненти/rbac.jsonnet:
Ве молиме имајте предвид дека користиме GIT_SUBMODULE_STRATEGY: нормално за оние работни места каде што треба експлицитно да ги иницијализирате подмодулите пред извршувањето.
Мислам дека можеме безбедно да го наречеме ова верзија v0.0.1 и додадете ја ознаката:
git tag v0.0.1
Ќе додаваме ознаки секогаш кога ќе треба да објавиме нова верзија. Ознаките во сликите на Docker ќе бидат поврзани со ознаките Git. Секое притискање со нова ознака ќе го иницијализира создавањето на слики со оваа ознака.
Ајде да го направиме тоа git push --тагови, и да го погледнеме нашиот прв гасовод:
Слика од екранот на првиот гасовод
Вреди да се привлече вашето внимание на фактот дека склопувањето по ознаки е погодно за градење на докер слики, но не е погодно за распоредување апликација на Кубернет. Бидејќи новите ознаки може да се доделат на старите обврзници, во овој случај, иницијализирањето на гасоводот за нив ќе доведе до распоредување на старата верзија.
За да се реши овој проблем, обично изградбата на докер слики е врзана за ознаки, а распоредувањето на апликацијата во гранка господар, во која верзии на собраните слики се хардкодирани. Ова е местото каде што можете да го иницијализирате враќањето со едноставно враќање господар-гранки.
10. Автоматизација на распоредувањето
За да може Gitlab-runner да ги дешифрира нашите тајни, ќе треба да го извеземе клучот за складиште и да го додадеме во нашите променливи на околината CI:
-- root some/app — ви овозможува да го одредите директориумот на одредена апликација
--force:k8s-context __incluster__ - ова е магична променлива која вели дека распоредувањето ќе се случи во истиот кластер во кој работи gtilab-runner. Ова е неопходно затоа што во спротивно, qbec ќе се обиде да најде соодветен сервер за Kubernetes во вашиот kubeconfig
-- почекај — го принудува qbec да почека додека ресурсите што ги создава не влезат во подготвена состојба и дури потоа да излезе со успешен излезен код.
— да - едноставно ја оневозможува интерактивната школка Дали си сигурен? кога се распоредени.
И потоа git push ќе видиме како се распоредени нашите апликации:
Слика од екранот на вториот гасовод
11. Артефакти и склопување при туркање за совладување
Вообичаено, чекорите опишани погоре се доволни за да се изгради и испорача речиси секоја микроуслуга, но не сакаме да додаваме ознака секогаш кога ќе треба да ја ажурираме страницата. Затоа, ќе земеме подинамичен пат и ќе поставиме распоредување на дигестот во главната гранка.
Идејата е едноставна: сега сликата на нашата ќе се обновува секој пат кога ќе се втурнете во господар, а потоа автоматски се распореди на Кубернетес.
Ајде да ги ажурираме овие две работни места во нашата .gitlab-ci.yml:
Ве молиме имајте предвид дека додадовме нишка господар к реф за работни места build_website и сега користиме $CI_COMMIT_REF_NAME наместо $CI_COMMIT_TAG, односно, ние сме одврзани од ознаките во Git и сега ќе туркаме слика со името на гранката на commit што го иницијализираше гасоводот. Вреди да се напомене дека ова ќе работи и со ознаки, што ќе ни овозможи да зачуваме снимки од страница со одредена верзија во докер-регистарот.
Кога името на докер-ознаката за нова верзија на страницата може да биде непроменето, сепак треба да ги опишеме промените на Kubernetes, инаку едноставно нема да ја прераспореди апликацијата од новата слика, бидејќи нема да забележи никакви промени во манифест за распоредување.
Опција —vm:ext-str дигест=”$DIGEST” за qbec - ви овозможува да пренесете надворешна променлива на jsonnet. Сакаме да се прераспореди во кластерот со секое издание на нашата апликација. Веќе не можеме да го користиме името на ознаката, кое сега може да биде непроменливо, бидејќи треба да бидеме врзани за одредена верзија на сликата и да го активираме распоредувањето кога ќе се промени.
Овде ќе ни помогне способноста на Канико да зачува дигестирана слика во датотека (опција --дигест-датотека)
Потоа ќе ја пренесеме оваа датотека и ќе ја прочитаме во моментот на распоредување.
Ајде да ги ажурираме параметрите за нашите deploy/website/environments/base.libsonnet кој сега ќе изгледа вака:
Готово, сега било какво обврзување господар ја иницијализира изградбата на докер сликата за , а потоа распоредете го на Кубернетес.
Не заборавајте да ги извршите нашите промени:
git add .
git commit -m "Configure dynamic build"
Ќе провериме подоцна git push треба да видиме вакво нешто:
Слика од екранот на гасоводот за господар
Во принцип, не треба да го прераспоредуваме gitlab-runner со секое притискање, освен ако, се разбира, ништо не се променило во неговата конфигурација, ајде да го поправиме во .gitlab-ci.yml:
Време е да го диверзифицираме нашиот гасовод со динамични средини.
Прво, да ја ажурираме работата build_website во нашата .gitlab-ci.yml, отстранувајќи го блокот од него само, што ќе го принуди Gitlab да го активира на кое било обврзување на која било гранка:
Тие ќе бидат лансирани по притискање до која било гранка освен мастер и ќе ја распоредат верзијата за преглед на страницата.
Гледаме нова опција за qbec: --апликација-ознака — ви овозможува да ги означите распоредените верзии на апликацијата и да работите само во рамките на оваа ознака; кога креирате и уништувате ресурси во Kubernetes, qbec ќе работи само со нив.
На овој начин не можеме да создадеме посебна средина за секој преглед, туку едноставно повторно да ја користиме истата.
Овде ние исто така користиме qbec примени преглед, наместо qbec примени стандардно - ова е токму моментот кога ќе се обидеме да ги опишеме разликите за нашите средини (преглед и стандардно):
Потоа ќе го објавиме 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 push, git checkout -b тест, тест за потекло на git push, проверете:
Слика од екранот на создадените средини во Gitlab
Сè работи? - одлично, избришете ја нашата тест гранка: господар на исходот од гит, git push origin :тест, проверуваме дали задачите за бришење на околината функционирале без грешки.
Овде би сакал веднаш да појаснам дека секој развивач во проект може да создаде гранки, тој исто така може да се промени .gitlab-ci.yml датотека и пристап до тајните променливи.
Затоа, строго се препорачува да се дозволи нивна употреба само за заштитени гранки, на пример во господар, или креирајте посебен сет на променливи за секоја средина.
13. Прегледајте ги апликациите
Прегледајте ги апликациите Ова е функција на GitLab која ви овозможува да додадете копче за секоја датотека во складиштето за брзо да ја видите во распоредена околина.
За да се појават овие копчиња, треба да креирате датотека .gitlab/route-map.yml и опишете ги сите трансформации на патеката во него; во нашиот случај тоа ќе биде многу едноставно: