Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress
Pencipta alat pembangun tetamu kami di Pantheon bercakap tentang cara mengautomasikan penggunaan WordPress menggunakan GitLab CI/CD.

Π’ Pantheon Saya bekerja dalam perhubungan pembangun, jadi saya sentiasa mencari cara baharu untuk membantu pembangun WordPress dan Drupal menyelesaikan masalah automasi dalam aliran kerja mereka. Untuk melakukan ini, saya suka bereksperimen dengan alatan baharu dan menggabungkannya antara satu sama lain untuk berfungsi dengan berkesan.

Saya sering melihat pembangun bergelut dengan pelayan pementasan tunggal.

Senang rasanya menunggu giliran anda menggunakan pelayan perantaraan atau menghantar URL kepada pelanggan dengan nota: "Lihat di sini, tetapi jangan lihat di sini lagi."

Persekitaran Multidev - salah satu alat Pantheon yang hebat - menyelesaikan masalah ini, kerana dengannya anda boleh mencipta persekitaran untuk cawangan Git atas permintaan. Setiap persekitaran multidev mempunyai URL dan pangkalan data sendiri, jadi pembangun boleh bekerja dengan senyap, menyemak kualiti dan mendapatkan kelulusan tanpa memijak satu sama lain.

Tetapi Pantheon tidak mempunyai alat untuk kawalan versi atau penyepaduan dan penggunaan berterusan (CI/CD). Tetapi ia adalah platform yang fleksibel yang mana anda boleh mengintegrasikan sebarang alat.

Saya juga mendapati bahawa pasukan menggunakan alat tertentu untuk pembangunan, dan yang berbeza untuk pemasangan dan penggunaan.

Sebagai contoh, mereka mempunyai alat yang berbeza untuk kawalan versi dan CI/CD. Anda perlu bermain-main dan bertukar antara alatan untuk mengedit kod dan mendiagnosis masalah.

Pada GitLab terdapat set lengkap alatan pembangunan: untuk kawalan versi, tiket, permintaan gabungan, saluran paip CI/CD terbaik dalam kelasnya, pendaftaran kontena dan segala-galanya seperti itu. Saya masih belum menemui aplikasi yang menawarkan begitu banyak untuk mengurus aliran kerja pembangunan anda.

Saya suka automasi, jadi saya belajar cara menyambungkan Pantheon ke GitLab supaya komitmen kepada cawangan utama di GitLab digunakan ke persekitaran pembangunan utama di Pantheon. Dan permintaan gabungan pada GitLab boleh mencipta dan menggunakan kod ke persekitaran multidev dalam Pantheon.

Dalam tutorial ini, saya akan membimbing anda melalui cara menyediakan sambungan antara GitLab dan Pantheon serta mengoptimumkan aliran kerja WordPress dan Drupal anda.

Sudah tentu boleh, cermin repositori GitLab, tetapi kami akan melakukan segala-galanya dengan tangan kami untuk menyelidikinya GitLab CI dan pada masa hadapan gunakan alat ini bukan sahaja untuk penggunaan.

Pengenalan

Untuk siaran ini, anda perlu memahami bahawa Pantheon memecahkan setiap tapak kepada tiga elemen: kod, pangkalan data dan fail.

Kod tersebut termasuk fail CMS seperti teras WordPress, pemalam dan tema. Fail ini diuruskan dalam Repositori Git, dihoskan oleh Pantheon, bermakna kita boleh menggunakan kod daripada GitLab ke Pantheon dengan Git.
Fail dalam Pantheon ialah fail media, iaitu imej untuk tapak. Biasanya mereka dimuat naik oleh pengguna dan Git mengabaikannya.

Buat akaun percuma, ketahui lebih lanjut tentang Aliran kerja Pantheon atau mendaftar untuk demo di pantheon.io.

Andaian

Projek saya di Pantheon dan GitLab dipanggil pantheon-gitlab-blog-demo. Nama projek mestilah unik. Di sini kami akan bekerja dengan tapak WordPress. Anda boleh mengambil Drupal, tetapi anda perlu mengubah beberapa perkara.

saya akan guna baris arahan Gitdan anda boleh bekerja antara muka grafik, jika anda mahu.

Buat projek

Mula-mula, mari buat Projek GitLab (kami akan kembali kepada perkara ini kemudian).

Sekarang mencipta laman web WordPress di Pantheon. Kemudian kami memasang WordPress untuk papan pemuka tapak.

Jika tangan anda gatal untuk menukar sesuatu, contohnya, alih keluar atau tambah pemalam, bersabarlah. Tapak ini belum disambungkan ke GitLab, dan kami mahu semua perubahan kod melalui GitLab.

