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

Thanks for flagging this SlideShare!

Oops! An error has occurred.


Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

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?