Werf 1.1 serbestberdana: çêtirkirinên avakerê îro û plansaziyên ji bo pêşerojê

Werf 1.1 serbestberdana: çêtirkirinên avakerê îro û plansaziyên ji bo pêşerojê

werf Ji bo avakirin û radestkirina serîlêdanan ji Kubernetes re amûra meya çavkaniya vekirî GitOps CLI ye. Wek ku soz dabû, serbestberdana guhertoya v1.0 destpêka zêdekirina taybetmendiyên nû li werfê û vejandina nêzîkatiyên kevneşopî nîşan da. Naha em kêfxweş in ku serbestberdana v1.1 pêşkêşî dikin, ku di pêşveçûnê de gavek mezin e û bingehek ji bo pêşerojê ye berhevkar werf. Versiyon niha di nav de heye kanala 1.1 ea.

Bingeha berdanê mîmariya nû ya hilanîna qonaxê û xweşbînkirina xebata her du berhevkaran e (ji bo Stapel û Dockerfile). Mîmariya hilanînê ya nû îhtîmala pêkanîna meclîsên belavbûyî ji gelek mêvandar û meclîsên paralel li ser heman mêvandar vedike.

Optimîzasyona xebatê di qonaxa hesabkirina îmzeyên qonaxê de ji hesabên nehewce xilas kirina û guheztina mekanîzmayên ji bo hesabkirina kontrolên pelan berbi yên bikêrtir vedihewîne. Ev optimîzasyon dema navîn a avakirina projeyê bi karanîna werf kêm dike. Û avahîyên bêkar, dema ku hemî qonax di cache de hene qonax-depokirin, niha bi rastî bilez in. Di pir rewşan de, ji nû ve destpêkirina avakirinê dê ji 1 çirkeyê kêmtir bigire! Ev ji bo prosedurên ji bo verastkirina qonaxên di pêvajoya xebata tîmê de jî derbas dibe. werf deploy и werf run.

Di heman demê de di vê serbestberdanê de, stratejiyek ji bo nîşankirina wêneyan ji hêla naverokê ve xuya bû - nîşankirina-based naverokê, ku naha ji hêla xwerû ve hatî çalak kirin û yekane tê pêşniyar kirin.

Ka em ji nêz ve li nûbûnên sereke yên di werf v1.1 de mêze bikin, û di heman demê de ji we re li ser plansaziyên pêşerojê jî vebêjin.

Di werf v1.1 de çi guherî?

Format û algorîtmaya navê qonaxa nû ya ji bo hilbijartina qonaxan ji cache

Rêbaza nifşê navê qonaxa nû. Naha her avakirina qonaxê navek qonaxek yekta çêdike, ku ji 2 beşan pêk tê: îmzeyek (wek ku di v1.0 de bû) plus nasnameyek demkî ya bêhempa.

Mînakî, navê wêneya qonaxa tevahî dikare bi vî rengî xuya bike:

werf-stages-storage/myproject:d2c5ad3d2c9fcd9e57b50edd9cb26c32d156165eb355318cebc3412b-1582656767835

an jî bi giştî:

werf-stages-storage/PROJECT:SIGNATURE-TIMESTAMP_MILLISEC

Va ye:

  • SIGNATURE îmza qonaxek e, ku nasnavê naveroka qonaxê temsîl dike û bi dîroka guherandinên Git ve girêdayî ye ku rê li ber vê naverokê vedike;
  • TIMESTAMP_MILLISEC Nasnameya wêneya yekta ya garantîkirî ye ku di dema avakirina wêneyek nû de tê çêkirin.

Algorîtmaya ji bo hilbijartina qonaxên ji cache-ê li ser kontrolkirina pêwendiya Git commit-ê ye:

  1. Werf îmzeya qonaxek diyar dike.
  2. В qonax-depokirin Dibe ku ji bo îmzeyek diyar çend qonax hebin. Werf hemî qonaxên ku bi îmzeyê re hevûdu dikin hildibijêre.
  3. Ger qonaxa heyî bi Git ve girêdayî ye (git-arşîv, qonaxa xwerû ya bi paçên Git: install, beforeSetup, setup; an git-latest-patch), wê hingê werf tenê wan qonaxên ku bi peywirek ku bav û kalê komîteya heyî ye (ji bo ku avahî tê gotin) ve girêdayî hildibijêre.
  4. Ji qonaxên maqûl ên mayî, yek tê hilbijartin - ji hêla dîroka afirandinê ve ya herî kevn.