Setelah kami memasang WordPress, kembali ke papan pemuka laman web Pantheon dan tukar mod pembangunan kepada Git.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Komit awal pada GitLab

Kini anda perlu memindahkan kod WordPress awal dari tapak Pantheon ke GitLab. Untuk melakukan ini, kami mengklonkan kod daripada repositori Git tapak Pantheon secara tempatan, dan kemudian menghantarnya ke repositori GitLab.

Untuk memudahkan dan selamat, tambah kunci SSH pada Pantheon dan kami tidak perlu memasukkan kata laluan setiap kali kami mengklon repositori Pantheon Git. Pada masa yang sama sudah tambah kunci SSH pada GitLab.

Untuk melakukan ini, klon tapak web Pantheon secara tempatan dengan menyalin arahan daripada medan Klon dengan Git pada papan pemuka tapak web.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress
Jika anda memerlukan bantuan, baca dokumentasi bermula dengan Git untuk Pantheon.

Sekarang mari kita berubah git remote originuntuk menunjuk ke GitLab dan bukannya Pantheon. Ia boleh dilakukan ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ git remote.

Mari pergi ke projek GitLab dan salin URL repositori daripada lungsur turun Klon pada halaman butiran projek. Mari pilih pilihan Klon dengan SSH, kerana kami telah mengkonfigurasi kunci SSH.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ git remote untuk salinan tempatan repositori kod - origin. Ini boleh diubah c git remote set-url origin [URL рСпозитория GitLab], di mana bukannya kurungan kita masukkan URL sebenar.

Akhirnya, kami melancarkan git push origin master --forceuntuk menolak kod WordPress dari Pantheon ke GitLab.

Pilihan –force hanya diperlukan sekali sahaja. Kemudian dalam pasukan git push ia tidak akan berada di GitLab.

Menyediakan bukti kelayakan dan pembolehubah

Ingat bagaimana kami menambah kunci SSH secara tempatan untuk log masuk ke Pantheon dan GitLab? Token SSH boleh digunakan untuk membenarkan GitLab dan Pantheon.

GitLab mempunyai dokumentasi yang sangat baik. Jom tengok bahagian pada kunci SSH apabila menggunakan pelaksana Docker dalam dokumen menggunakan kunci SSH dengan GitLab CI/CD.

Kami kini akan melengkapkan dua langkah pertama: Mari buat pasangan kunci SSH baharu secara tempatan dengan ssh-keygen dan tambah kunci persendirian sebagai pembolehubah kepada projek.

Kemudian kami akan bertanya SSH_PRIVATE_KEY sebagai Pembolehubah persekitaran CI/CD GitLab dalam tetapan projek.
Dalam langkah ketiga dan keempat kami akan membuat fail .gitlab-ci.yml dengan kandungan seperti ini:

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"

Mari kita tidak memasukkan fail lagi .gitlab-ci.yml, maka anda perlu menambah sesuatu yang lain padanya.

Sekarang kita melakukan langkah kelima dan tambahkan kunci awam yang anda buat dalam langkah pertama kepada perkhidmatan yang anda perlukan akses dalam persekitaran binaan.

Dalam kes kami, kami mahu mengakses Pantheon daripada GitLab. Kami mengikut arahan dalam dokumen Pantheon pada menambahkan kunci SSH pada Pantheon dan lakukan langkah ini.

Ingat: SSH peribadi berada dalam GitLab, SSH terbuka berada dalam Pantheon.

Mari kita sediakan beberapa lagi pembolehubah persekitaran. Yang pertama dipanggil PANTHEON_SITE. Nilainya ialah nama tapak Pantheon pada mesin anda.

Nama pada mesin disenaraikan di hujung Klon dengan arahan Git. Anda telah mengklon tapak secara tempatan, jadi ini akan menjadi nama direktori repositori tempatan.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Seterusnya, mari kita sediakan pembolehubah persekitaran PANTHEON_GIT_URL. Ini ialah URL repositori Git untuk tapak Pantheon yang telah kami gunakan.

Masukkan hanya URL repositori SSH, tanpa git clone dan nama tapak pada mesin di hujungnya.

Fuh. Itu sudah selesai, sekarang kita boleh menyelesaikan fail kita .gitlab-ci.yml.

Buat tugas penempatan

Perkara yang akan kami lakukan pada mulanya dengan GitLab CI adalah sangat serupa dengan apa yang kami lakukan dengan repositori Git pada masa lalu. Tetapi kali ini, mari tambah repositori Pantheon sebagai sumber Git jauh kedua, dan kemudian tolak kod dari GitLab ke Pantheon.

