
Tere! Viimasel ajal on ilmunud palju toredaid automatiseerimistööriistu nii Docker-piltide ehitamiseks kui ka Kubernetesesse juurutamiseks. SeetÔttu otsustasin mÀngida GitLabiga, uurida selle vÔimalusi ning muidugi seadistada pipeline'i.
Selle töö inspiratsiooniks oli veebisait , mis genereeritakse automaatset, ning iga saadetud pull request'i puhul genereerib robot automaatselt saidi eelvaate versiooni koos sinu muudatustega ja pakub linki vaatamiseks.
Olen pĂŒĂŒdnud ehitada sarnast protsessi nullist, kuid tĂ€ielikult GitLab CI-l ja vaba tarkvaraga, mida olen harjunud kasutama rakenduste juurutamiseks Kubernetesesse. TĂ€na rÀÀgin nendest tĂ€psemalt.
Artiklis kÀsitletakse selliseid tööriistu nagu:
Hugo, qbec, kaniko, git-crypt ja GitLab CI dĂŒnaamiliste keskkondade loomisega.
Sisukord
1. Tutvumine Hugo'ga
Kuna nÀidisena proovime luua dokumentatsiooni avaldamiseks mÔeldud veebilehte, mis on loodud Hugo'ga. Hugo on staatiline sisugeneraator.
Kellele staatilised generaatorid ei ole tuttavad, siis natuke tÀiendavat teavet. Erinevalt tavalistest veebimootoritest, millel on andmebaas ja PHP, mis genereerivad lehti jooksvalt, töötavad staatilised generaatorid veidi teisiti. Need vÔimaldavad vÔtta lÀhtekoodid, tavaliselt on need komplekt Markdown-formaadis faile ja teemasid, ning seejÀrel koostada need tÀiesti valmis veebileheks.
Seega saad veebilehe, millel on kaustastruktuur ja komplekt genereeritud HTML-faile, mida saab lihtsalt ĂŒles laadida igale odavale hostimisele ja saada toimiv veebileht.
Hugo saab paigaldada kohapeal ja proovida seda kasutada:
Algatame uue veebilehe:
hugo new site docs.example.orgJa samal ajal git-reposiitoriumi:
cd docs.example.org
git initPraegu on meie veebisait puhtalt tĂŒhi ning enne, kui sinna midagi lisada, peame kĂ”igepealt teema aktiveerima. Teema on lihtsalt mallide ja mÀÀratud reeglite kogum, mille jĂ€rgi meie veebisait genereeritakse.
Teemana kasutame , mis minu arvates sobib dokumentatsiooni saidile nagu valatult.
Erilist tÀhelepanu vÀÀrib see, et me ei pea teema faile oma projekti hoidlas hoidma; selle asemel saame selle lihtsalt aktiveerida, kasutades git submodule:
git submodule add https://github.com/matcornic/hugo-theme-learn themes/learnNii on meie hoidlas ainult need failid, mis on otseselt seotud meie projektiga, ja aktiveeritud teema jÀÀb viidatud konkreetse hoidla ja commit'ina, mille kaudu saab selle alati originaallĂ€hte taastada ilma ĂŒhilduvusprobleemide kartmata.
Parandame konfiguratsiooni config.toml:
baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"Juba sellel etapil saab kÀivitada:
hugo serverJa aadressil kontrollige meie just loodud veebisaiti, kÔik kaustas tehtud muudatused uuendavad automaatselt avatud lehte brauseris, vÀga mugav!
Proovime luua peamist lehte content/_index.md:
# My docs site
## Welcome to the docs!
You will be very smart :-)Ekraanipilt just loodud lehe kohta

