Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu
Pantheon-eko gure garatzaile gonbidatuen tresnen sortzaileak GitLab CI/CD erabiliz WordPress inplementazioak automatizatzeari buruz hitz egiten du.

Π’ panteoia Garatzaileen harremanetan lan egiten dut, beraz, beti bilatzen ari naiz WordPress eta Drupal garatzaileei beren lan-fluxuetan automatizazio arazoak konpontzen laguntzeko modu berriak bilatzen. Horretarako, tresna berriekin esperimentatzea eta elkarren artean konbinatzea gustatzen zait eraginkortasunez lan egiteko.

Askotan ikusten ditut garatzaileak eszenatze zerbitzari bakar batekin borrokan ari direla.

Plazer bat da zure txandaren zain egotea tarteko zerbitzari bat erabiltzeko edo bezeroei URL bat bidaltzeko ohar honekin: "Begiratu hemen, baina ez begiratu hemen oraindik".

Garapen anitzeko inguruneak - Pantheon tresnetako batek - arazo hau konpontzen du, haiekin Git adarretarako inguruneak sor ditzakezulako eskaeraren arabera. Multidev ingurune bakoitzak bere URL eta datu-basea ditu, beraz, garatzaileek isil-isilik lan egin dezakete, kalitatea egiaztatu eta onespena lor dezakete elkarren behatzak zapaldu gabe.

Baina Pantheonek ez du bertsio-kontrolerako edo etengabeko integrazio eta hedapenerako tresnarik (CI/CD). Baina plataforma malgua da, zeinekin edozein tresna integra ditzakezun.

Gainera, taldeek garapenerako zenbait tresna erabiltzen dituztela ohartu nintzen, eta beste batzuk muntatzeko eta hedatzeko.

Adibidez, bertsioak kontrolatzeko eta CI/CDrako tresna desberdinak dituzte. Kodea editatzeko eta arazoak diagnostikatzeko tresnen artean ibili behar duzu.

On GitLab garapen-tresna multzo osoa dago: bertsioak kontrolatzeko, txartelak, bateratze-eskaerak, CI/CD kanalizazio onena, edukiontzi-erregistroa eta horrelako guztiak. Oraindik ez dut zure garapen-fluxua kudeatzeko hainbeste eskaintzen duen aplikaziorik topatu.

Automatizazioa maite dut, beraz, Pantheon GitLab-era konektatzen ikasi nuen, GitLab-eko adar nagusiarekiko konpromisoak Pantheon-eko garapen-ingurune nagusian zabaltzeko. Eta GitLab-en bateratze-eskaerek kodea sortu eta zabaldu dezakete Pantheon-eko garapen anitzeko inguruneetan.

Tutorial honetan, GitLab eta Pantheon-en arteko konexioa nola konfiguratu eta zure WordPress eta Drupal lan-fluxua nola optimizatu azalduko dizut.

Noski posible dela, ispilu GitLab biltegia, baina dena eskuekin egingo dugu sakontzeko GitLab CI eta etorkizunean erabili tresna hau hedapenerako ez ezik.

Sarrera

Argitalpen honetarako, ulertu behar duzu Pantheonek gune bakoitza hiru elementutan banatzen duela: kodea, datu-basea eta fitxategiak.

Kodeak CMS fitxategiak biltzen ditu, hala nola WordPress core, pluginak eta gaiak. Fitxategi hauek urtean kudeatzen dira Git biltegiak, Pantheon-ek antolatuta, hau da, GitLab-etik Pantheon-era Git-ekin kodea zabaldu dezakegu.
Pantheon-eko fitxategiak multimedia fitxategiak dira, hau da, gunerako irudiak. Normalean erabiltzaileek kargatzen dituzte eta Git-ek ez die jaramonik egiten.

Sortu doako kontu bat, informazio gehiago Panteoiaren lan-fluxua edo eman izena demo baterako pantheon.io-n.

hipotesi

Pantheon eta GitLab-en nire proiektua deitzen da pantheon-gitlab-blog-demo. Proiektuaren izenak bakarra izan behar du. Hemen WordPress gune batekin lan egingo dugu. Drupal har dezakezu, baina gauza batzuk aldatu beharko dituzu.

