docker-composeおよびGitLab CIを䜿甚したSymfonyアプリケヌションの継続的な統合/展開

この蚘事では、Symfonyアプリケヌションの開発プロセス党䜓を、むンフラストラクチャのセットアップから実皌働環境ぞのデプロむたでれロから自動化した経隓を共有したす。 開発環境から実皌働環境たで、docker-composeを䜿甚しおアプリケヌションを起動し、すべおの継続的な統合/展開手順は、DockerコンテナのGitLab CI / CDパむプラむンを通じお起動したす。


dockerおよびdocker-composeに粟通しおいるこずが理解されたす。 そうでない堎合、たたはむンストヌル方法がわからない堎合は、 ロヌカル開発者環境を準備する手順を準備したした 。 実際、アプリケヌションで䜜業するために必芁なのは、Docker、VirtualBox、およびオプションでYarnのみです。


アプリケヌションをロヌカルで実行する


アプリケヌションのスケルトンを準備し、 GitHubに投皿したした 。 以䞋に曞かれおいるすべおは、このテンプレヌトに基づいお䜜成されたアプリケヌションず、そのようなアプリケヌションを実行するために必芁なむンフラストラクチャに適甚されたす。


アプリケヌションをロヌカルで実行するには、次のコマンドを実行する必芁がありたす。


git clone git@github.com:covex-nn/docker-workflow-symfony.git cd docker-workflow-symfony docker-compose up -d docker-compose exec php phing 

このサむトはhttp//docker.local/で利甚できたす。アドレスにapp_dev.php/を远加する必芁はありたせん。 4぀のコンテナが起動されたす nginx 、 php 、 mysqlおよびphpmyadmin 埌者は開発環境でのみ起動されたす。


docker.local hosts登録する必芁がありhosts 。 Linuxの堎合、サむトのIPアドレスは127.0.0.1になりたすが、Windowsでは、 docker-machine env結果ずしお芋぀けるこずができたすすべお同じ手順を参照しおください 。


phpコンテナヌのcomposerは、 vendorフォルダヌがホストではなくコンテナヌ内に配眮されるように構成されおおり、ロヌカル開発者環境のパフォヌマンスに圱響を䞎えたせん。


むンフラストラクチャの準備ず構成


戊闘状態では、システムには3぀のサヌバヌが必芁になりたす GitLab -Gitおよびコンテナレゞストリリポゞトリを管理するためのサヌバヌ、 GitLab甚のGitLab本番サむト甚のサヌバヌ、およびDocker 甚のGitLab本番前およびテスト開発者甚サむトのサヌバヌ。


Gitlab

GitLabおよびContainer Registryを䜿甚したサヌバヌのセットアップ


GitLabおよびContainer Registryのむンストヌル手順は、gitlab.comで入手できたす。


デフォルトでは、GitLab Container RegistryにはSSL蚌明曞の構成が必芁です。 Container RegistryずGitLab Webむンタヌフェヌスの䞡方に同じ蚌明曞を䜿甚したす。 LetsEncryptサヌビスを䜿甚しおSSL蚌明曞を䜜成できたす。


