Your SlideShare is downloading. ×
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Symfony 2 under control


Published on

Symfony Camp 2013 UA. …

Symfony Camp 2013 UA.
Continuous Integration and Automated Deployments for Symfony-based projects

P.S. Original PPTX presentation contains a lot of notes

Published in: Software, Technology

  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide
  • Speech includes not only slides and copy-paste from manual, but also a real practice P.S. A lot of well-known demotivators and gags are included)
  • практика разработки программного обеспечения, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем
  • envs: dev/ci/qa/staging/uat/production
  • What to build?
    Install vendors
    Perform static analysis& validation
    Prepare assets
    Run tests
    Compress into archive
  • Ant: From Java world, XML declarative config, Can run tasks in parallel, No PHP-specific tasks, Could be extended (Java), IDE support
    Phing: Written in PHP, Ant config syntax, All tasks by default are running in the single PHP process, Could be extended (PHP), IDE support
    Pake: Written in PHP, Not so popular, PHP-based config
    Quiz: which tool is used by audience?
  • Target: Could depend on other targets, phing <taskname>
    Task: Custom tasks can be implemented, examples
    Types: Reference, FileSet, Property, FileList, Filters

  • list-updates = composer update –dry-run
    security-checker =

  • phpcs with custom configs for php & javascript
  • Regular: Copy config for CI server, warmup cache, install assets & dump them via Assetic
    DB-related: drop & re-create DB, run Doctrine Migrations, load fixtures, validate DB schema. dump schema to DDL file
    twig:lint for Bundles and app/Resources
  • Package: Add version to text file, add DDL schema schema.sql, package app, src, vendors, web to tar.gz
    Deployment (for specific Capifony subtasks: maintenance mode, backup DB, cleat Doctrine cache, cleanup old releases, deploy artifact)
  • Jenkins CI – ex-Hudson CI
    CruiseControl + PHP Under Control
    TeamCity, Bamboo: commercial
    Travis CI, Scrutinizer CI: SAAS
    Quiz: which tool is used by audience?
  • git: disable internal tagging!
    copyartifact: copy artifact from one job to another
    email-ext: sends emails on successful builds, useful for deployment jobs

  • phing
    checkstyle phpcs, hphpa
    dry phpcpd
    jdepend php_depend
    plot phploc using CSV files
    pmd phpmd
    violations aggregates info from phpcs, hphpa, phpmd, phpcpd
    xunit phpunit
    htmlpublisher HTML artifacts
  • build-<branchname>: Builds specific branch (master), Features are verified after merge
    build-package-tag: Parameterizedm Produces .tar.gz artifact from specific Git tag
  • deploy-qa-<branchname>: tar.gz from latest revision of branch, Deploys to QA, Not recommended to have more than one such job (issues with migrations), Workaround: multiple QA or complete DB purge on deploy
    deploy-package-tag: Deploys specific package from build-package-tag to specified environment, Ability to enable/disable maintenance mode and error message via parameters, Email after deployment

  • Previous deployed version examples: <tag>.<build#> = v0.0.3.26, <branchname>-<build#>-<revision>-SNAPSHOT = master-12-7c041a90366ce9d958760094c763d809ffbc629e-SNAPSHOT
  • Capistrano: from Ruby world
    Capifony: Based on Capistrano, Implemented in liip/symfony-rad-edition
    Custom: deb, rpm / VCS update / Rsync, FTP, SCP / Shell script
    Phar: Don’t use WebPhar, Silex does not use it anymore
    Zend Server package: No support for vanilla PHP, Zend Continuous Delivery Blueprint
    PaaS: AWS Elastic Beanstalk, PagodaBox

    Quiz: which tool is used by audience?
  • Capistrano: from Ruby world
    Capifony: Based on Capistrano, Implemented in liip/symfony-rad-edition
    Custom: deb, rpm / VCS update / Rsync, FTP, SCP / Shell script
    Phar: Don’t use WebPhar, Silex does not use it anymore
    Zend Server package: No support for vanilla PHP, Zend Continuous Delivery Blueprint
    PaaS: AWS Elastic Beanstalk, PagodaBox

    Quiz: which tool is used by audience?
  • Based on Capistrano: Supports Capistrano plugins
  • Sometimes there is no access to internet due to security limitations
  • Decreases deployment time: Lot of vendors, Slow internet connection
  • Reproducible: You know what you deploy, You can deploy exactly the same package to multiple environments
    Quick fixes (git commit + git pull) not available
  • pros / contras of maintenance mode

    + users always have good UX (some functionality could be disabled / read only), ~99.999% uptime
    $$$ (implementation, testing, support & maintenance, hardware resources)
  • User Triggers job on Jenkins CI, Choose options (env, maintenance mode)
    Jenkins Executes phing target with additional CLI arguments
    Phing Executes several Capifony commands according to command-line arguments
    Capifony Performs actions on remote machines
  • Maintenance mode maintenance.html in webroot
    Clear Doctrine cache Not for APC cache
    Downloads previous deploy metadata package version, Doctrine Migrations info
  • Restarts services: php-fpm or Apache, Doctrine APC cache is cleared
    Symfony-specific tasks: copy app/config/parameters.yml, doctrine:migrations:migrate, cache:warmup
  • Housekeeping: Perform cleanup for old releases
  • Semi-automatical: from deployment server, usually CI server
    Enable Maintenance: manually via phing
    Manually backup for analysis: DB, current version, Doctrine Migrations status, codebase
  • Switch to previous release: Manually via capifony CLI
    Recover DB: Rollback Doctrine Migrations, Restore DB dump, Custom
    Additional tasks: Restore web server config, Restart service, cache:warmup
    Disable Maintenance Manually via phing
  • Write rollback guide: Step-by-step, Verify it periodically
    Enable monitoring on prod: Zabbix, Pinba, Munin, New Relic, Graylog2
  • Transcript

    • 1. Continuous Integration and Automated Deployments for Symfony-based projects Symfony 2 under control
    • 2. Whois 2
    • 4. Batteries ARE Included  4
    • 5. For standard projects Phing Jenkins CI Capifony Quick facts 5
    • 6. Open Source Bundle Quick facts 6
    • 7. What is Continuous Integration? 7
    • 8. Improve quality Understand current situation Automate checklists Notify colleagues How could it help you? 8
    • 9. composer require "epam/ci- bundle=1.0.*" //update AppKernel app/console epam-ci:init "Acme Demo Project" How to use? 9
    • 10. •Tweak configuration •Install tools on envs •… •Profit! How to use? 10
    • 11. BUILD 11
    • 12. Mmm… Build! 12
    • 13. Ant Phing Pake Build tools 13
    • 14. Target •Set of tasks Task •Action Types •Data types Phing Terminology 14
    • 15. build-epam-ci.xml •Default workflow build.xml •Overwrites Phing build files 15
    • 16. •Project config •Environment config Phing config files 16
    • 17. build •dev env •console build-ci •CI env •XML Main Phing Targets 17
    • 18. package • tar.gz package • DDL dump deploy • packageenv Main Phing Targets 18
    • 19. All Phing targets? 19
    • 20. Phing. Want more? 20
    • 21. clean prepare build-tools-self-update Phing Targets. Special 21
    • 22. validate install list-updates security-checker Phing Targets. Composer 22
    • 23. phplint pdepend phpmd Phing Targets. Static analysis 23
    • 24. apidoc phpcs php-cs-fixer Phing Target. General 24
    • 25. Phing Targets. General, by Sebastian Bergmann 25
    • 26. Regular build workflow DB tasks twig:lint Phing Targets. Symfony-specific 26
    • 27. Package Deployment Phing Targets. Deployment 27
    • 29. CI servers 29
    • 30. Open-source Enterprise Jenkins CI overview 30
    • 31. Tons of plugins PHP Template by Sebastian Bergmann Jenkins CI overview 31
    • 32. IDE Integration RESTful API Jenkins CI overview 32
    • 33. Jenkins CI RESTful API 33
    • 34. git greenballs parameterized- trigger copyartifact email-ext Jenkins Plugins (common) 34
    • 35. phing checkstyle dry jdepend plot pmd violations xunit htmlpublisher Jenkins Plugins (PHP-specific) 35
    • 36. build-<branchname> build-package-tag Jenkins Jobs for build 36
    • 37. deploy-qa-<branchname> deploy-package-tag Jenkins Jobs for deployment 37
    • 38. Deployed .tar.gz archive Previous deployed version DB dump before deployment Doctrine Migrations info DB schema Jenkins Jobs for deployment. Artifacts Icons by 38
    • 39. DEPLOYMENT 39
    • 40. Deployment strategy 40
    • 41. Custom Zend Server package PaaS Deployment tools 41
    • 42. Phar Capistrano Capifony Deployment tools 42
    • 43. Based on Capistrano Symfony 1 & 2 Capifony 43
    • 44. Multistage Maintenance mode Clustered environments Capifony 44
    • 45. Directory structure 45
    • 46. releases/ current/ (symlink) shared/ Directory structure 46
    • 47. app/config/parameters.yml app/logs web/uploads Directory structure / Shared 47
    • 48. ln -s not shared across nodes Directory structure / Shared 48
    • 49. `-- /var/www/ |-- current → /var/www/ |-- releases | `-- 20100512131539 | `-- 20100509150741 | `-- 20100509145325 `-- shared |-- web | `-- uploads |-- logs `-- config `-- parameters.yml Directory structure example from 49
    • 50. All you need is package capistrano-deploy- strategy-archive Deployment via SCM vs package 50
    • 51. Deployment via SCM vs package: Github not available? Goodbye, vendors! 51
    • 52. Decreases deployment time Increases build time Deployment via SCM vs package 52
    • 53. Reproducible Quick fixes not available Deployment via SCM vs package 53
    • 54. .tar.gz Optimized autoloader only necessary dirs & files Package contents 54
    • 55. assets:install assetic:dump version.txt & db-schema.sql Package contents 55
    • 56. DBDeploy Liquibase Doctrine Migrations Doctrine Fixtures Database Migrations 56
    • 57. Deployment: Maintenance mode 57
    • 58. User Jenkins Phing Capifony Capifony & Jenkins CI 58
    • 59. Maintenance mode on Backup DB Clear Doctrine cache Download previous build metadata Capifony & Phing. Deployment preparations 59
    • 60. Deploy tar.gz package Restart services Symfony-specific tasks Capifony & Phing. Deployment 60
    • 61. Maintenance mode off Housekeeping Capifony & Phing. Post-deployment steps 61
    • 62. Broken build??? 62
    • 63. Enable Maintenance Manually backup for analysis Rollback is semi-automatic 63
    • 64. Switch to previous release Additional tasks Disable Maintenance Rollback 64
    • 65. Write rollback guide Enable monitoring on prod Rollback tips 65
    • 66. P.S. 66
    • 67. Build • Static analysis via HHVM • Actually was implemented, but hphpa changed a lot (now it’s wrapper) Deployment • Cronjob / CLI script handling • Web server (Apache, nginx) config manipulations • Ext- and lib- dependency verification via Composer • Custom script execution during deployment What is not implemented yet 67
    • 68. Questions?