ãã®èšäºã§ã¯ã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
æ¬çªåããã³ãã¹ãéçºè
çšãµã€ãã®ãµãŒããŒã
GitlabGitLabããã³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_TOKEN | https://github.com/settings/tokensã§ããŒã¯ã³ãäœæããŸã |
SSH_PRIVATE_KEY | ãŠãŒã¶ãŒmaster id_rsaãã¡ã€ã«ã®å
容ãå
¥åããŸã |
NETWORK_NAME_MASTER | ã°ã¬ãŒãããã¯ãŒã¯ |
SERVER_NAME_MASTER | site-staging.ru |
NETWORK_IP_MASTER | ã°ã¬ãŒãããã¯ãŒã¯ãµããããäžã®ç¡æã®IPãéžæããŸã |
NETWORK_NAME_PRODUCTION | ã°ã¬ãŒãããã¯ãŒã¯ |
SERVER_NAME_PRODUCTION | site-production.ru |
NETWORK_IP_PRODUCTION | ã°ã¬ãŒãããã¯ãŒã¯ãµããããäžã®ç¡æã®IPãéžæããŸã |
DEPLOY_USER_MASTER | ãã¹ã¿ãŒ |
DEPLOY_HOST_MASTER | docker-server-prod.ru |
DEPLOY_DIRECTORY_MASTER | /home/master/site-staging.ru |
DEPLOY_USER_PRODUCTION | ãã¹ã¿ãŒ |
DEPLOY_HOST_PRODUCTION | docker-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_TOKEN | https://github.com/settings/tokensã§ããŒã¯ã³ãäœæããŸã |
SSH_PRIVATE_KEY | ãŠãŒã¶ãŒdev1 id_rsaãã¡ã€ã«ã®å
容ãå
¥åããŸã |
NETWORK_NAME_MASTER | ã°ã¬ãŒãããã¯ãŒã¯ |
SERVER_NAME_MASTER | site-dev1.ru |
NETWORK_IP_MASTER | ã°ã¬ãŒãããã¯ãŒã¯ãµããããäžã®ç¡æã®IPãéžæããŸã |
DEPLOY_USER_MASTER | éçºè
|
DEPLOY_HOST_MASTER | docker-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
å±éã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
build
段éã§çæãããdocker-compose.yml
ãã¡ã€ã«ãã³ããŒããŸã- ã³ã³ããã¬ãžã¹ããªããæ°ããã€ã¡ãŒãžãããŠã³ããŒããã
spare
ã³ã³ããã®æŽæ°nginx
éçãã¡ã€ã«ãæŽæ°ããããŒã¿ããŒã¹ãç§»è¡ããŸãphp
ã³ã³ããã®æŽæ°nginx
ããã³mysql
ã³ã³ãããŒã®æŽæ°ïŒæŠéç¶æ
-ããã¯å¿
èŠãããŸããïŒ
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
, . , .