Veebisaidi genereerimiseks piisab, kui kÀivitada:
hugoKausta sisaldus public/ ja sellest saab teie veebisait.
Jah, muide, lisame selle kohe .gitignore:
echo /public > .gitignoreĂrge unustage oma muudatusi commit'ida:
git add .
git commit -m "Uus sait loodud"2. Dockerfile'i ettevalmistamine
On aeg mÀÀratleda meie repositooriumi struktuur. Tavaliselt kasutan midagi sellist:
.
âââ deploy
â âââ app1
â âââ app2
âââ dockerfiles
âââ image1
âââ image2- dockerfiles/ â sisaldab kaustu Dockerfile'idega ja kĂ”ik vajalikud meie docker-piltide koostamiseks.
- deploy/ â sisaldab kaustu meie rakenduste juurutamiseks Kubernetesesse.
Nii loome meie esimese Dockerfile'i teel dockerfiles/website/Dockerfile
FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src
FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]Kuidas nÀha, Dockerfile sisaldab kahte FROM, seda vÔimalust nimetatakse ja vÔimaldab vÀlistada lÔpp-dockerpildist kÔik vajalikud.
Nii et lĂ”pppilt sisaldab ainult darkhttpd (kergekaaluline HTTP-server) ja public/ â sisu meie staatiliselt genereeritud saidilt.
Ărge unustage oma muudatusi commit'ida:
git add dockerfiles/website
git commit -m "Lisa Dockerfile veebisaidi jaoks"3. Tutvumine kanikoga
Dockerpiltide koostamiseks otsustasin kasutada , kuna selle toimimiseks ei ole vajalik docker-daemon ning koostamise saab teostada mis tahes masinal, salvestades vahemĂ€lu otse registrisse, vabastades seelĂ€bi vajadusest omada tĂ€isfunktsionaalset pĂŒsivaru.
Pildi koostamiseks piisab konteineri kÀivitamisest kaniko executor ja edastada sellele praegune koostamise kontekst, seda saab teha ka lokaalsetelt, kasutades dockerit:
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.1Kus registry.gitlab.com/kvaps/docs.example.org/website â teie dockerpildi nimi, pĂ€rast koostamist saadetakse see automaatselt docker-registrisse.
Parameeter âcache aitab kuvada kihtide vahemĂ€lu docker registry-s, antud nĂ€ite puhul salvestatakse need registry.gitlab.com/kvaps/docs.example.org/website/cache, kuid saate mÀÀrata ka teise tee parameetri kaudu âcache-repo.
Kuvamine docker-registry's

