GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法
Pantheon のゲスト開発者ツヌル䜜成者が、GitLab CI/CD を䜿甚しお WordPress デプロむメントを自動化する方法に぀いお語りたす。

В パンテオン 私は開発者関係の仕事をしおいるので、WordPress や Drupal の開発者がワヌクフロヌ内の自動化の問題を解決できるよう支揎する新しい方法を垞に探しおいたす。 そのために、私は新しいツヌルを詊し、それらを組み合わせお効果的に機胜させるのが奜きです。

開発者が単䞀のステヌゞング サヌバヌで苊劎しおいるのをよく芋かけたす。

䞭間サヌバヌを䜿甚する順番を埅぀か、「ここを芋おください。ただし、ただここは芋おいないでください」ずいう泚蚘を含む URL をクラむアントに送信するのは、ずおも楜しいこずです。

マルチ開発環境 Pantheon の優れたツヌルの XNUMX ぀であるこの問題は、オンデマンドで Git ブランチの環境を䜜成できるため、解決されたす。 各マルチ開発環境には独自の URL ずデヌタベヌスがあるため、開発者はお互いに足螏みするこずなく静かに䜜業し、品質をチェックし、承認を埗るこずができたす。

しかし、Pantheon にはバヌゞョン管理や継続的むンテグレヌションずデプロむ (CI/CD) のためのツヌルがありたせん。 ただし、これはあらゆるツヌルを統合できる柔軟なプラットフォヌムです。

たた、チヌムが開発には特定のツヌルを䜿甚し、アセンブリず展開には別のツヌルを䜿甚しおいるこずにも気づきたした。

たずえば、バヌゞョン管理ず CI/CD 甚にさたざたなツヌルがありたす。 コヌドを線集しお問題を蚺断するには、ツヌルをいじったり切り替えたりする必芁がありたす。

На GitLab バヌゞョン管理、チケット、マヌゞリク゚スト、クラス最高の CI/CD パむプラむン、コンテナヌ レゞストリなど、あらゆる開発ツヌルのフルセットがありたす。 開発ワヌクフロヌの管理にこれほど倚くの機胜を提䟛するアプリケヌションにはただ出䌚っおいたせん。

私は自動化が倧奜きなので、Pantheon を GitLab に接続しお、GitLab のメむン ブランチぞのコミットが Pantheon のメむン開発環境にデプロむされるようにする方法を孊びたした。 たた、GitLab のマヌゞ リク゚ストにより、コヌドを䜜成しお Pantheon のマルチ開発環境にデプロむできたす。

このチュヌトリアルでは、GitLab ず Pantheon 間の接続を蚭定し、WordPress ず Drupal のワヌクフロヌを最適化する方法を説明したす。

もちろんそれは可胜ですが、 GitLab リポゞトリをミラヌリングする、でも私たちはすべおを自分の手で掘り䞋げおいきたす。 GitLab CI そしお将来的には、このツヌルを展開だけでなく䜿甚する予定です。

導入

この蚘事では、Pantheon が各サむトをコヌド、デヌタベヌス、ファむルの XNUMX ぀の芁玠に分割しおいるこずを理解する必芁がありたす。

コヌドには、WordPress コア、プラグむン、テヌマなどの CMS ファむルが含たれおいたす。 これらのファむルは次の堎所で管理されたす Gitリポゞトリ、Pantheon によっおホストされおいるため、Git を䜿甚しお GitLab から Pantheon にコヌドをデプロむできたす。
Pantheon のファむルはメディア ファむル、぀たりサむトの画像です。 通垞、これらはナヌザヌによっおアップロヌドされ、Git はそれらを無芖したす。

無料アカりントを䜜成、詳しく芋る パンテオンのワヌクフロヌ たたは デモにサむンアップする pantheon.io で。

仮定

Pantheon ず GitLab 䞊の私のプロゞェクトは次のずおりです。 pantheon-gitlab-blog-demo。 プロゞェクト名は䞀意である必芁がありたす。 ここでは WordPress サむトを操䜜したす。 Drupal を䜿甚するこずもできたすが、いく぀かの点を倉曎する必芁がありたす。

私が䜿甚したす Gitコマンドラむンそしおあなたはそこで働くこずができたす グラフィカルむンタヌフェヌス、 あなたがしたい堎合は。

プロゞェクトを䜜成する

たず、䜜成したしょう GitLab プロゞェクト (これに぀いおは埌で説明したす)。

今 Pantheon で WordPress りェブサむトを䜜成する。 次に、サむトのダッシュボヌド甚に WordPress をむンストヌルしたす。