Qonaxek ji bo şaxên cûda yên Git dikare heman îmzeyê hebe. Lê werf dê pêşî lê bigire ku keşeya ku bi şaxên cihêreng ve girêdayî ye di navbera van şaxan de neyê bikar anîn, her çend îmzeyan li hev bikin.

→ Belgekirin.

Algorîtmaya nû ji bo çêkirin û tomarkirina qonaxên di hilanîna qonaxê de

Ger, dema ku qonaxên ji kaşê hildibijêrin, werf qonaxek guncaw nebîne, wê gavê pêvajoya komkirina qonaxek nû dest pê dike.

Têbînî ku pir pêvajoyên (li ser yek an çend mêvandar) dikarin hema hema di heman demê de dest bi avakirina heman qonaxê bikin. Werf algorîtmayek astengkirina xweşbîn bikar tîne qonax-depokirin di dema tomarkirina wêneya nû hatî berhev kirin de qonax-depokirin. Bi vî rengî, dema ku avakirina qonaxa nû amade ye, werf blokan dike qonax-depokirin û wêneyek nû hatî berhev kirin li wir tenê heke wêneyek minasib êdî li wir tune be xilas dike (ji hêla îmze û pîvanên din ve - algorîtmaya nû ya ji bo hilbijartina qonaxên ji cacheyê bibînin).

Wêneyek nû hatî berhev kirin ji hêla nasnameyek yekta ve tê garantî kirin TIMESTAMP_MILLISEC (forma navê qonaxa nû binêre). Di rewşê de qonax-depokirin wêneyek minasib dê were dîtin, werf dê wêneya nû ya berhevkirî ji holê rabike û wêneyê ji cache bikar bîne.

Bi gotinek din: pêvajoya yekem a qedandina avakirina wêneyê (ya herî bilez) dê mafê hilanîna wê di qonax-depokirinê de bistîne (û dûv re ew wêneya yekane ye ku dê ji bo hemî çêkirinan were bikar anîn). Pêvajoyek avakirina hêdî tu carî pêvajoyek zûtir asteng nake ku encamên avakirina qonaxa heyî hilîne û ber bi avakirina din ve biçe.

→ Belgekirin.

Performansa çêkerê Dockerfile çêtir kirin

Heya nuha, lûleya qonaxên ji bo wêneyek ku ji Dockerfile hatî çêkirin ji qonaxek pêk tê - dockerfile. Dema ku îmze tê hesibandin, kontrolkirina pelan tê hesibandin context, ku dê di dema civînê de tê bikaranîn. Berî vê pêşkeftinê, werf bi vegerî di nav hemî pelan de meşiya û bi berhevkirina çarçove û moda her pelê jimareyek kontrolê wergirt. Bi v1.1-ê dest pê dike, werf dikare kontrolên hesabkirî yên ku di depoyek Git de hatine hilanîn bikar bîne.

Algorîtma li ser bingehê ye git ls-dar. Algorithm qeydên di nav de digire .dockerignore û tenê dema ku hewce be, dara pelê bi paşvegerî derbas dike. Bi vî rengî, me ji xwendina pergala pelan, û girêdayîbûna algorîtmayê bi mezinbûnê veqetand. context ne girîng e.

Di heman demê de algorîtma pelên nehatine şopandin jî kontrol dike û, ger hewce be, wan di jimareya kontrolê de hesab dike.

Performansa çêtir kirin dema ku pelan vediguhezînin

Guhertoyên werf v1.1 dema ku serverek rsync bikar tînin anîna pelan ji berhem û wêneyan. Berê, îtxalkirin di du gavan de bi karanîna mountek pelrêça ji pergala mêvandar hate kirin.

Performansa importê ya li macOS-ê êdî ji hêla cildên Docker ve nayê sînorkirin, û hinardekirin di heman demê de wekî Linux û Windows-ê temam dibe.

Nîşankirina-based naverokê

Werf v1.1 ji hêla naveroka wêneyê ve bi navê nîşankirinê piştgirî dike - nîşankirina-based naverokê. Etîketên wêneyên Docker ên encam bi naveroka wan wêneyan ve girêdayî ye.