4. Ălevaade qbec'ist
on rakenduse manifeste deklareeriv tööriist, mis vĂ”imaldab neid deploida Kubernetesesse. Jsonnet'i kasutamine peamise sĂŒntaksina lihtsustab vĂ€ga palju erinevuste kirjeldamist erinevate keskkondade vahel ning peaaegu tĂ€ielikult kĂ”rvaldab koodi korduvuse.
See on eriti asjakohane olukordades, kus peate rakendust deploima mitmesse klastrisse erinevate seadistustega ja soovite neid deklareerivalt Git'is kirjeldada.
Qbec vÔimaldab ka Helm-i graafikute renderdamist, edastades neile vajalikud parameetrid ja seejÀrel töötades nendega nagu tavaliste manfestidega, sealhulgas saab neile rakendada erinevaid mutatsioone, mis omakorda vÔimaldab vÀltida ChartMuseum'i kasutamist. St graafikuid saab salvestada ja renderdada otse git'ist, kus need ka tegelikult peaksid olema.
Nagu ma varem ĂŒtlesin, salvestame kĂ”ik deployd kausta deploy/:
mkdir deploy
cd deployAlustame meie esimest rakendust:
qbec init website
cd websitePraegu nÀeb meie rakenduse struktuur vÀlja nii:
.
âââ components
âââ environments
â âââ base.libsonnet
â âââ default.libsonnet
âââ params.libsonnet
âââ qbec.yamlVaatame faili qbec.yaml:
apiVersion: qbec.io/v1alpha1
kind: App
metadata:
name: website
spec:
environments:
default:
defaultNamespace: docs
server: https://kubernetes.example.org:8443
vars: {}Siin huvitab meid eelkÔige spec.environments, qbec on juba meie eest loonud default keskkonna ja vÔtnud serveri aadressi ning namespace'i meie praegusest kubeconfig'ist.
NĂŒĂŒd deployimisel default keskkonda, deployib qbec alati ainult mÀÀratud Kubernetes-klastrisse ja mÀÀratud nimeteekonda, mis tĂ€hendab, et te ei pea enam kontekste ja nimeteeke vahetama, et teha deploy.
Vajadusel saate alati selle faili seadeid vÀrskendada.
KÔik teie keskkonnad on kirjeldatud qbec.yaml, ja failis params.libsonnet, kus on kirjas, kust vÔtta nende jaoks parameetrid.
Edasi nÀeme kahte kausta:
- components/ â siia salvestatakse kĂ”ik meie rakenduse manifestid, need vĂ”ivad olla kirjeldatud nii jsonnet'i kui ka tavapĂ€raste yaml-failidena
- keskkonnad/ â siin kirjeldame kĂ”iki meie keskkondade muutujaid (parameetreid).
Vaikimisi on meil kaks faili:
- keskkonnad/base.libsonnet â see sisaldab kĂ”iki ĂŒhiseid parameetreid kĂ”ikidele keskkondadele
- keskkonnad/default.libsonnet â sisaldab keskkonnale ĂŒlekirjutatud parameetreid default
Avame nĂŒĂŒd keskkonnad/base.libsonnet ja lisame sinna parameetrid meie esimesesele komponendile:
{
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',
},
},
}Loome ka meie esimese komponendi 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,
},
},
],
},
},
],
},
},
]Selles failis oleme kirjeldanud kolme Kubernetes'i elementi: Deployment, Teenused ja Ingress. Soovi korral saaksime need vĂ€lja tuua erinevatesse komponente, kuid praegusel etapil piisab meile ĂŒhest.
SĂŒntaks jsonnet on vĂ€ga sarnane tavalisele json'ile, tegelikult on tavaline json juba kehtiv jsonnet, nii et alguses vĂ”ib teil olla lihtsam kasutada veebiteenuseid nagu yaml2json et konvertida teile tuttav yaml json-ks, vĂ”i kui teie komponendid ei sisalda mingeid muutujaid, siis saab need tĂ€iesti hĂ€sti kirjeldada tavalise yaml-ina.
Töötades jsonnet soovitan tungivalt installida oma tekstiredaktorisse lisa
NĂ€iteks vim'i jaoks on olemas lisa vim-jsonnet, mis sisaldab sĂŒntaksi esitlemist ja automaatselt kĂ€ivitab jsonnet fmt iga salvestamise korral (nĂ”uab installitud jsonnet'i).
KĂ”ik on valmis, nĂŒĂŒd saame alustada juurutamist:
Et nÀha, mida oleme saavutanud, teeme jÀrgmist:
qbec show defaultVÀljundis nÀete renderdatud yaml-manifestid, mis rakendatakse default klastris.
SuurepĂ€rane, nĂŒĂŒd rakendame:
qbec apply defaultVÀljundis nÀete alati, mida teie klastris tehakse, qbec palub teil nÔustuda muudatustega, sisestades y saate oma kavatsusi kinnitada.
NĂŒĂŒd on meie rakendus edukalt juurutatud!
Muutuste korral saate alati esitada:
qbec diff defaultet nÀha, kuidas need muudatused mÔjutavad praegust juurutust
Ărge unustage oma muudatusi commit'ida:
cd ../..
git add deploy/website
git commit -m "Lisa juurutus veebilehele"5. Proovime Gitlab-runnerit Kubernetes-executoriga
Kuni hiljuti kasutasin ainult tavalist gitlab-runner eelnevalt ettevalmistatud masinas (LXC konteineris) shell- vÔi docker-executoriga. Esiteks oli meil mÔned sellised runnerid, mis olid globaalselt mÀÀratletud meie GitLabis. Nad kogusid docker-pilte kÔikidele projektidele.
Kuid nagu praktika nĂ€itas â see variant ei ole kĂ”ige ideaalne, nii praktilisuse kui ka turvalisuse osas. Oluliselt parem ja ideoloogiliselt Ă”igem on omada eraldi runnerid, mis on juurutatud iga projekti jaoks, vĂ”i isegi iga keskkonna jaoks.
Ănneks ei ole see probleem, kuna nĂŒĂŒd juurutame gitlab-runner otseselt osana meie projektist otse Kubernetesesse.
Gitlab pakub valmis helm-charti gitlab-runneri juurutamiseks Kubernetesesse. Seega on kĂ”ik, mis teil on vaja, teada registreerimise token meie projekti jaoks Seaded â> CI / CD â> Runners ja edastada see helm:
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-runnerKus:
- â sinu Gitlab-serveri aadress.
- yga8y-jdCusVDn_t4Wxc â registreerimise token teie projekti jaoks.
- rbac.create=true â annab runner'ile vajalikud Ă”igused, et luua pod'e meie ĂŒlesannete tĂ€itmiseks kubernetes-executor'i abil.
Kui kÔik on Ôigesti tehtud, peaksite nÀgema registreeritud runner'it jaotises Runners, teie projekti seadetes.
Ekraanipilt lisatud runner'ist

