Symfony Camp 2013 UA.
Continuous Integration and Automated Deployments for Symfony-based projects
P.S. Original PPTX presentation contains a lot of notes
67. Build
• Static analysis via HHVM
• Actually was implemented, but hphpa changed a
lot (now it’s
https://github.com/sebastianbergmann/hhvm-
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
Speech includes not only slides and copy-paste from manual, but also a real practiceP.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
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
24x7
+ users always have good UX (some functionality could be disabled / read only), ~99.999% uptime
$$$ (implementation, testing, support & maintenance, hardware resources)
complexity
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