erabiliko dut Git komando lerroaeta bertan lan egin dezakezu interfaze grafikoa, nahi baduzu.

Proiektu bat sortu

Lehenik eta behin, sortu dezagun GitLab proiektua (geroago hona itzuliko gara).

Orain Pantheon-en WordPress webgune bat sortzea. Ondoren, WordPress instalatuko dugu guneko panelerako.

Eskuak zerbait aldatzeko gogoz bazaude, adibidez, pluginak kendu edo gehitzeko, izan pazientzia. Gunea oraindik ez dago GitLab-era konektatuta, eta kode-aldaketa guztiak GitLab-etik pasatzea nahi dugu.

WordPress instalatu ondoren, itzuli Pantheon webguneko panelera eta aldatu garapen modua Git-era.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Hasierako konpromisoa GitLab-en

Orain hasierako WordPress kodea Pantheon gunetik GitLabera transferitu behar duzu. Horretarako, Pantheon guneko Git biltegiko kodea klonatuko dugu lokalean, eta gero GitLab biltegira bidaliko dugu.

Errazagoa eta seguruagoa izan dadin, gehitu SSH gako bat Pantheon-era eta ez dugu pasahitz bat sartu beharko Pantheon Git biltegi bat klonatzen dugun bakoitzean. Aldi berean jada gehitu SSH gako bat GitLab-era.

Horretarako, klonatu Pantheon webgunea lokalean, webguneko aginte-paneleko Klonatu Git eremuko komandoa kopiatuz.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu
Laguntza behar baduzu, irakurri dokumentazioa Git for Pantheon-ekin hastea.

Orain alda gaitezen git remote originPantheon-en ordez GitLab-era seinalatu. Egin daiteke ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ git remote.

Goazen GitLab proiektura eta kopiatu biltegiaren URLa Klonatu goitibeherako proiektuaren xehetasunen orrian. Aukera dezagun Clone with SSH aukera, dagoeneko SSH gakoa konfiguratuta dugulako.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Lehenespenez git remote kode biltegiaren tokiko kopia baterako - origin. Hau alda daiteke c git remote set-url origin [URL рСпозитория GitLab], non kortxeten ordez benetako URLa sartzen dugun.

Azkenik, martxan jartzen dugu git push origin master --forceWordPress kodea Pantheonetik GitLabera bultzatzeko.

–force aukera behin bakarrik behar da. Gero taldeka git push ez da GitLab-en egongo.

Kredentzialak eta aldagaiak konfiguratzea

Gogoratzen duzu nola gehitu genuen lokalean SSH gako bat Pantheon eta GitLab-en saioa hasteko? SSH tokena GitLab eta Pantheon baimentzeko erabil daiteke.

GitLab-ek dokumentazio bikaina du. Ikus dezagun SSH gakoei buruzko atala GitLab CI/CD-rekin SSH gakoak erabiltzeko dokumentuan Docker exekutatzailea erabiltzean.

Orain lehenengo bi urratsak burutuko ditugu: Sortu dezagun lokalean SSH gako-pare berri bat ssh-keygen-ekin eta gehitu gako pribatua aldagai gisa proiektuari.

Orduan galdetuko dugu SSH_PRIVATE_KEY gisa GitLab CI/CD ingurune-aldagaia proiektuaren ezarpenetan.
Hirugarren eta laugarren urratsetan fitxategi bat sortuko dugu .gitlab-ci.yml honelako edukiarekin:

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

Ez dezagun fitxategia konprometitu oraindik .gitlab-ci.yml, orduan beste zerbait gehitu beharko diozu.

Orain bosgarren urratsa egiten dugu eta gehitu lehen urratsean sortu duzun gako publikoa eraikuntza-ingurunean atzitu behar dituzun zerbitzuetara.

Gure kasuan, GitLab-etik Pantheon-era sartu nahi dugu. Pantheon dokumentuan agertzen diren argibideak jarraitzen ditugu Pantheon-en SSH gako bat gehitzea eta egin urrats hau.

Gogoratu: SSH pribatua GitLab-en dago, SSH irekia Pantheon-en dago.

Konfigura ditzagun ingurune-aldagai gehiago. Lehenengoari PANTHEON_SITE deitzen zaio. Bere balioa zure makinan dagoen Pantheon gunearen izena da.