/etc/gitlab/gitlab.rbファむルでSSL蚌明曞を有効にできたす。 たた、蚌明曞を自動的に曎新する機胜を構成する必芁がありたす。


 nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.site.ru/fullchain.pem" nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.site.ru/privkey.pem" registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.site.ru/fullchain.pem" registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.site.ru/privkey.pem" nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { \n allow all;\n alias /var/lib/letsencrypt/.well-known/;\n default_type \"text/plain\";\n try_files $uri =404;\n }\n" 

gitlab.rbファむルを倉曎しgitlab.rb 、 gitlab-ctl restartを䜿甚しおgitlab-ctl restart 、 crontabを構成しお蚌明曞を曎新する必芁がありたす。


 41 0 * * * /root/certbot-auto renew --no-self-upgrade --webroot -w /var/lib/letsencrypt --renew-hook "service nginx reload" 

本番甚のDocker

本番甚のDockerを䜿甚したサヌバヌの構成


Dockerのむンストヌル手順はdocs.docker.comで入手できたす。


さらに、ロヌカルネットワヌクを䜜成しお、コンテナの内郚IPアドレスを割り圓おる必芁がありたす。


 docker network create graynetwork --gateway 192.168.10.1 --subnet 192.168.10.0/24 

Dockerに加えお、 サヌバヌ䞊のLetsEncryptからnginxずcertbot-autoをむンストヌルする必芁がありたす 。


Nginxは、リク゚ストをDockerコンテナ内のWebサヌバヌにプロキシしたす。 Nginxのむンストヌル手順は、 nginx.orgにありたす。


GitLabを備えたサヌバヌず同様に、将来のSSL蚌明曞の曎新はすぐに構成する必芁がありたす。


 41 0 * * * /root/certbot-auto renew --no-self-upgrade --webroot -w /var/lib/letsencrypt --renew-hook "service nginx reload" 

開発甚のDocker

開発甚のDockerを䜿甚したサヌバヌのセットアップ


Docker productionのDocker productionすべおのむンストヌルポむントを完了する必芁があり、サヌバヌに加えおGitLab CI Runnerをむンストヌルする必芁がありたす。


GitLab CI RunnerむンストヌルGitLab CI Runnerは、 docs.gitlab.comで入手できたす。


GitLab Runnerの実行


 gitlab-ci-multi-runner verify --delete printf "concurrent = 10\ncheck_interval = 0\n\n" > /etc/gitlab-runner/config.toml gitlab-ci-multi-runner register -n \ --url https://gitlab-server.ru/ \ --registration-token <token> \ --tag-list "executor-docker,docker-in-docker" \ --executor docker \ --description "docker-dev" \ --docker-image "docker:latest" \ --docker-volumes "/composer/home/cache" \ --docker-volumes "/root/.composer/cache" \ --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" 

<token>は、 Admin Area --> RunnersセクションのGitLab Webむンタヌフェむスからコピヌする必芁がありたす。


䜕人かの開発者がプロ​​ゞェクトに取り組みたす。䜕も壊したり互いに干枉したりしないように、アクセスを蚱可する必芁がありたす。


アクセス蚭定

マスタヌナヌザヌの䜜成


  • Docker productionのDocker productionサヌバヌDocker production 、 masterナヌザヌを䜜成し、グルヌプにdockerを远加したす。


     adduser master usermod -aG docker master 

  • 次に、新しいナヌザヌずしおログむンし、パスフレヌズなしでid_rsaキヌを䜜成する必芁がありたす。


     ssh-keygen -t rsa -b 4096 -C "master@docker-server-prod.ru" cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

    このキヌは、サヌバヌぞのSSHアクセスおよび開発者のgitリポゞトリぞのアクセスに䜿甚されたす。


  • GitLabで、ナヌザヌmasterを䜜成し、それにSSHキヌを远加したす。 このナヌザヌは玔粋に技術的なものです。 将来的には、その䞋に行っお操䜜を実行する必芁はありたせん。

開発者ナヌザヌの䜜成


  • Docker サヌバヌでDocker ために、ナヌザヌdev1を䜜成する必芁がありたす名前は䜕でもdev1ん


     adduser dev1 usermod -aG docker dev1 

  • 次に、新しいナヌザヌずしおログむンし、パスフレヌズなしでid_rsaキヌを䜜成する必芁がありたす。


     ssh-keygen -t rsa -b 4096 -C "dev1@docker-server-dev.ru" cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 400 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys 

    このキヌはサヌバヌぞのSSHアクセスに䜿甚され、開発者には知られおいたせん。


  • GitLabでナヌザヌdev1䜜成し、ナヌザヌが自分のリポゞトリずグルヌプを䜜成できないようにしたす。 SSHキヌを蚭定する必芁はありたせん-開発者が自分で蚭定したす。


  • GitLabで、 dev1-projectsグルヌプを䜜成し、 Masterロヌルを持぀Masterをナヌザヌグルヌプに远加したす。 このグルヌプには、この開発者のすべおのリポゞトリが含たれたす。

プロゞェクトには、開発者ごずに1぀のメむンリポゞトリず1぀のリポゞトリがありたす。 メむンリポゞトリは、本番およびステヌゞングサむトの゜ヌス、この特定の開発者のテストサむトの開発者リポゞトリになりたす。 各サむトの展開プロセスは䞀臎したす。 違いは、Dockerでのアプリケヌション構成ずサヌバヌアクセス蚭定のみです。 構成ず蚭定は、 GitLabのSettings -- CI/CD PipelinesセクションGitLab Settings -- CI/CD Pipelines 䞻にGitLabサむトずステヌゞングサむトのリポゞトリ、およびこの開発者のテストサむトの開発者のリポゞトリに保存されたす。


メむンリポゞトリを䜜成しお構成する

メむンプロゞェクトリポゞトリは、任意のグルヌプに配眮できたす。


Settings --> Pipelinesセクションで、 Settings --> PipelinesのGit strategy for pipelinesずしおgit cloneを遞択し、倉数を远加したす。


可倉䟡倀
COMPOSER_GITHUB_TOKENhttps://github.com/settings/tokensでトヌクンを䜜成したす
SSH_PRIVATE_KEYナヌザヌmaster id_rsaファむルの内容を入力したす
NETWORK_NAME_MASTERグレヌネットワヌク
SERVER_NAME_MASTERsite-staging.ru
NETWORK_IP_MASTERグレヌネットワヌクサブネット䞊の無料のIPを遞択したす
NETWORK_NAME_PRODUCTIONグレヌネットワヌク
SERVER_NAME_PRODUCTIONsite-production.ru
NETWORK_IP_PRODUCTIONグレヌネットワヌクサブネット䞊の無料のIPを遞択したす
DEPLOY_USER_MASTERマスタヌ
DEPLOY_HOST_MASTERdocker-server-prod.ru
DEPLOY_DIRECTORY_MASTER/home/master/site-staging.ru
DEPLOY_USER_PRODUCTIONマスタヌ
DEPLOY_HOST_PRODUCTIONdocker-server-prod.ru
DEPLOY_DIRECTORY_PRODUCTION/home/master/site-production.ru
PROJECT_FORKS<空癜のたた>

アプリケヌションスケルトンをステヌゞングにデプロむするには、 git push origin masterを䜿甚しおmasterブランチをリポゞトリにアップロヌドする必芁がありたす。


開発者リポゞトリを䜜成しお構成する

開発者リポゞトリは、開発者プロゞェクトグルヌプに属しおいる必芁がありたす ナヌザヌdev1堎合、これはdev1-projectsです。 開発者リポゞトリは、メむンリポゞトリからFork 管理者を䜜成するこずで䜜成されたす。 これは重芁です。


  • フォヌクの䜜成に加えお、メむンの開発者リポゞトリからマヌゞリク゚ストを䜜成できたす。
  • たた、システムの安定性を確保し、id_rsaにサヌバヌにアクセスするための秘密鍵を保持するには、管理者によるフォヌクの䜜成が必芁です。

Settings --> Pipelinesセクションで、 Settings --> PipelinesのGit strategy for pipelinesずしお[ git cloneを遞択し、 Public pipelinesを非衚瀺にしお倉数を远加したす。


可倉䟡倀
COMPOSER_GITHUB_TOKENhttps://github.com/settings/tokensでトヌクンを䜜成したす
SSH_PRIVATE_KEYナヌザヌdev1 id_rsaファむルの内容を入力したす
NETWORK_NAME_MASTERグレヌネットワヌク
SERVER_NAME_MASTERsite-dev1.ru
NETWORK_IP_MASTERグレヌネットワヌクサブネット䞊の無料のIPを遞択したす
DEPLOY_USER_MASTER開発者
DEPLOY_HOST_MASTERdocker-server-dev.ru
DEPLOY_DIRECTORY_MASTER/home/dev1/site-dev1.ru
PROJECT_FORKS<空癜のたた>

テストサむトに展開する前に、 masterブランチず同じコミットを指すstableブランチを䜜成する必芁がありたす。 stableブランチはステヌゞングサむトの状態に察応し、怜蚌され受け入れられたコヌドのみがこのブランチに含たれたす。


その過皋で、開発者は䞀方で、コミットを結合し、 git push -f origin master介しお履歎を曞き換えるこずができるはずです。 䞀方、システムの残りの郚分を混乱させないように、 stableブランチをシフトしおタグを䜜成するこずはできたせん。


これを行うには、 Settings --> Repositoryセクションで、 masterブランチから保護を削陀し、 stableブランチずすべおのタグを保護する必芁がありたす。


開発者のテストサむトにアプリケヌションをデプロむするには、 masterブランチに察しおPipelineを実行する必芁がありたす。 その埌、 Settings --> Members dev1で、 Developerロヌルをナヌザヌdev1に付䞎する必芁がありたす。


最埌に、メむンリポゞトリを構成する必芁がありたす。 開発者リポゞトリのアドレスを含む行をPROJECT_FORKS倉数に远加しお、新しいリポゞトリのstableブランチを同期する必芁がありたす。 そしお、メむンリポゞトリのナヌザヌdev1にReporterロヌルを䞎えたす。


䜜業を開始する前の最埌の手順は、Dockerを䜿甚しおサヌバヌでNginxを構成するこずです。 このNginxは手動で蚭定され、SymfonyアプリケヌションぞのすべおのHTTP / HTTPSリク゚ストは、以前に䜜成されたDockerサブネットで遞択されたIPアドレスにプロキシされたす NETWORK_NAME_...およびNETWORK_IP_...倉数を参照。


倖郚Nginxを構成する

構成ファむルの䜜成


site-dev1.ruドメむンの構成䟋。 ここで、 192.168.10.10は、 dev1開発者リポゞトリ蚭定のNETWORK_IP_MASTER倉数の内容です。


 server { listen 80; # listen 443 ssl; server_name site-dev1.ru; # ssl_certificate /etc/letsencrypt/live/site-dev1.ru/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/site-dev1.ru/privkey.pem; # if ($ssl_protocol = "") { # rewrite ^/(.*) https://$server_name/$1 permanent; # } location / { proxy_pass http://192.168.10.10; include proxy_params; } location ~ /.well-known { allow all; alias /var/lib/letsencrypt/.well-known; } } 

SSL蚌明曞を䜜成する


 /root/certbot-auto certonly \ --no-self-upgrade \ --webroot \ -d site-dev1.ru \ -w /var/lib/letsencrypt 

サむトをHTTPからHTTPSに切り替えるには、HTTPドメむン構成の行のコメントを解陀しお、Nginxを再起動したす。


 nginx -t service nginx reload 

開発プロセス


この段階で、開発者は自分のリポゞトリにアクセスできたす。 圌のリポゞトリでは、圌はDeveloperの圹割を持ち、ほずんど䜕でもできたす。 開発者のリポゞトリでは、 masterブランチはテストサむトの状態に察応しおいたす。 stableブランチはstagingサむトずしおstableれおいたす。


開発者にずっお開発プロセスはどのように芋えるか

新しいタスクはそれぞれ、 stableブランチず同じコミットを指すタスクブランチを䜜成するこずから始めたす。


 git fetch --all --prune git checkout origin/stable git checkout -b feature-qwerty git push origin feature-qwerty 

その埌、ある段階で、テストサむトに倉曎を投皿する必芁がある堎合、 masterブランチのリポゞトリに倉曎をアップロヌドできたす。倉曎は2〜5分以内に投皿されたす。


開発者リポゞトリからメむンリポゞトリぞの倉曎のマヌゞは、GitLab Webむンタヌフェむスで察応するマヌゞリク゚ストを䜜成しお、タスクブランチ䟋ではfeature-qwerty qwertyからメむンリポゞトリのmasterブランチにマヌゞする必芁がありたす。


管理者は、マヌゞリク゚ストを受け入れる前に、開発者のブランチでのコミットがメむンリポゞトリのmasterブランチの珟圚の䜍眮に厳密に远随するこずを確認する必芁がありたす。 これはGitLab CEで自動的に行うこずはできたせん;この機胜はGitLab EEでのみ利甚可胜です。


倉曎を䜜業サむトにロヌルアりトするには、GitLab Webむンタヌフェヌスでrelease-...タグを䜜成する必芁がありたす。


開発者は、プロゞェクトコヌドの倉曎ずずもに、新しい倀をアプリケヌションパラメヌタに远加できたす。 これらのパラメヌタヌの倀は、環境によっお異なる堎合がありたす。


Symfony蚭定を構成する

ロヌカル開発者環境


デフォルトの構成は、プロゞェクトのルヌトにある.envファむルに保存されたす。 このファむルはすべおの開発者向けのファむルであり、リポゞトリの䞀郚です。


 ENV_hwi_facebook_client_id=1234 ENV_hwi_facebook_client_secret=4567 

docker-compose up -d起動されるず、ファむルがロヌドされ、倀はphpサヌビスの説明のenvironmentブロックを介しおコンテナヌに入りたす。


 services: php: environment: ENV_hwi_facebook_client_id: "${ENV_hwi_facebook_client_id}" ENV_hwi_facebook_client_secret: "${ENV_hwi_facebook_client_secret}" 

Symfony内では、これらの倀はapp/config/parameters.ymlファむルを介しお取埗されたすこれもアプリケヌションの䞀郚です。


 parameters: hwi_facebook_client_id: "%env(ENV_hwi_facebook_client_id)%" env(ENV_hwi_facebook_client_id): ~ hwi_facebook_client_secret: "%env(ENV_hwi_facebook_client_secret)" env(ENV_hwi_facebook_client_secret): ~ 

新しいパラメヌタヌを実装するには、 docker-composeを再起動する必芁がありたす。


 docker-compose stop docker-compose up -d 

開発者テストサむト


開発者のテストサむトに倉曎を展開する前に、管理者はSettings --> Pipelinesセクションでこのサむトの倉数倀を远加する必芁がありたす。 接尟蟞_MASTER倉数名に远加する必芁がありたす


 ENV_hwi_facebook_client_id_MASTER ENV_hwi_facebook_client_secret_MASTER 

倉数が䜜成されない堎合、それらの倀は.envファむルから.envたす。


ステヌゞング


マヌゞリク゚ストを受け入れる前に、メむンリポゞトリは、開発者のテストサむトで行われたように、接尟蟞_MASTER倉数を远加したす。


マヌゞリク゚ストを受け入れ、 stagingの倉曎を実装した埌、他のすべおの開発者リポゞトリに倉数を远加する必芁がありたす。


生産


ステヌゞングで行われたように、接尟蟞が_PRODUCTION倉数をメむンリポゞトリに远加する必芁がありたす。


開発者は開発環境でxdebug拡匵機胜も利甚でき、CSSファむルずJavascriptファむルはWebpack Encoreを䜿甚しお管理されたす。


内郚CI / CD


継続的むンテグレヌション/実装のプロセスは、リポゞトリのルヌトにある.gitlab-ci.ymlファむルに蚘述されおおり、䟝存関係のロヌド、phpunitテスト、アセンブリ、デプロむメントの4぀のステヌゞで構成されおいたす。


䟝存関係の読み蟌み


この段階で、 composer䜿甚しおすべおのアプリケヌションの䟝存関係をむンストヌルしようずしたす。


.gitlab-ci.ymlのDEPSステヌゞ
 deps:php-composer: stage: deps image: covex/php7.1-fpm:1.0 script: - echo '{"github-oauth":{"github.com":"'"$COMPOSER_GITHUB_TOKEN"'"}}' > ./auth.json - composer install --prefer-dist --no-scripts --no-autoloader --no-interaction tags: - executor-docker 

この段階の結果は、フォルダヌ/composer/home/cacheいっぱいにしたす。 このフォルダヌはgitlab-ci-multi-runner volumeに保存され、コンポヌザヌキャッシュはすべおの埌続のタスク珟圚のパむプラむンず埌続のパむプラむンの䞡方で䜿甚できたす。


PHPUnitテスト


phpunit起動する前に、Symfonyアプリケヌションが機胜するための環境倉数が䜜成されたす。 テスト環境の倉数の倀の䞀郚が他のすべおの環境の倀ず異なる堎合は、GitLabリポゞトリの蚭定にそのような倉数を接尟蟞_TEST䜜成する必芁がありたすたずえば、 ENV_hwi_facebook_client_id_TEST 。 次に、その倀は.envファむルのデフォルトを.envたす。


.gitlab-ci.ymlのテストステップ
 .template-suffix-vars: &suffix-vars before_script: - cat .env | grep ENV_ > .build-env - sed -i 's/^/export /' .build-env - for name in `env | awk -F= '{if($1 ~ /'"$ENV_SUFFIX"'$/) print $1}'`; do echo 'export '`echo $name|awk -F''"$ENV_SUFFIX"'$' '{print $1}'`'='`printenv $name`'' >> .build-env; done test:phpunit: stage: test image: covex/php7.1-fpm:1.0 <<: *suffix-vars variables: ENV_SUFFIX: "_TEST" script: - eval $(cat .build-env) - echo '{"github-oauth":{"github.com":"'"$COMPOSER_GITHUB_TOKEN"'"}}' > ./auth.json - composer require phpunit/phpunit:* --dev - phpunit dependencies: [] tags: - executor-docker 

組立


ここで、 phpプロゞェクトのアセンブリは、 nginxおよびphpコンテナヌのdockerむメヌゞを䜜成し、準備されたむメヌゞをGitLab Container Registryにレむアりトしたす。


.gitlab-ci.ymlのビルドフェヌズ
 .template-docker-nginx-image: &docker-nginx-image stage: build image: docker:latest <<: *suffix-vars script: - eval $(cat .build-env) - docker build --tag $CI_NGINX_IMAGE_WITH_TAG --build-arg server_name=$SERVER_NAME --build-arg server_upstream=prod --build-arg app_php=app ./docker/nginx - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker push $CI_NGINX_IMAGE_WITH_TAG - docker logout $CI_REGISTRY tags: - executor-docker - docker-in-docker .template-docker-app-image: &docker-app-image stage: build image: docker:latest <<: *suffix-vars script: - eval $(cat .build-env) - echo '{"github-oauth":{"github.com":"'"$COMPOSER_GITHUB_TOKEN"'"}}' > ./auth.json - docker build --tag $CI_APP_IMAGE_WITH_TAG . - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker push $CI_APP_IMAGE_WITH_TAG - docker logout $CI_REGISTRY dependencies: - deps:php-composer tags: - executor-docker - docker-in-docker .template-docker-compose: &docker-compose stage: build image: covex/docker-compose:1.0 <<: *suffix-vars script: - eval $(cat .build-env) - mkdir build - docker-compose -f docker-compose-deploy.yml config > build/docker-compose.yml - sed -i 's/\/builds\/'"$CI_PROJECT_NAMESPACE"'\/'"$CI_PROJECT_NAME"'/\./g' build/docker-compose.yml artifacts: untracked: true name: "$CI_COMMIT_REF_NAME" paths: - build/ tags: - executor-docker dependencies: [] build:docker-nginx-image-master: <<: *docker-nginx-image variables: ENV_SUFFIX: "_MASTER" only: - master except: - tags build:docker-nginx-image-production: <<: *docker-nginx-image variables: ENV_SUFFIX: "_PRODUCTION" only: - /^release-.*$/ except: - branches build:docker-app-image-master: <<: *docker-app-image variables: ENV_SUFFIX: "_MASTER" only: - master except: - tags build:docker-app-image-production: <<: *docker-app-image variables: ENV_SUFFIX: "_PRODUCTION" only: - /^release-.*$/ except: - branches build:docker-compose-master: <<: *docker-compose variables: ENV_SUFFIX: "_MASTER" only: - master except: - tags build:docker-compose-production: <<: *docker-compose variables: ENV_SUFFIX: "_PRODUCTION" only: - /^release-.*$/ except: - branches 

ここで、 build:docker-app-image-masterタスクbuild:docker-app-image-masterは、ステヌゞングサむトおよび開発者のテストサむトのPHPアプリケヌションのむメヌゞを䜜成したす。 そしおbuild:docker-app-image-productionタスクbuild:docker-app-image-productionは本番サむト甚です。 タスクごずに、接尟蟞が_MASTERたたは_PRODUCTIONであるパむプラむン蚭定の倉数の倀は、 .envファむルのデフォルト倀ず重耇したす。 nginxむメヌゞをアセンブルするためのタスクは、同様の方法で説明されおいたすタスクbuild:docker-nginx-image-masterおよびbuild:docker-nginx-image-production参照。


たた、この段階でdocker-compose.ymlファむルが䜜成され、次の段階でリモヌトサヌバヌにコピヌされたす build:docker-compose-masterおよびbuild:docker-compose-productionのタスクbuild:docker-compose-master参照。 生成されたdocker-compose.ymlは、アプリケヌションの起動に必芁なすべおの環境倉数が含たれおいたす。 servicesセクションでは、すべおのコンテナは既補のdockerむメヌゞからのみ䜜成されたす。


生成されたdocker-compose.ymlファむルの䟋
 networks: nw_external: external: name: graynetwork nw_internal: {} services: mysql: environment: MYSQL_DATABASE: project MYSQL_PASSWORD: project MYSQL_ROOT_PASSWORD: root MYSQL_USER: project expose: - '3306' image: covex/mysql:5.7 networks: nw_internal: null restart: always volumes: - database:/var/lib/mysql:rw nginx: depends_on: mysql: condition: service_healthy image: gitlab.site.ru:5005/dev1-projects/symfony-workflow2/nginx:master networks: nw_external: ipv4_address: 192.168.10.13 nw_internal: null ports: - 80/tcp restart: always volumes: - assets:/srv/a:ro - assets:/srv/b:ro - assets:/srv/storage:ro php: environment: ENV_database_host: mysql ENV_database_mysql_version: '5.7' ENV_database_name: project ENV_database_password: project ENV_database_port: '3306' ENV_database_user: project ENV_mailer_from: andrey@mindubaev.ru ENV_mailer_host: 127.0.0.1 ENV_mailer_password: 'null' ENV_mailer_transport: smtp ENV_mailer_user: 'null' ENV_secret: ThisTokenIsNotSoSecretChangeIt image: gitlab.site.ru:5005/dev1-projects/symfony-workflow2:master networks: nw_internal: null restart: always volumes: - assets:/srv/a:rw - assets:/srv/b:rw - assets:/srv/storage:rw spare: environment: ENV_database_host: mysql ENV_database_mysql_version: '5.7' ENV_database_name: project ENV_database_password: project ENV_database_port: '3306' ENV_database_user: project ENV_mailer_from: andrey@mindubaev.ru ENV_mailer_host: 127.0.0.1 ENV_mailer_password: 'null' ENV_mailer_transport: smtp ENV_mailer_user: 'null' ENV_secret: ThisTokenIsNotSoSecretChangeIt image: gitlab.site.ru:5005/dev1-projects/symfony-workflow2:master networks: nw_internal: null restart: always volumes: - assets:/srv/a:rw - assets:/srv/b:rw - assets:/srv/storage:rw version: '2.1' volumes: assets: {} database: {} 

展開


この時点で、アプリケヌションのdockerむメヌゞの準備が敎い、Container Registryにアップロヌドされたす。 アプリケヌションの曎新は残りたす。


リモヌトサヌバヌにはphpmyadminサヌビスがありたせん。 phpサヌビスに加えお、たったく同じspareサヌビスが远加されたした。 たた、 nginx構成では、1぀のサヌバヌの代わりに、 upstream 2぀が登録されたす。 2぀の同䞀のサヌビスを䜿甚するず、 展開のダりンタむムをほがれロにできたす 。


.gitlab-ci.ymlのデプロむステヌゞ
 .template-secure-copy: &secure-copy stage: deploy image: covex/alpine-git:1.0 before_script: - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") script: - eval $(cat .build-env) - ssh -p 22 $DEPLOY_USER@$DEPLOY_HOST 'set -e ; rm -rf '"$DEPLOY_DIRECTORY"'_tmp ; mkdir -p '"$DEPLOY_DIRECTORY"'_tmp' - scp -P 22 -r build/* ''"$DEPLOY_USER"'@'"$DEPLOY_HOST"':'"$DEPLOY_DIRECTORY"'_tmp' - ssh -p 22 $DEPLOY_USER@$DEPLOY_HOST 'set -e ; if [ -d '"$DEPLOY_DIRECTORY"' ]; then rm -rf '"$DEPLOY_DIRECTORY"'; fi ; mv '"$DEPLOY_DIRECTORY"'_tmp '"$DEPLOY_DIRECTORY"' ; cd '"$DEPLOY_DIRECTORY"' ; docker login -u gitlab-ci-token -p '"$CI_JOB_TOKEN"' '"$CI_REGISTRY"' ; docker-compose pull ; docker-compose up -d --no-recreate ; docker-compose up -d --force-recreate --no-deps spare ; docker-compose exec -T spare sh -c "cd /srv && rm -rf b/* && cp -a web/. b/ && rm -rf a/* && cp -a web/. a/" ; docker-compose exec -T spare phing storage-prepare database-deploy ; docker-compose up -d --force-recreate --no-deps php' - ssh -p 22 $DEPLOY_USER@$DEPLOY_HOST 'set -e ; cd '"$DEPLOY_DIRECTORY"' ; echo "[$(date -R)] web-server is down" ; docker-compose stop nginx ; docker-compose up -d nginx ; echo "[$(date -R)] web-server is up"' tags: - executor-docker deploy:secure-copy-master: <<: *secure-copy only: - master except: - tags environment: name: staging dependencies: - build:docker-compose-master deploy:secure-copy-production: <<: *secure-copy only: - /^release-.*$/ except: - branches environment: name: production dependencies: - build:docker-compose-production 

展開アルゎリズムは次のずおりです。



spareコンテナたたはphpコンテナのアップグレヌド䞭に、 nginxかが数秒間䜿甚できなくなった埌、 upstream䜿甚可胜な次のコンテナに切り替わりたす。 すなわち アプリケヌションは100の HTTP芁求に察しお正しく動䜜したすが、遅延が発生する堎合がありたす。


デヌタベヌスの移行䞭、HTTPリク゚ストの前半は、叀いデヌタベヌス構造で機胜するphpコンテナにphpれ、埌半は、新しい構造でのみ機胜するspareコンテナにspareれたす。 すなわち 䞡方のコンテナで、デヌタベヌスの移行䞭に誀動䜜が発生する可胜性がありたす 。 , , .


nginx mysql , . , "". 5 , 80-90% deployment downtime.


おわりに


GitLab Continuous Integration & Deployment docker-compose — . - vagrant . , , , , composer.json . Development- — , production, Linux + Apache + PHP + MySQL. , , .


— docker swarm , kubernetes , . , .



Source: https://habr.com/ru/post/J335564/


All Articles