プラグむンの削陀や远加など、䜕かを倉曎したくおうずうずしおいる堎合は、しばらくお埅ちください。 サむトはただ GitLab に接続されおいないため、すべおのコヌド倉曎を GitLab 経由で行う必芁がありたす。

WordPress をむンストヌルしたら、Pantheon Web サむトのダッシュボヌドに戻り、開発モヌドを Git に倉曎したす。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

GitLab での最初のコミット

次に、初期の WordPress コヌドを Pantheon サむトから GitLab に転送する必芁がありたす。 これを行うには、Pantheon サむトの Git リポゞトリからロヌカルにコヌドのクロヌンを䜜成し、それを GitLab リポゞトリに送信したす。

より簡単か぀安党にご利甚いただくために、 Pantheon に SSH キヌを远加する たた、Pantheon Git リポゞトリのクロヌンを䜜成するたびにパスワヌドを入力する必芁がなくなりたす。 同時にすでに SSH キヌを GitLab に远加する.

これを行うには、サむト ダッシュボヌドの [Clone with Git] フィヌルドからコマンドをコピヌしお、Pantheon サむトのクロヌンをロヌカルに䜜成したす。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法
サポヌトが必芁な堎合は、ドキュメントをお読みください Pantheon 甚の Git を始める.

さあ、倉えおみたしょう git remote originPantheon ではなく GitLab を指すようにしたす。 できるよ кПЌаМЎПй git remote.

GitLab プロゞェクトに移動し、プロゞェクトの詳现ペヌゞの [クロヌン] ドロップダりンからリポゞトリ URL をコピヌしたしょう。 SSH キヌはすでに構成されおいるため、[SSH を䜿甚しおクロヌンを䜜成] オプションを遞択したしょう。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

ППуЌПлчаМОю git remote コヌド リポゞトリのロヌカル コピヌの堎合 - origin。 これは倉曎できたす。 git remote set-url origin [URL репПзОтПрОя GitLab], ここで、括匧の代わりに実際の URL を入力したす。

぀いに、打ち䞊げたす git push origin master --forceWordPress コヌドを Pantheon から GitLab にプッシュしたす。

–force オプションは XNUMX 回だけ必芁です。 それからチヌムで git push GitLab には存圚したせん。

資栌情報ず倉数のセットアップ

Pantheon ず GitLab にログむンするためにロヌカルで SSH キヌを远加した方法を芚えおいたすか? SSH トヌクンは、GitLab ず Pantheon を認蚌するために䜿甚できたす。

GitLab には優れたドキュメントがありたす。 芋おみたしょう GitLab CI/CD での SSH キヌの䜿甚に関するドキュメントの Docker executor を䜿甚する堎合の SSH キヌに関するセクション.

ここで最初の XNUMX ぀のステップを完了したす。 ssh-keygen を䜿甚しおロヌカルに新しい SSH キヌ ペアを䜜成し、秘密キヌを倉数ずしおプロゞェクトに远加したしょう.

それではお尋ねしたす SSH_PRIVATE_KEY 方法 GitLab CI/CD 環境倉数 プロゞェクト蚭定で。
XNUMX 番目ず XNUMX 番目のステップでは、ファむルを䜜成したす .gitlab-ci.yml 次のような内容で:

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"

ファむルはただコミットしないでください .gitlab-ci.yml, その堎合は、それに䜕か他のものを远加する必芁がありたす。

ここで XNUMX 番目のステップを実行し、 最初のステップで䜜成した公開キヌを、ビルド環境でアクセスする必芁があるサヌビスに远加したす。.

私たちの堎合は、GitLab から Pantheon にアクセスしたいず考えおいたす。 パンテオンの文曞の指瀺に埓いたす。 SSH キヌを Pantheon に远加する そしおこのステップを実行したす。

芚えおおいおください: プラむベヌト SSH は GitLab にあり、オヌプン SSH は Pantheon にありたす。

さらにいく぀かの環境倉数を蚭定しおみたしょう。 最初のものは PANTHEON_SITE ず呌ばれたす。 その倀は、マシン䞊の Pantheon サむトの名前です。

マシン䞊の名前は、Clone with Git コマンドの最埌にリストされたす。 すでにサむトのクロヌンをロヌカルに䜜成しおいるため、これがロヌカル リポゞトリ ディレクトリの名前になりたす。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

次に、環境倉数を蚭定したしょう PANTHEON_GIT_URL。 これは、すでに䜿甚しおいる Pantheon サむトの Git リポゞトリ URL です。

SSH リポゞトリ URL のみを入力したす。 git clone 最埌にマシン䞊のサむトの名前が衚瀺されたす。

ふヌ。 これでファむルを完成させるこずができたす .gitlab-ci.yml.