Makinaren izena Klonatu Git komandoaren amaieran ageri da. Dagoeneko lokalean klonatu duzu gunea, beraz, hau izango da tokiko biltegiaren direktorioaren izena.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Jarraian, konfigura dezagun ingurune-aldagaia PANTHEON_GIT_URL. Hau da dagoeneko erabili dugun Pantheon gunerako Git biltegiaren URLa.

Sartu SSH biltegiaren URLa soilik, gabe git clone eta amaieran makinan gunearen izena.

Uf. Hori eginda, orain gure fitxategia amaitu dezakegu .gitlab-ci.yml.

Sortu hedapen-zeregin bat

Hasieran GitLab CIrekin egingo duguna iraganean Git biltegiekin egin genuenaren oso antzekoa da. Baina oraingoan, gehitu dezagun Pantheon biltegia bigarren urruneko Git iturburu gisa, eta, ondoren, bultza dezagun kodea GitLab-etik Pantheonera.

Horretarako, konfigura dezagun etapa deploy ΠΈ zeregina deploy:dev, Pantheon-en garapen-ingurunean zabalduko dugulako. Ondorioz fitxategia .gitlab-ci.yml itxura hau izango du:

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

aldagai SSH_PRIVATE_KEY, PANTHEON_SITE ΠΈ PANTHEON_GIT_URL ezagunak izan beharko lirateke; ingurune-aldagai hauek lehenago konfiguratu ditugu. Aldagai hauekin fitxategiko balioak erabili ahal izango ditugu .gitlab-ci.yml askotan, eta leku bakarrean eguneratu beharko dira.

Azkenik, gehitu, konprometitu eta bidali fitxategia .gitlab-ci.yml GitLab-en.

Hedapena egiaztatzea

Dena ondo egin bagenu, zeregina deploy:dev arrakastaz exekutatuko da GitLab CI/CD-n eta konpromiso bat bidaliko du .gitlab-ci.yml Panteoian. Ikus dezagun.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Batzeko eskaera-hariak bidaltzen Panteonera

Hemen nire Panteon ezaugarri gogokoena erabiliko dugu - garapen anitzeko, non Pantheon ingurune osagarriak sor ditzakezun Git adarretarako eskaeraren arabera.

Multidev-erako sarbidea mugatua da, beraz, atal hau saltatu daiteke. Baina sarbidea baduzu, produktibitatea serioski handi dezakezu Pantheon-en garapen anitzeko inguruneak automatikoki sortzea GitLab-en bateratze-eskaeretatik.

Lehenik eta behin, egin dezagun Git adar berri bat lokalean erabiliz git checkout -b multidev-support. Orain alda dezagun berriro zerbait .gitlab-ci.yml.

Bateratze eskaeraren zenbakia Pantheon ingurunearen izenan sartzea gustatzen zait. Esate baterako, lehen bateratze eskaera da mr-1, bigarren - mr-2 etab.

Bateratze-eskaera aldatzen da, beraz, dinamikoki zehaztu behar ditugu Pantheon-en adarren izenak. GitLab-en erraza da - erabili besterik ez duzu behar aurrez zehaztutako ingurune-aldagaiak.

Har dezakegu $CI_MERGE_REQUEST_IIDbateratze-eskaeraren zenbakia zehazteko. Aplikatu dezagun hori guztia lehenago zehaztu ditugun ingurune-aldagai globalekin batera eta gehi dezagun deploy:multidev ataza berri bat fitxategiaren amaieran. .gitlab-ci.yml.

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Checkout the merge request source branch
    - git checkout $CI_COMMIT_REF_NAME
    # Add the Pantheon git repository as an additional remote
    - git remote add pantheon $PANTHEON_GIT_URL
    # Push the merge request source branch to Pantheon
    - git push pantheon $CI_COMMIT_REF_NAME:mr-$CI_MERGE_REQUEST_IID --force
  only:
    - merge_requests

Gure zereginaren antzekoa izango da deploy:dev, adarra bakarrik bidaltzen da Panteoira, ez master.

Fitxategi eguneratua gehitu eta konprometitu dugu .gitlab-ci.yml, eta orain bultza dezagun adar berri bat GitLab-era git push -u origin multidev-support.