Kas see on tĂ”esti nii lihtne? â jah, see on tĂ”esti nii lihtne! Ei mingit vaeva runner'ite kĂ€sitsi registreerimisega, alates nĂŒĂŒd luuakse ja hĂ€vitatakse runner'id automaatselt.
6. Helm charte QBEC'iga.
Kuna oleme otsustanud pidada gitlab-runner osaks meie projektist, on aeg kirjeldada seda meie Git-repositoris.
Saaksime seda kirjeldada kui eraldi komponenti website, kuid tulevikus plaanime erinevaid koopiaid vĂ€ga tihti kĂ€ivitada, erinevalt website , mis paigaldatakse vaid ĂŒks kord iga Kubernetes'i klastri jaoks. Nii et alustame eraldi rakenduse seadistamist: gitlab-runnercd deploy qbec init gitlab-runner cd gitlab-runner
cd deploy
qbec init gitlab-runner
cd gitlab-runnerSeekord ei kirjelda me Kubernetes'e objekte kĂ€sitsi, vaid kasutame valmis Helm'i chart'i. Ăks qbec'i eeliseid on vĂ”imalus renderdada Helm'i chart'e otse Git'i repoitooriumist.
Lisame selle git submodule'i abil:
git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runnerNĂŒĂŒd kaust vendor/gitlab-runner sisaldab meie jaoks repoitooriumit GitLab Runner'i chart'iga.
Sarnasel viisil saab lisada ka teisi repoitooriume, nÀiteks ametlikud chart'id tervikuna.
Kirjeldame komponenti 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,
}
)Esimese argumendina expandHelmTemplate edastame tee chart'ini, seejÀrel params.values, mille vÔtame keskkonna parameetritest, seejÀrel tuleb objekt, mis sisaldab
- nameTemplate â vĂ€ljaande nimi
- namespace â helm'ile edastatav nimetand.
- thisFile â kohustuslik parameeter, mis edastab tee praegusele failile.
- verbose â nĂ€itab kĂ€su helm template kĂ”ikide argumentidega chart'i renderdades.
Kirjeldame nĂŒĂŒd meie komponendi parameetreid. keskkonnad/base.libsonnet:
local secrets = import '../secrets/base.libsonnet';
{
components: {
gitlabRunner: {
name: 'gitlab-runner',
values: {
gitlabUrl: 'https://gitlab.com/',
rbac: {
create: true,
},
runnerRegistrationToken: secrets.runnerRegistrationToken,
},
},
},
}Pange tÀhele runnerRegistrationToken me vÔtame vÀlisest failist secrets/base.libsonnet, loome selle:
{
runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}Kontrollime, kas kÔik töötab:
qbec show defaultKui kÔik on korras, siis saame eemaldada meie eelneva Helmiga vÀljastatud vÀlja:
helm uninstall gitlab-runnerja vÀljastada selle uuesti, aga juba qbec'i kaudu:
qbec apply default7. Tutvumine git-cryptiga
â on tööriist, mis vĂ”imaldab seadistada teie hoidla jaoks lĂ€bipaistvat krĂŒpteerimist.
Praegu nÀeb meie gitlab-runner'i kaustastruktuur vÀlja jÀrgmiselt:
.
âââ components
â âââ gitlab-runner.jsonnet
âââ environments
â âââ base.libsonnet
â âââ default.libsonnet
âââ params.libsonnet
âââ qbec.yaml
âââ secrets
â âââ base.libsonnet
âââ vendor
âââ gitlab-runner (alamoodul)Aga salajaste hoidmine Git'is ei ole ohutu, eks? Nii et peame need korralikult krĂŒpteerima.
Tavaliselt ei pruugi ĂŒhe muutuja jaoks see alati mĂ”tet omada. VĂ”ite edastada saladusi qbec ja lĂ€bi teie CI-sĂŒsteemi keskkonnavĂ€li.
Kuid tasub mÀrkida, et on ka keerulisemaid projekte, mis vÔivad sisaldada palju rohkem saladusi; nende edastamine keskkonnamuutujate kaudu oleks ÀÀrmiselt keeruline.Lisaks ei oleks mul sel juhul vÔimalik rÀÀkida teile nii suurepÀrasest tööriistast nagu git-crypt.
git-crypt on samuti mugav, kuna see vĂ”imaldab sĂ€ilitada kogu saladuste ajalugu, samuti vĂ”rrelda, ĂŒhendada ja lahendada konflikte just nagu me oleme harjunud seda tegema Gitiga.
Esimese asjana pÀrast installimist git-crypt peame genereerima vÔtmed meie hoidla jaoks:
git crypt initKui teil on PGP-vÔti, saate kohe lisada ennast koostööpartneriks selle projekti jaoks:
git-crypt add-gpg-user kvapss@gmail.comNii et saate alati selle hoidla dekrĂŒpteerida, kasutades oma privaatvĂ”tit.
Kui aga teil pole PGP-vÔtit ja ei nÀe seda ka tulevikus, siis vÔite minna teist teed ja eksportida projekti vÔtme:
git crypt export-key /path/to/keyfileNii et igaĂŒks, kellel on eksporditud keyfile suudab teie hoidla dekrĂŒpteerida.
On aeg seadistada meie esimene saladus.
Tuletan meelde, et oleme jĂ€tkuvalt kaustas deploy/gitlab-runner/, kus meil on direktorium secrets/, krĂŒpteerime kĂ”ik failid selles, loome faili secrets/.gitattributes sellise sisuga:
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diffNagu nÀha on, kÔik failid mustri jÀrgi * kullakse lÀbi git-crypt, vÀlja arvatud .gitattributes
Seda saame kontrollida kÀivitades:
git crypt status -eVĂ€ljundina saame loetelu kĂ”igist failidest repos, mille jaoks krĂŒptimine on sisse lĂŒlitatud
Ja kĂ”ik, nĂŒĂŒd saame julgelt oma muudatused commida:
cd ../..
git add .
git commit -m "Lisa deploy gitlab-runnerile"Repo lukustamiseks piisab, kui kÀivitada:
git crypt lockja hetkega muutuvad kĂ”ik krĂŒpteeritud failid binaarseks millekski, nende lugemine on vĂ”imatu.
Repo dekrĂŒpteerimiseks kĂ€ivitage:
git crypt unlock8. Loome toolbox-pildi
Toolbox-pilt on selline pilt kÔigi tööriistadega, mida kasutame meie projekti juurutamiseks. Seda kasutab gitlab-runner tavaliste juurutamiste tööde tÀitmiseks.
Siin on kÔik lihtne, loome uue dockerfiles/toolbox/Dockerfile sellise sisuga:
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/helmNagu vÔite mÀrgata, installime selles pildis kÔik utiliidid, mida kasutasime oma rakenduse juurutamiseks. Me ei vaja siin midagi muud, kubectl, kuid vÔib-olla soovite sellega mÀngida toru seadistamise etapis.
Samuti, et saaksime suhelda Kubernetesega ja teha juurutusi, peame seadistama rolli gitlab-runneri genereeritud podidele.
Selleks liigume gitlab-runneri katalooge:
cd deploy/gitlab-runnerja lisame uue komponendi 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,
},
],
},
]Samas kirjeldame uusi parameetreid keskkonnad/base.libsonnet, mis nĂŒĂŒd nĂ€eb vĂ€lja nii:
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',
},
},
}Pange tÀhele $.components.rbac.name viitab name komponendi rbac
Kontrollime, mis on muutunud:
qbec diff defaultja rakendame meie muudatused Kuberneteses:
qbec apply defaultĂrge unustage oma muudatusi git-is commida:
cd ../..
git add dockerfiles/toolbox
git commit -m "Lisa Dockerfile toolbox'ile"
git add deploy/gitlab-runner
git commit -m "Konfigureeri gitlab-runner kasutama toolbox'i"9. Meie esimene pipeline ja image'ide koostamine sildiga
Projekti juures loome .gitlab-ci.yml sellise sisuga:
.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:
- tagsPange tÀhele, et kasutame GIT_SUBMODULE_STRATEGY: normal tööde jaoks, kus tuleb selgelt alustada alamsubmodule enne tÀitmist.
Ărge unustage oma muudatusi commit'ida:
git add .gitlab-ci.yml
git commit -m "Automatiseeri docker build"MÔtleks, et seda vÔib julgelt nimetada versiooniks v0.0.1 ja lisada silt:
git tag v0.0.1Me mÀrkige iga kord, kui peame vÀlja andma uue versiooni. Docker-piltide sildid seotakse Git-siltidega. Iga uus silt, mis pushitakse, kÀivitab nende siltidega piltide koostamise.
TĂ€idame git push âtags, ja vaatame meie esimest torujuhet:
Esimese torujuhe ekraanipilt