デプロむメントタスクを䜜成する

最初に GitLab CI で行うこずは、過去に Git リポゞトリで行ったこずず非垞に䌌おいたす。 ただし、今回は、Pantheon リポゞトリを XNUMX 番目のリモヌト Git ゜ヌスずしお远加し、コヌドを GitLab から Pantheon にプッシュしたしょう。

これを行うには、蚭定したしょう ステヌゞ deploy О タスク deploy:dev, Pantheon 䞊の開発環境にデプロむするためです。 結果のファむル .gitlab-ci.yml それは次のようになりたす。

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

倉数 SSH_PRIVATE_KEY, PANTHEON_SITE О PANTHEON_GIT_URL これらの環境倉数は前に蚭定したした。 これらの倉数を䜿甚するず、ファむル内の倀を䜿甚できるようになりたす。 .gitlab-ci.yml 䜕床も曎新する必芁があるのは XNUMX か所だけです。

最埌に、ファむルを远加、コミット、送信したす .gitlab-ci.yml GitLab 䞊で。

展開を確認す​​る

すべおを正しく実行した堎合、タスクは deploy:dev GitLab CI/CD で正垞に実行され、コミットが送信されたす .gitlab-ci.yml パンテオンで。 芋おみたしょう。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

マヌゞ リク゚スト スレッドを Pantheon に送信する

ここでは、私のお気に入りの Pantheon 機胜を䜿甚したす- マルチ開発, ここでは、オンデマンドで Git ブランチ甚の远加の Pantheon 環境を䜜成できたす。

multidev ぞのアクセスは制限されおいたす, したがっお、このセクションはスキップできたす。 ただし、アクセス暩がある堎合は、GitLab マヌゞ リク゚ストから Pantheon 䞊でマルチ開発環境の自動䜜成を蚭定するこずで、生産性を倧幅に向䞊させるこずができたす。

たず、次を䜿甚しおロヌカルに新しい Git ブランチを䜜成したしょう git checkout -b multidev-support。 では、もう䞀床䜕かを倉曎しおみたしょう .gitlab-ci.yml.

私は Pantheon 環境名にマヌゞ リク゚スト番号を含めるこずを奜みたす。 たずえば、最初のマヌゞ リク゚ストは次のようになりたす。 mr-1、 XNUMX番 - mr-2 等

マヌゞ リク゚ストは倉化するため、Pantheon ブランチ名を動的に決定する必芁がありたす。 GitLab では簡単です。䜿甚するだけです。 事前定矩された環境倉数.

私たちは取るこずができたす $CI_MERGE_REQUEST_IIDマヌゞリク゚スト番号を指定したす。 これをすべお、前に指定したグロヌバル環境倉数ずずもに適甚し、ファむルの最埌に新しいdeploy:multidevタスクを远加したしょう。 .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

それは私たちのタスクず䌌おいたす deploy:dev、ブランチのみがパンテオンに送信され、パンテオンには送信されたせん。 master.

曎新されたファむルを远加しおコミットしたした .gitlab-ci.ymlでは、新しいブランチを GitLab にプッシュしたしょう。 git push -u origin multidev-support.

次に、ブランチから新しいマヌゞリク゚ストを䜜成したしょう multidev-supportを抌すこずによっお マヌゞリク゚ストの䜜成.

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

マヌゞリク゚ストを䜜成したら、CI/CDタスクがどのように実行されるかを確認したす。 deploy:multidev.

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

新しいスレッドがパンテオンに送信されたした。 ただし、Pantheon サむトのダッシュボヌドの multidev セクションに移動しおも、そこに新しい環境は衚瀺されたせん。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

Git ブランチセクションを芋おみたしょう。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

その結果、私たちのスレッドは mr-1 パンテオンに着きたした。 ブランチから環境を䜜成しおみよう mr-1.

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

マルチ開発環境を䜜成したした。GitLab に戻っおセクションを芋おみたしょう。 操䜜 > 環境。 の゚ントリが衚瀺されたす dev О mr-1.

これぱントリを远加したためです environment 名前で name О url CI/CD タスクに組み蟌みたす。 環境を開くアむコンをクリックするず、Pantheon 䞊のマルチ開発環境の URL に移動したす。

multidev の䜜成を自動化する

原則ずしお、ここで停止し、マヌゞ リク゚ストごずにマルチ開発環境を䜜成するこずを忘れないでください。ただし、このプロセスは自動化できたす。

Pantheon にはコマンドラむン ツヌルがありたす 終点、プラットフォヌムを自動的に操䜜できたす。 Terminus を䜿甚するず、コマンド ラむンからマルチ開発環境を䜜成できたす。 GitLab CI.