Dema ku emrê dimeşîne werf publish --tags-by-stages-signature an werf ci-env --tagging-strategy=stages-signature dîmenên bi navê weşandin îmza qonaxa wêne. Her wêne bi îmzaya xwe ya qonaxên vê wêneyê tê tag kirin, ku li gorî heman qaîdeyan wekî îmzeya birêkûpêk a her qonaxê cuda tê hesibandin, lê nasnameyek giştî ya wêneyê ye.

Îmzeya qonaxên wêneyê girêdayî ye:

  1. naveroka vê wêneyê;
  2. dîrokên guhertinên Git ku bûne sedema vê naverokê.

Depoyek Git her gav xwedan sozên dumî ye ku naveroka pelên wêneyê naguhezîne. Mînakî, bi tenê bi şîroveyan an commitsên yekbûnê, an jî peywirên ku wan pelên di Git-ê de ku dê di nav wêneyê de neyên guheztin diguhezîne, dike.

Dema ku nîşankirina-bingeha naverokê bikar tînin, pirsgirêkên ji nû ve destpêkirina nehewce yên podên serîlêdanê li Kubernetes ji ber guheztinên navê wêneyê têne çareser kirin, her çend naveroka wêneyê nehatibe guhertin. Bi awayê, ev yek ji wan sedeman e ku pêşî li hilanîna gelek mîkroservîsên yek serîlêdanê di depoyek yekane ya Git digire.

Di heman demê de, nîşankirina-based naverokê ji nîşankirina li ser şaxên Git-ê rêbazek nîşankirinê pêbawertir e, ji ber ku naveroka wêneyên encamkirî bi rêza ku lûleyên di pergala CI-yê de têne darve kirin ji bo komkirina pirjimariyên heman şaxê ve girêdayî ne.

giring: ji niha ve dest pê dike qonax-îmza Ye tenê stratejiya nîşankirinê ya pêşniyarkirî ye. Ew ê di fermanê de ji hêla xwerû ve were bikar anîn werf ci-env (heta ku hûn bi eşkere nexşeyek nîşankirina cûda diyar nekin).

→ Belgekirin. Weşanek cuda jî dê ji vê taybetmendiyê re were veqetandin. UPDATED (3ê Avrêl): Gotara bi hûrgulî weşandin.

Asta têketinê

Bikarhêner naha fersendê heye ku hilberînê kontrol bike, asta têketinê saz bike û bi agahdariya debugkirinê re bixebite. Vebijêrk zêde kirin --log-quiet, --log-verbose, --log-debug.

Bi xwerû, encam agahdariya herî kêm heye:

Werf 1.1 serbestberdana: çêtirkirinên avakerê îro û plansaziyên ji bo pêşerojê

Dema ku hilberîna devkî bikar tîne (--log-verbose) hûn dikarin bibînin ka werf çawa dixebite:

Werf 1.1 serbestberdana: çêtirkirinên avakerê îro û plansaziyên ji bo pêşerojê

Hilbera berfireh (--log-debug), ji bilî agahdariya xeletkirina werf, têketinên pirtûkxaneyên bikar anîn jî hene. Mînakî, hûn dikarin bibînin ka têkiliya bi Docker Registry re çawa çêdibe, û her weha cîhên ku demek girîng lê derbas dibe tomar bikin:

Werf 1.1 serbestberdana: çêtirkirinên avakerê îro û plansaziyên ji bo pêşerojê

Planên pêşerojê

Hişyariya kerema xwe! Vebijêrkên ku li jêr têne diyar kirin têne nîşankirin v1.1 dê di vê guhertoyê de peyda bibin, gelek ji wan di demek nêzîk de. Nûvekirin dê bi nûvekirinên otomatîkî werin dema bikaranîna multiwerf. Van taybetmendiyan bandorê li beşa stabîl a fonksiyonên v1.1 nakin; xuyangiya wan dê di mîhengên heyî de ne hewceyê destwerdana bikarhênerê bi destan bike.

Piştgiriya bêkêmasî ji bo pêkanînên cihêreng ên Docker Registry (NÛ)

  • Versiyon: v1.1
  • Dîrok: Adar
  • Pirs

Armanc ev e ku bikarhêner gava ku werf bikar tîne, pêkanîna xwerû bêyî sînoran bikar bîne.