Oluline on mÀrkida, et siltide koostamine sobib docker-piltide loomiseks, kuid ei sobi rakenduse juurutamiseks Kuberneteses. Kuna uusi silte vÔib mÀÀrata ka vanadele commit'idele, siis nende jaoks torujuhtme kÀivitamine tooks kaasa vana versiooni juurutamise.
Selle probleemi lahendamiseks seotakse tavaliselt docker-piltide koostamine silte ja rakenduse juurutamine harudega master, kus on kÔvakettale kirjutatud koostatud piltide versioonid. Just sel juhul saate tagasi pöörduda lihtsa revert master-haru.
10. Juurutamise automatiseerimine
Kuna Gitlab-runner peab meie salajaseid vÔtmeid dekodeerima, peame eksportima hoidla vÔtme ja lisama selle meie CI keskkonnamuutujatesse:
git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echosalvestame saadud stringi Gitlabi, selleks lÀheme oma projekti seadistusse:
Seaded â> CI / CD â> Muutujad
Ja loome uue muutuja:
TĂŒĂŒp
AvaÔigus
VÀÀrtus
Kaitstud
Maskeeritud
Ulatus
File
GITCRYPT_KEY
<teie string>
true (Ôpetamise ajaks vÔib ka false)
true
KÔik keskkonnad
Lisatud muutuja ekraanipilt