Orain sor dezagun adarretik bateratze-eskaera berri bat multidev-supportsakatuz Sortu bateratze eskaera.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Bateratze eskaera sortu ondoren, CI/CD zeregina nola exekutatzen den ikusten dugu deploy:multidev.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Begira, hari berri bat bidali da Panteoira. Baina Pantheon guneko paneleko multidev atalera joaten bagara, ez dugu ingurune berria bertan ikusiko

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Ikus dezagun Git Branches atalean.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Ondorioz, gure haria mr-1 Panteoira iritsi zen. Sortu dezagun ingurune bat adar batetik mr-1.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Multidev ingurune bat sortu dugu, orain itzul gaitezen GitLab-era eta ikus gaitezen atala Eragiketak > Inguruneak. Sarrerak ikusiko ditugu dev ΠΈ mr-1.

Hau sarrera bat gehitu dugulako da environment Izenarekin name ΠΈ url CI/CD zereginetan. Ingurune irekiaren ikonoan klik egiten badugu, Pantheon-eko multidev ingurunearen URLra eramango gaituzte.

Multidev-en sorrera automatizatu

Printzipioz, hemen gelditu zaitezke eta gogoratu batuketa-eskaera bakoitzerako garapen anitzeko ingurune bat sortzea, baina prozesu hau automatizatu daiteke.

Pantheonek komando lerroko tresna bat du Terminus, non automatikoki plataformarekin lan egin dezakezun. Terminus-ek komando-lerrotik garapen anitzeko inguruneak sortzeko aukera ematen dizu, horretarako aproposa GitLab CI.

Hau probatzeko bateratze-eskaera berri bat behar dugu. Sortu dezagun adar berri bat erabiliz git checkout -b auto-multidev-creation.

Terminus GitLab CI/CD zereginetan erabiltzeko, makina-token bat behar duzu Terminus-ekin autentifikatzeko eta edukiontzi-irudia Terminus-ekin.

Pantheon Machine Token bat sortzea, gorde leku seguru batean eta gehitu ingurune-aldagai global gisa GitLab-en izenarekin PANTHEON_MACHINE_TOKEN.

GitLab ingurune-aldagaiak nola gehitu ahaztu bazaizu, itzuli definitu dugun lekura PANTHEON_SITE.

Dockerfile bat sortzea Terminus-ekin

Docker erabiltzen ez baduzu edo fitxategiak gustatzen ez bazaizkizu Dockerfile, hartu nire irudia registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest eta saltatu atal hau.

GitLab-ek edukiontzien erregistroa du, non gure proiekturako Dockerfile-a eraiki eta kokatu dezakegu. Sortu dezagun Dockerfile bat Terminus-ekin Pantheon-ekin lan egiteko.

Terminus PHP komando lerroko tresna bat da, beraz, has gaitezen PHP irudiarekin. Terminus Composer bidez instalatzen ari naiz, beraz, erabiliko dut Docker Composer irudi ofiziala. Guk sortzen dugu Dockerfile tokiko biltegiko direktorioan honako edukiarekin:

# Use the official Composer image as a parent image
FROM composer:1.8

# Update/upgrade apk
RUN apk update
RUN apk upgrade

# Make the Terminus directory
RUN mkdir -p /usr/local/share/terminus

# Install Terminus 2.x with Composer
RUN /usr/bin/env COMPOSER_BIN_DIR=/usr/local/bin composer -n --working-dir=/usr/local/share/terminus require pantheon-systems/terminus:"^2"

Jarraitu ataleko irudiak muntatzeko eta bidaltzeko argibideei Eraiki eta bultzatu irudiak Π² edukiontzien erregistroko dokumentazioairudi bat biltzeko Dockerfile eta bultzatu GitLab-era.

Ireki atala Erregistroan GitLab proiektuan. Dena aurreikusitakoaren arabera joango balitz, gure irudia hor egongo da. Idatzi irudiaren etiketarako esteka - fitxategirako behar dugu .gitlab-ci.yml.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

atala script arazoan deploy:multidev hazten hasi da, beraz, mugi dezagun beste fitxategi batera. Sortu fitxategi berri bat private/multidev-deploy.sh:

#!/bin/bash

# Store the mr- environment name
export PANTHEON_ENV=mr-$CI_MERGE_REQUEST_IID

# Authenticate with Terminus
terminus auth:login --machine-token=$PANTHEON_MACHINE_TOKEN

# Checkout the merge request source branch
git checkout $CI_COMMIT_REF_NAME

# Add the Pantheon Git repository as an additional remote
git remote add pantheon $PANTHEON_GIT_URL

# Push the merge request source branch to Pantheon
git push pantheon $CI_COMMIT_REF_NAME:$PANTHEON_ENV --force

# Create a function for determining if a multidev exists
TERMINUS_DOES_MULTIDEV_EXIST()
{
    # Stash a list of Pantheon multidev environments
    PANTHEON_MULTIDEV_LIST="$(terminus multidev:list ${PANTHEON_SITE} --format=list --field=id)"

    while read -r multiDev; do
        if [[ "${multiDev}" == "$1" ]]
        then
            return 0;
        fi
    done <<< "$PANTHEON_MULTIDEV_LIST"

    return 1;
}

# If the mutltidev doesn't exist
if ! TERMINUS_DOES_MULTIDEV_EXIST $PANTHEON_ENV
then
    # Create it with Terminus
    echo "No multidev for $PANTHEON_ENV found, creating one..."
    terminus multidev:create $PANTHEON_SITE.dev $PANTHEON_ENV
else
    echo "The multidev $PANTHEON_ENV already exists, skipping creating it..."
fi

Gidoia direktorio pribatu batean dago eta ez du Pantheon-en web sarbidea onartzen. Gure garapen anitzeko logikaren script bat dugu. Eguneratu dezagun orain atala deploy:multidev fitxategia .gitlab-ci.ymlhorrela atera dadin:

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

Gure zereginak sortutako irudi pertsonalizatuan egiten direla ziurtatu behar dugu, beraz, gehi dezagun definizio bat image erregistroko URLtik .gitlab-ci.yml. Ondorioz, honelako fitxategi batekin amaitu genuen .gitlab-ci.yml:

image: registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

Gehitu, konprometitu eta bidali private/multidev-deploy.sh ΠΈ .gitlab-ci.yml. Orain GitLab-era itzuliko gara eta CI/CD zeregina amaitu arte itxarongo dugu. Izan pazientzia: multidev-ek hainbat minutu behar izan ditzake sortzeko.

Ondoren, Pantheon-eko garapen anitzeko zerrendara joango gara. Ai miraria! Multidev ingurunea mr-2 dagoeneko hemen.

Nola konektatu GitLab eta Pantheon eta Drupal eta WordPress lan-fluxuak optimizatu

Ondorioa

Nire taldea askoz dibertigarriagoa izan zen bateratze-eskaerak irekitzen eta inguruneak automatikoki sortzen hasi ginenean.

GitLab eta Pantheon-en tresna indartsuekin, GitLab Pantheonera automatikoki konekta dezakezu.

GitLab CI/CD erabiltzen dugunez, gure lan-fluxuak hazteko lekua izango du. Hona hemen ideia pare bat hasteko:

Esan iezaguzu zer pentsatzen duzun GitLab, Pantheon eta automatizazioari buruz.

PS Ba al zenekien Terminus, Pantheon-en komando lerroko tresna, pluginen bidez heda daiteke?

Pantheon-en lan ona egin dugu gure 2. bertsioan Terminus eraikitzeko tresnetarako plugina GitLab laguntzarekin. Proiektu bakoitzaren ezarpenekin traba egin nahi ez baduzu, probatu plugin hau eta lagundu iezaguzu v2 beta probatzen. Terminus taldearentzat build:project:create Pantheon token bat eta GitLab token bat baino ez dituzu behar. Lagin-proiektuetako bat Composer-ekin eta proba automatizatuekin zabalduko du, proiektu berri bat sortuko du GitLab-en, Pantheon gune berri batean, eta konektatuko ditu ingurune-aldagaiak eta SSH gakoak erabiliz.

Egileari buruz

Andrew Taylor-ek garatzaileentzako tresnak sortzen ditu panteoia.

Iturria: www.habr.com

Gehitu iruzkin berria