Heya nuha, me komek çareseriyên jêrîn destnîşan kir ku ji bo wan em ê piştgirîya tevahî garantî bikin:

  • Pêşbirk (pirtûkxane/qeyd)*,
  • AWS ECR
  • Azûr*,
  • Docker Hub
  • GCR*,
  • Pakêtên GitHub
  • GitLab Registry*,
  • Bender*,
  • Berav.

Çareseriyên ku niha bi tevahî ji hêla werfê ve têne piştgirî kirin bi stêrkek têne nîşankirin. Ji bo yên din piştgirî heye, lê bi sînor.

Du pirsgirêkên sereke dikarin bêne naskirin:

  • Hin çareserî bi karanîna API-ya Docker Registry piştgirî nadin rakirina tagê, nahêlin ku bikarhêner paqijkirina otomatîkî ya werf bikar bînin. Ev ji bo AWS ECR, Docker Hub, û Pakêtên GitHub rast e.
  • Hin çareserî piştgirî nadin depoyên hêlînkirî (Docker Hub, Pakêtên GitHub û Quay) an jî dikin, lê divê bikarhêner wan bi destan bi karanîna UI an API (AWS ECR) biafirîne.

Em ê van û pirsgirêkên din bi karanîna API-yên xwecihî yên çareseriyê çareser bikin. Ev peywir di heman demê de vegirtina çerxa tevahî ya operasyona werfê bi ceribandinên ji bo her yek ji wan vedihewîne.

Avakirina wêneya belavkirî (↑)

  • Versiyon: v1.2 v1.1 (pêşengiya pêkanîna vê taybetmendiyê zêde bûye)
  • Dîrok: Adar-Nîsan Adar
  • Pirs

Heya nuha, werf v1.0 û v1.1 dikare tenê li ser yek mêvandarek diyarkirî ji bo operasyonên avakirin û weşandina wêneyan û bicîhkirina sepanê li Kubernetes were bikar anîn.

Ji bo vekirina îmkanên xebata belavkirî ya werfê, dema ku di Kubernetes de çêkirin û bicihkirina sepanan li ser çend hosteyên keyfî têne destpêkirin û ev mêvandar rewşa xwe di navbera avahiyan de rizgar nakin (rêveberên demkî), werf pêdivî ye ku şiyana karanîna bikar bîne. Docker Registry wekî dikanek qonaxê.

Berê, dema ku projeya werfê hê jî bi navê dapp dihate gotin, derfetek wê hebû. Lêbelê, me bi gelek pirsgirêkan re rû bi rû maye ku divê di dema pêkanîna vê fonksiyonê di werf de were hesibandin.

bingotin. Ev taybetmendî hewce nake ku berhevkar di hundurê Kubernetes pods de bixebite, ji ber Ji bo kirina vê yekê, hûn hewce ne ku ji girêdana servera Dockerê ya herêmî xilas bibin (di pod Kubernetes de gihîştina servera Docker-ê ya herêmî tune, ji ber ku pêvajo bixwe di konteynerek de dimeşe, û werf piştgirî nade û nake. bi servera Docker re li ser torê dixebitin). Piştgiriya ji bo xebitandina Kubernetes dê ji hev cuda were bicîh kirin.

Piştgiriya fermî ji bo Çalakiyên GitHub (NÛ)

  • Versiyon: v1.1
  • Dîrok: Adar
  • Pirs

Belgeyên werf (beş balkêşî и birêvebir), û her weha Çalakiya fermî ya GitHub ji bo xebata bi werfê re.

Digel vê yekê, ew ê rê bide werf ku li ser bezên efemeral bixebite.

Mekanîka danûstendina bikarhêner bi pergala CI re dê li ser bingeha danîna etîketan li ser daxwazên kişandinê be da ku hin çalakiyan bidin destpêkirin da ku serîlêdanê ava bikin/bixin.

Pêşkeftina herêmî û bicihkirina sepanan bi werf (↓)

  • Versiyon: v1.1
  • Dîrok: Çile-Sibat Nîsanê
  • Pirs

Armanca sereke ew e ku meriv konfigurasyonek yekbûyî ya yekbûyî ji bo bicîhkirina sepanan hem herêmî û hem jî di hilberînê de, bêyî kiryarên tevlihev, li derveyî qutiyê bi dest bixe.

Werf di heman demê de pêdivî ye ku modek xebitandinê hebe ku tê de ew ê hêsan be ku koda serîlêdanê biguherîne û tavilê ji serîlêdana xebitandinê ji bo debugkirinê bertek werbigire.