NĂŒĂŒd uuendame meie .gitlab-ci.yml lisades sinna:
.deploy_qbec_app:
etapp: turuletoomine
ainult:
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 --yesSiin oleme kasutanud mitmeid uusi valikuid qbec jaoks:
- âroot some/app â vĂ”imaldab mÀÀrata konkreetse rakenduse kausta
- âforce:k8s-context __incluster__ â see on maagiline muutuj, mis ĂŒtleb, et juurutamine toimub samas klastris, kus gitlab-runner töötab. Seda on vaja teha, kuna muidu ĂŒritab qbec leida sobivat Kubernetes serverit teie kubeconfig'ist
- âwait â sunnib qbec ootama, kuni loodud ressursid on seisundis Ready, ja lĂ”petab alles siis edukalt.
- âyes â lihtsalt vĂ€ljalĂŒlitab interaktiivse shelli Kas olete kindel? juurutamisel.
Ărge unustage oma muudatusi commit'ida:
git add .gitlab-ci.yml
git commit -m "Automatiseeri juurutamine"Ja pĂ€rast git push nĂ€eme, kuidas meie rakendused on ĂŒles seatud:
Teise voolu ekraanipilt

11. Aine ja kogumine masterisse push'imisel
Tavaliselt piisab ĂŒlaltoodud sammudest peaaegu igasuguse mikroteenuse kogumiseks ja tarnimiseks, kuid me ei soovi iga kord, kui me peame veebilehte uuendama, sildiga Ă€ra mĂ€rgata. SeetĂ”ttu liigume dĂŒnaamilisema meetodi poole ja seadistame juurutamise digest'i alusel master harus.
Idee on lihtne: nĂŒĂŒd meie website pildid koostatakse iga kord, kui push'ime master, ja seejĂ€rel juurutatakse automaatselt Kubernetesesse.
Uuendame need kaks tööd meie .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"Pange tĂ€hele, et oleme lisanud haru master kellele refs tööle build_website ja me nĂŒĂŒd kasutame $CI_COMMIT_REF_NAME asetatakse $CI_COMMIT_TAG, see me vabastame end Git'i siltidest ja hakkame nĂŒĂŒd sunnima pilti, mille nimi on commit-i haru, mis algatab toru. Tasub mĂ€rkida, et see töötab ka siltidega, mis vĂ”imaldab meil salvestada saidi hetkeseise, millel on konkreetne versioon docker-registry's.
Kui uue saidi versiooni docker-sildi nimi vÔib olla muutumatu, peame siiski muutustele kirjeldama Kuberneteses, vastasel juhul ei deploy'ita rakendust lihtsalt uue pildiga, kuna see ei mÀrka manifestis mingeid muudatusi.
Valik âvm:ext-str digest=»$DIGEST» qbec'i jaoks â vĂ”imaldab edastada vĂ€list muutuja jsonnet'isse. Tahame, et iga rakenduse vĂ€ljaande korral see uuesti deploy'itaks klastrisse. NĂŒĂŒd ei saa me kasutada sildi nime, mis vĂ”ib olla muutumatu, kuna peame seonduma kindla pildiversiooniga ja kĂ€ivitama deploy, kui see muutub.
Siin aitab meid Kaniko vĂ”imalus salvestada pildi digest faili (valik âdigest-file)
SeejÀrel edastame selle faili ja loeme selle deploy hetkeks.
Uuendame parameetreid meie deploy/website/environments/base.libsonnet mis nĂŒĂŒd nĂ€eb vĂ€lja nii:
{
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',
},
},
}Valmis, nĂŒĂŒd igasugune commiit master kĂ€ivitab docker-pildi koostamise website, seejĂ€rel selle juurutamise Kubernetesesse.
Ărge unustage oma muudatusi commit'ida:
git add .
git commit -m "Konfigureeri dĂŒnaamiline koostamine"Kontrollime, pĂ€rast git push peaksime nĂ€gema midagi sellist:
Masteri pipeline'i ekraanipilt