Untuk melakukan ini, mari konfigurasikan peringkat deploy ΠΈ tugas deploy:dev, kerana kami akan menggunakan persekitaran pembangunan di Pantheon. Fail yang terhasil .gitlab-ci.yml akan kelihatan seperti ini:

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

Pembolehubah SSH_PRIVATE_KEY, PANTHEON_SITE ΠΈ PANTHEON_GIT_URL sepatutnya kelihatan biasa - kami menyediakan pembolehubah persekitaran ini lebih awal. Dengan pembolehubah ini kita akan dapat menggunakan nilai dalam fail .gitlab-ci.yml banyak kali, dan mereka hanya perlu dikemas kini di satu tempat.

Akhir sekali, tambah, komit dan hantar fail .gitlab-ci.yml pada GitLab.

Menyemak penempatan

Jika kita melakukan semuanya dengan betul, tugas itu deploy:dev akan berjalan dengan jayanya dalam GitLab CI/CD dan menyerahkan komit .gitlab-ci.yml di Pantheon. Jom tengok.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Menghantar benang permintaan gabungan kepada Pantheon

Di sini kita akan menggunakan ciri Pantheon kegemaran saya βˆ’ multidev, di mana anda boleh mencipta persekitaran Pantheon tambahan untuk cawangan Git atas permintaan.

Akses kepada multidev adalah terhad, jadi bahagian ini boleh dilangkau. Tetapi jika anda mempunyai akses, anda boleh meningkatkan produktiviti secara serius dengan menyediakan penciptaan automatik persekitaran multidev pada Pantheon daripada permintaan gabungan GitLab.

Mula-mula mari buat cawangan Git baharu secara tempatan menggunakan git checkout -b multidev-support. Sekarang mari kita ubah sesuatu lagi .gitlab-ci.yml.

Saya suka memasukkan nombor permintaan gabungan dalam nama persekitaran Pantheon. Sebagai contoh, permintaan gabungan pertama ialah mr-1, kedua - mr-2 dan lain-lain.

Permintaan gabungan berubah, jadi kita perlu menentukan nama cawangan Pantheon secara dinamik. Ia mudah di GitLab - anda hanya perlu menggunakan pembolehubah persekitaran yang telah ditetapkan.

Kita boleh ambil $CI_MERGE_REQUEST_IIDuntuk menentukan nombor permintaan gabungan. Mari gunakan semua ini bersama-sama dengan pembolehubah persekitaran global yang kami tentukan sebelum ini dan tambahkan tugasan deploy:multidev baharu pada penghujung fail .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

Ia akan sama dengan tugas kita deploy:dev, hanya cawangan dihantar ke Pantheon, bukan ke master.

Kami telah menambah dan melaksanakan fail yang dikemas kini .gitlab-ci.yml, dan sekarang mari kita tolak cawangan baharu ke GitLab dengan git push -u origin multidev-support.

Sekarang mari kita buat permintaan gabungan baharu daripada cawangan multidev-supportdengan menekan Buat permintaan gabungan.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Setelah membuat permintaan gabungan, kami melihat bagaimana tugas CI/CD dilaksanakan deploy:multidev.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Lihat, urutan baharu telah dihantar ke Pantheon. Tetapi jika kita pergi ke bahagian multidev pada papan pemuka tapak Pantheon, kita tidak akan melihat persekitaran baharu di sana

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Mari lihat bahagian Cawangan Git.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Akibatnya, benang kami mr-1 sampai ke Pantheon. Mari kita cipta persekitaran daripada cawangan mr-1.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Kami telah mencipta persekitaran multidev, sekarang mari kita kembali ke GitLab dan lihat bahagian tersebut Operasi > Persekitaran. Kita akan lihat penyertaan untuk dev ΠΈ mr-1.

Ini kerana kami menambah entri environment Dengan nama name ΠΈ url ke dalam tugasan CI/CD. Jika kami mengklik pada ikon persekitaran terbuka, kami akan dibawa ke URL persekitaran multidev di Pantheon.

Automatikkan penciptaan multidev

Pada dasarnya, anda boleh berhenti di sini dan hanya ingat untuk mencipta persekitaran multidev untuk setiap permintaan gabungan, tetapi proses ini boleh diautomasikan.

Pantheon mempunyai alat baris arahan Terminus, di mana anda boleh bekerja dengan platform secara automatik. Terminus membolehkan anda mencipta persekitaran multidev daripada baris arahan - sesuai untuk GitLab CI.