Algorîtmaya paqijkirina nû (NÛ)

  • Versiyon: v1.1
  • Dîrok: Avrêl
  • Pirs

Di guhertoya heyî ya werf v1.1 de di pêvajoyê de cleanup Ji bo nexşeya nîşankirina naverokê ya ji bo paqijkirina wêneyan tune - ev wêne dê kom bibin.

Di heman demê de, guhertoya heyî ya werf (v1.0 û v1.1) polîtîkayên paqijkirinê yên cihêreng ji bo wêneyên ku di binê nexşeyên nîşankirinê de têne weşandin bikar tîne: Şaxa Git, Git tag an Git commit.

Algorîtmayek nû ya ji bo paqijkirina wêneyan li ser bingeha dîroka berpirsiyariyên li Git-ê, ku ji bo hemî nexşeyên nîşankirinê yekgirtî ye, hate kifş kirin:

  • Ji bo her git HEAD (şax û nîşanan) ji N1-ên herî dawî ve girêdayî ne bêtir wêneyên N2-ê negirin.
  • Ji bo her git HEAD (şax û etîket) ne zêdetir wêneyên qonaxa N1-ê yên ku bi peywirên herî dawî yên N2 ve girêdayî ne hilînin.
  • Hemî wêneyên ku di her çavkaniyek komê ya Kubernetes de têne bikar anîn hilînin (hemû kontekstên kube yên pelê veavakirinê û cîhên navan têne şopandin; hûn dikarin vê tevgerê bi vebijarkên taybetî sînordar bikin).
  • Hemî wêneyên ku di manîfestoyên veavakirina çavkaniyê de têne bikar anîn ku di weşanên Helm de hatine tomarkirin hilînin.
  • Wêneyek dikare were jêbirin heke ew bi tu HEAD-ê ji git re têkildar nebe (mînak, ji ber ku HEAD-a têkildar bixwe hatî jêbirin) û di tu diyardeyên di koma Kubernetes û di weşanên Helm de neyê bikar anîn.

Avakirina wêneya paralel (↓)

  • Versiyon: v1.1
  • Dem: Çile-Sibat Nîsan *

Guhertoya heyî ya werf wêne û berhemên ku tê de hatine vegotin berhev dike werf.yaml, li pey hev. Pêdivî ye ku meriv pêvajoya berhevkirina qonaxên serbixwe yên wêne û berheman paralel bike, û hem jî hilberek hêsan û agahdar peyda bike.

* Nîşe: ji ber zêdebûna pêşanî ji bo pêkanîna kombûna belavkirî, ku dê kapasîteyên pîvandina horizontî, û her weha karanîna werfê bi Çalakiyên GitHub re zêde bike, muhlet hate guheztin. Civîna paralel qonaxa xweşbîniyê ya paşîn e, dema ku yek projeyek berhev dike, pîvana vertîkal peyda dike.

Veguhastina Helm 3 (↓)

  • Versiyon: v1.2
  • Dem: Sibat-Adar Gulan *

Koçberiya berbi kodê ya nû vedihewîne Helîm 3 û rêgezek îsbatkirî, hêsan a koçberkirina sazgehên heyî.

* Nîşe: guheztina Helm 3 dê taybetmendiyên girîng li werfê zêde neke, ji ber ku hemî taybetmendiyên sereke yên Helm 3 (3-rê-hev-hev û bê tiller) jixwe di werfê de têne bicîh kirin. Wekî din, werf heye taybetmendiyên din ji bilî yên destnîşankirî. Lê belê ev veguhertin di planên me de dimîne û dê pêk were.

Jsonnet ji bo danasîna veavakirina Kubernetes (↓)

  • Versiyon: v1.2
  • Dîrok: Çile-Sibat Nîsan-Gulan

Werf dê ravekirinên vesazkirinê yên Kubernetes di formata Jsonnet de piştgirî bike. Di heman demê de, werf dê bi Helm re hevaheng bimîne û dê bijartinek forma ravekirinê hebe.

Sedem ev e ku şablonên Go, li gorî gelek kesan, xwedan astengiyek têketinê ye, û têgihîştina koda van şablonan jî zirarê dibîne.

Ihtîmala danasîna pergalên ravekirina mîhengên Kubernetes yên din (mînak, Kustomize) jî tê hesibandin.