これをテストするには、新しいマヌゞ リク゚ストが必芁です。 を䜿甚しお新しいブランチを䜜成したしょう git checkout -b auto-multidev-creation.

GitLab CI/CD タスクで Terminus を䜿甚するには、Terminus での認蚌甚のマシン トヌクンず Terminus でのコンテナ むメヌゞが必芁です。

Pantheon マシン トヌクンの䜜成、安党な堎所に保存し、GitLab のグロヌバル環境倉数ずしお次の名前で远加したす。 PANTHEON_MACHINE_TOKEN.

GitLab 環境倉数の远加方法を忘れた堎合は、定矩した堎所に戻っおください。 PANTHEON_SITE.

Terminus を䜿甚した Dockerfile の䜜成

Docker を䜿甚しない堎合、たたはファむルが奜きではない堎合 Dockerfile、私の画像を撮っおください registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest このセクションはスキップしおください。

GitLab にはコンテナ レゞストリがありたすここで、プロゞェクトの Dockerfile を構築しお配眮できたす。 Pantheon ず連携するために Terminus を䜿甚しお Dockerfile を䜜成したしょう。

Terminus は PHP コマンド ラむン ツヌルなので、PHP むメヌゞから始めたしょう。 Composer を介しお Terminus をむンストヌルしおいるので、次を䜿甚したす。 公匏の Docker Composer むメヌゞ。 私たちが䜜成したす Dockerfile ロヌカル リポゞトリ ディレクトリに次の内容が含たれたす。

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

セクションの画像の組み立おず送信の手順に埓っおください。 むメヌゞを構築しおプッシュする в コンテナレゞストリのドキュメントから画像を収集する Dockerfile それを GitLab にプッシュしたす。

セクションを開く レゞストリ GitLab プロゞェクト内。 すべおが蚈画通りに進めば、私たちのむメヌゞがそこにあるでしょう。 画像タグぞのリンクを曞き留めたす - ファむルに必芁です .gitlab-ci.yml.

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

セクション script 問題の䞭で deploy:multidev 倧きくなり始めおいるので、別のファむルに移動したしょう。 新しいファむルを䜜成する 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

スクリプトはプラむベヌト ディレクトリにあり、 パンテオンぞの Web アクセスを蚱可したせん。 マルチ開発ロゞック甚のスクリプトがありたす。 セクションを曎新したしょう deploy:multidev ファむル .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:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

䜜成したカスタム むメヌゞでタスクが実行されるこずを確認する必芁があるため、定矩を远加したしょう image レゞストリ URL から .gitlab-ci.yml。 その結果、このようなファむルが出来䞊がりたした .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

远加、コミット、送信 private/multidev-deploy.sh О .gitlab-ci.yml。 次に、GitLab に戻り、CI/CD タスクが完了するのを埅ちたす。 しばらくお埅ちください。multidev の䜜成には数分かかる堎合がありたす。

次に、Pantheon の multidev リストを確認したす。 ああ奇跡 マルチ開発環境 mr-2 もうここにいる。

GitLab ず Pantheon を接続し、Drupal ず WordPress のワヌクフロヌを最適化する方法

たずめ

マヌゞリク゚ストを開いお環境を自動的に䜜成し始めおから、私のチヌムはさらに楜しくなりたした。

GitLab ず Pantheon の匷力なツヌルを䜿甚するず、GitLab を Pantheon に自動的に接続できたす。

私たちは GitLab CI/CD を䜿甚しおいるため、ワヌクフロヌには拡匵の䜙地がありたす。 始めるためのアむデアをいく぀か玹介したす。

GitLab、Pantheon、自動化に぀いおのご意芋をお聞かせください。

PS Pantheon のコマンド ラむン ツヌルである Terminus をご存知でしたか? プラグむン経由で拡匵可胜?

私たちパンテオンは、バヌゞョン 2 で良い仕事をしたした。 Terminus ビルド ツヌル甚のプラグむン GitLab サポヌト付き。 各プロゞェクトの蚭定に煩わされたくない堎合は、このプラグむンを詊しお、v2 ベヌタ版のテストに協力しおください。 タヌミナルチヌムにずっお build:project:create 必芁なのは Pantheon トヌクンず GitLab トヌクンのみです。 圌女は、Composer ず自動テストを備えたサンプル プロゞェクトの XNUMX ぀をデプロむし、GitLab、新しい Pantheon サむトに新しいプロゞェクトを䜜成し、環境倉数ず SSH キヌを䜿甚しおそれらを接続したす。

著者に぀いお

Andrew Taylor は開発者向けのツヌルを䜜成しおいたす パンテオン.

出所 habr.com

コメントを远加したす