Kami memerlukan permintaan gabungan baharu untuk menguji ini. Mari buat cawangan baharu menggunakan git checkout -b auto-multidev-creation.

Untuk menggunakan Terminus dalam tugas CI/CD GitLab, anda memerlukan token mesin untuk pengesahan dengan Terminus dan imej bekas dengan Terminus.

Mencipta Token Mesin Pantheon, simpannya di tempat yang selamat dan tambahkannya sebagai pembolehubah persekitaran global dalam GitLab dengan nama PANTHEON_MACHINE_TOKEN.

Jika anda terlupa cara menambah pembolehubah persekitaran GitLab, kembali ke tempat yang kami takrifkan PANTHEON_SITE.

Mencipta Dockerfile dengan Terminus

Jika anda tidak menggunakan Docker atau tidak menyukai fail Dockerfile, ambil gambar saya registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest dan langkau bahagian ini.

GitLab mempunyai pendaftaran kontena, di mana kami boleh membina dan meletakkan Dockerfile untuk projek kami. Mari cipta fail Docker dengan Terminus untuk berfungsi dengan Pantheon.

Terminus ialah alat baris arahan PHP, jadi mari kita mulakan dengan imej PHP. Saya sedang memasang Terminus melalui Composer, jadi saya akan gunakan imej rasmi Docker Composer. Kami cipta Dockerfile dalam direktori repositori tempatan dengan kandungan berikut:

# 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"

Ikut arahan untuk memasang dan menghantar imej dari bahagian Bina dan tolak imej Π² dokumentasi pendaftaran kontenauntuk mengumpul imej daripada Dockerfile dan tolaknya ke GitLab.

Buka bahagian pendaftaran dalam projek GitLab. Jika semuanya berjalan mengikut perancangan, imej kita akan berada di sana. Tulis pautan ke teg imej - kami memerlukannya untuk fail .gitlab-ci.yml.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Seksyen script dalam masalah deploy:multidev mula berkembang, jadi mari kita alihkannya ke fail yang berasingan. Buat fail baharu 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

Skrip berada dalam direktori peribadi dan tidak membenarkan akses web ke Pantheon. Kami mempunyai skrip untuk logik multidev kami. Sekarang mari kita mengemas kini bahagian deploy:multidev fail .gitlab-ci.ymlsehingga menjadi seperti ini:

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

Kita perlu memastikan bahawa tugas kita dilakukan dalam imej tersuai yang dibuat, jadi mari kita tambahkan definisi image daripada URL pendaftaran kepada .gitlab-ci.yml. Akibatnya, kami mendapat fail seperti ini .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

Tambah, komitmen dan hantar private/multidev-deploy.sh ΠΈ .gitlab-ci.yml. Sekarang kita kembali ke GitLab dan tunggu tugas CI/CD selesai. Bersabar: multidev boleh mengambil masa beberapa minit untuk dibuat.

Kemudian kita pergi melihat senarai multidev di Pantheon. Oh keajaiban! Persekitaran Multidev mr-2 sudah di sini.

Cara Menyambung GitLab dan Pantheon serta Mengoptimumkan Aliran Kerja Drupal dan WordPress

Kesimpulan

Pasukan saya berasa lebih seronok apabila kami mula membuka permintaan gabungan dan mencipta persekitaran secara automatik.

Dengan alatan GitLab dan Pantheon yang berkuasa, anda boleh menyambungkan GitLab ke Pantheon secara automatik.

Memandangkan kami menggunakan GitLab CI/CD, aliran kerja kami akan mempunyai ruang untuk berkembang. Berikut ialah beberapa idea untuk anda bermula:

Beritahu kami pendapat anda tentang GitLab, Pantheon dan automasi.

PS Tahukah anda bahawa Terminus, alat baris arahan Pantheon, boleh dilanjutkan melalui pemalam?

Kami di Pantheon telah melakukan kerja yang baik pada versi 2 kami pemalam untuk alat binaan Terminus dengan sokongan GitLab. Jika anda tidak mahu mengganggu tetapan untuk setiap projek, cuba pemalam ini dan bantu kami menguji v2 beta. Untuk pasukan Terminus build:project:create Anda hanya memerlukan token Pantheon dan token GitLab. Dia akan menggunakan salah satu projek sampel dengan Komposer dan ujian automatik, mencipta projek baharu dalam GitLab, tapak Pantheon baharu dan menyambungkannya menggunakan pembolehubah persekitaran dan kunci SSH.

Mengenai pengarang

Andrew Taylor mencipta alatan untuk pembangun dalam Pantheon.

Sumber: www.habr.com

Tambah komen