PÔhimÔtteliselt ei ole meil vajadust gitlab-runnerit iga push'i korral uuesti juurutada, kui, muidugi, selle konfiguratsioonis ei ole midagi muutunud, parandame seda .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/**/*changes aitab jÀlgida muudatusi deploy/gitlab-runner/ ja see kÀivitab meie töö ainult siis, kui selliseid on
Ărge unustage oma muudatusi commit'ida:
git add .gitlab-ci.yml
git commit -m "VĂ€henda gitlab-runneri juurutust"git push, nii et see on parem:
Uuendatud pipeline'i ekraanipilt

12. DĂŒnaamilised keskkonnad
On aeg rikastada meie pipeline'i dĂŒnaamiliste keskkondadega.
Alustame töö uuendamisega build_website meie .gitlab-ci.yml, eemaldades sellest ploki only, mis see paneb Gitlabi kÀivitama seda igasuguste commit'idega igasugustele harudele:
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/SeejÀrel uuendame tööd deploy_website, lisame sinna ploki environment:
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"See vÔimaldab Gitlabil siduda töö prod keskkonnaga ja kuvada sellele Ôige viit.
NĂŒĂŒd lisame veel kaks tööd:
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: manualNeed run when pushing to any branches except master and will deploy a preview version of the website.
We see a new option for qbec: âapp-tag â it allows tagging the deployed versions of the application and operating only within that tag; when creating and destroying resources in Kubernetes, qbec will only work with those.
Nii saame luua eraldi keskkonnas iga ĂŒlevaate jaoks, vaid lihtsalt kasutada ĂŒhte ja sama.
Siin kasutame samuti qbec rakenda ĂŒlevaade, selle asemel qbec apply default â see on just see hetk, mil pĂŒĂŒame kirjeldada erinevusi meie keskkondade (ĂŒlevaade ja vaike) vahel:
Lisame ĂŒlevaate keskkond deploy/website/qbec.yaml
spec:
environments:
review:
defaultNamespace: docs
server: https://kubernetes.example.org:8443SeejÀrel kuulutame selle 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 'keskkond ' + env + ' pole mÀÀratud ' + std.thisFileJa salvestame selle jaoks kohandatud parameetrid 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',
},
},
}Vaadakem tĂ€helepanelikumalt tööd stop_review, see kĂ€ivitub filiaali kustutamisel ja et gitlab ei prooviks selle peale checkouti, kasutatakse GIT_STRATEGY: none, hiljem kloonime master-filiaali ja kustutame ĂŒlevaate selle kaudu.
Natuke keeruline, aga ma pole leidnud ilusamat viisi.
Alternatiivne variant vĂ”ib olla iga ĂŒlevaate juurutamine eraldi nimiruumis, mille saab alati tĂ€ielikult kustutada.
Ărge unustage oma muudatusi commit'ida:
git add .
git commit -m "LĂŒlita sisse automaatne ĂŒlevaade"git push, git checkout -b test, git push origin test, kontrollime:
Gitlabis loodud keskkondade ekraanipilt