Di hundurê Kubernetes de dixebitin (↓)

  • Versiyon: v1.2
  • Dîrok: Nîsan-Gulan-Hezîran

Armanc: Piştrast bikin ku wêne têne çêkirin û serîlêdan bi karanîna gerokên li Kubernetes têne radest kirin. Ewan. Wêneyên nû dikarin rasterast ji Kubernetes pods werin berhev kirin, weşandin, paqijkirin û bicîh kirin.

Ji bo pêkanîna vê kapasîteyê, hûn pêşî hewce ne ku hûn bikaribin wêneyên belavkirî ava bikin (xala li jor binêre).

Di heman demê de ew ji bo moda xebitandina çêker bêyî serverek Docker jî piştgirî hewce dike (ango avahiyek mîna Kaniko an di cîhê bikarhêner de ava kirin).

Werf dê piştgirî bide avakirina li ser Kubernetes ne tenê bi Dockerfile, lê di heman demê de bi avakerê xwe yê Stapel re bi ji nû ve avakirina zêde û Ansible.

Gavek ber bi pêşveçûna vekirî

Em ji civaka xwe hez dikin (GitHub, Têlxiram) û em dixwazin ku bêtir û bêtir kes alîkariya werf çêtir bikin, rêça ku em tê de dimeşin fam bikin û beşdarî pêşkeftinê bibin.

Di van demên dawî de biryar hat girtin ku veguhere Tabloyên projeya GitHub ji bo eşkerekirina pêvajoya xebata ekîba me. Naha hûn dikarin plansaziyên tavilê, û hem jî xebata heyî di warên jêrîn de bibînin:

Gelek xebat li ser mijarên hatine kirin:

  • Yên negirêdayî rakirin.
  • Yên heyî bi jimareyek têr hûrgulî û hûrgulî bi yek formek têne birin.
  • Pirsgirêkên nû bi fikir û pêşniyaran hatine zêdekirin.

Meriv çawa guhertoya v1.1 çalak dike

Versiyon niha di nav de heye kanala 1.1 ea (di kanalan de stewr и kevir-zexm Lêbelê dema ku aramî çêdibe, berdan dê xuya bibin ea xwe jixwe ji bo bikaranîna têra xwe stabîl e, ji ber di kanalan re derbas bû alpha и beta). Activated bi rêya multiwerf bi awayê jêrîn:

source $(multiwerf use 1.1 ea)
werf COMMAND ...

encamê

Mîmariya hilanîna qonaxa nû û xweşbîniyên çêker ji bo çêkerên Stapel û Dockerfile îhtîmala pêkanîna avahîyên belavkirî û paralel di werfê de vedike. Van taybetmendiyan dê di demek nêzîk de di heman serbestberdana v1.1 de xuya bibin û dê bixweber bi mekanîzmaya nûvekirina xweser (ji bo bikarhêneran) peyda bibin multiwerf).

Di vê weşanê de, stratejiyek nîşankirinê ya li ser bingeha naveroka wêneyê hatî zêdekirin - nîşankirina-based naverokê, ku bûye stratejiya xwerû. Têketina fermana sereke jî ji nû ve hatî çêkirin: werf build, werf publish, werf deploy, werf dismiss, werf cleanup.

Pêngava girîng a din zêdekirina meclîsên belavbûyî ye. Avakirinên belavbûyî ji v1.0-ê vir ve ji avahîyên paralel bûne pêşanîyek bilindtir ji ber ku ew bêtir nirxê werf zêde dikin: pîvandina vertîkal a avakeran û piştgirî ji bo avakerên domdar di pergalên cihêreng ên CI/CD de, û her weha şiyana çêkirina piştgirîya fermî ji bo Çalakiyên GitHub. . Ji ber vê yekê dema pêkanîna meclîsên paralel hatin guhertin. Lêbelê, em dixebitin ku her du îhtîmal di zûtirîn dem de bicîh bikin.

Nûçeyan bişopînin! Û ji bîr nekin ku hûn biçin serdana me GitHubji bo afirandina pirsgirêkek, peydakirina yek heyî û lê zêde bike, PR biafirîne, an jî bi tenê li pêşkeftina projeyê temaşe bike.

PS

Li ser bloga me jî bixwînin:

Source: www.habr.com

Add a comment