Kas kĂ”ik töötab? â suurepĂ€rane, kustutame meie testiharuna: git checkout master, git push origin :test, veendume, et keskkonna kustutamise tööd on möödunud ilma vigadeta.
Siin on oluline mÀrkida, et harude loomine on lubatud igale arendajale projekti raames, ta vÔib ka muuta .gitlab-ci.yml faili ja pÀÀseda ligi salajastele muutujatele.
Seega on tungivalt soovitatav lubada nende kasutamine ainult kaitstud harude jaoks, nÀiteks master, vÔi luua igas keskkonnas eraldi muutujate komplekt.
13. Review Apps
see on GitLabi vÔimalus, mis vÔimaldab igale failile repo'tes lisada nupu kiireks eelvaateks rakenduste keskkonnas.
Kuna need nupud ilmuvad, tuleb luua fail .gitlab/route-map.yml ja mÀÀratleda selles kÔik teede transformatsioonid, meie puhul on see vÀga lihtne:
# Indices
- source: /content/(.+?)_index.(md|html)/
public: '1'
# Pages
- source: /content/(.+?).(md|html)/
public: '1/'Ărge unustage oma muudatusi commit'ida:
git add .gitlab/
git commit -m "Aktiveeri ĂŒlevaatamisrakendused"git push, ja kontrollime:
Review App nupu ekraanipilt

Töö on tehtud!
Projekti allikad:
- Gitlabis:
- GitHubis:
AitÀh tÀhelepanu eest, loodan, et teile meeldis ![]()
Allikas: habr.com
