Symfony application deploy bundle. Full stack deply task management tool
MIT License
Task runner for Symfony project
Add Composer dependency:
composer.phar require sokil/deploy-bundle
Add bundle to your AppKernel
:
<?php
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Sokil\DeployBundle\DeployBundle(),
);
}
}
Configure tasks required to run in your app in app/config/config.yml
:
deploy:
config:
git: {}
composer: {}
npm: {}
bower: {}
grunt: {}
asseticDump: {}
assetsInstall: {}
tasks:
updateBack: [git, composer]
updateFront: [npm, bower]
compileAssets: [grunt, asseticDump, assetsInstall]
release: [updateBack, updateFront, compileAssets]
Section config
declared options of every task, able to run.
Section tasks
declares bundles of tasks, which run sequentially.
Tasks may be run by defining task aliases in cli command:
$ ./app/console deploy --git --npm
Also tasks bundles may be defined:
$ ./app/console deploy --compileAssets
If no task specified then default
task bundle will be run. This task
bundle may be defined in configuration, but if it omitted,
then default task consists of all tasks in order of config
section.
Tasks and task bundles both may be specified in cli options, then tasks
will be run in order of first occurrence. Task bundle also may contain
other bundles.
To get list of all configured tasks run:
$ ./bin/console deploy --env=prod -h
Usage:
deploy [options]
Options:
--composer Update composer dependencies
--composer-update Update dependencies instead of install it
--migrate Migrate datbase
--npm Updating npm dependencies
--bower Updating bower dependencies
--grunt Run grunt tasks in bundles
--grunt-tasks[=GRUNT-TASKS] List of bundles with specified grunt tasks, e.g. "bundle1Name:task1Name,task2Name;bundle2Name;"
--asseticDump Dump assetic assets
--assetsInstall Install bundle assets
--clearCache Clear cache
--updateFront Task bundle for tasks "npm","bower"
--compileAssets Task bundle for tasks "grunt","asseticDump","assetsInstall","clearCache"
--release Task bundle for tasks "composer","migrate","updateFront","compileAssets"
--default Task bundle for tasks "composer","migrate","npm","bower","grunt","asseticDump","assetsInstall","clearCache"
Add configuration to your ./app/config/config.yml
:
deploy:
config:
git:
defaultRemote: origin # Optional. Default: origin. Set default remote for all repos
defaultBranch: master # Optional. Default: master. Set default branch for all repos
repos: # List of repos
core: # Alias of repo
path: /var/www/project # Path to repo
remote: origin # Optional. Default: origin. Set remote for this repo
branch: master # Optional. Default: master. Set branch for this repo
tag: false # Tag release after pull
If repository is private, password will be asked on pull:
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
For example web server started under www-data user. To prevent asking password,
add ssh keys to /home/$USER/.ssh
directory, using ssh key generation tool.
$ sudo -u www-data ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www-data/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-data/.ssh/id_rsa.
Your public key has been saved in /home/www-data/.ssh/id_rsa.pub.
The key fingerprint is:
...
Add public key to your repository to fetch changes without password prompt.
Test your connection:
$ sudo -H -u www-data git pull origin master
Find out who use this key already:
ssh -T [email protected]
ssh -T [email protected]
You can optionally specify path to webpack in pathToWebpack
parameter. If omitted , then webpack
will be used.
In this case webpack must be installed globally.
deploy:
config:
webpack:
pathToWebpack: assets/node_modules/.bin/webpack # (Optional) Path to webpack
projects: # list of webpack projects with own webpack.config.js inside
assets:
config: "assets/webpack.config.js" # (required) path to config. Context will be set to dirname of config.
progress: true # (optional) Show build progress
p: true # (optional) Build for production. For "prod" environment defined automatically
...
This will run command, where context
value is dirname of config in parameters config
:
assets/node_modules/.bin/webpack --config assets/webpack.config.js -p --progress --context assets
deploy:
config:
npm:
dirs: # Optional list of dirs to search package.json and install dependencies
- "assets"
bundles: # Optional list of bundles where to search package.json
SomeBundle: true
SomeOtherBundle:
package: ../ # path to project.json, relative to SomeOtherBundle.php file
deploy:
config:
bower:
bundles:
SomeBundle: true
SomeOtherBundle: true
Add task configuration to your deploy config:
deploy:
config:
grunt:
bundles: # bundles where grunt need to be run
SomeBundle1: true
SomeBundle2:
tasks: [task1, task2, task3]
gruntfile: ../ # dir with Gruntfile.js, relatively to SomeBundle2.php
parallel: true # run grunts from all bundles in parallel. Default: false
Grunt may have few tasks, and you can select which tasks to run.
In config:
deploy:
config:
grunt:
bundles:
SomeBundle:
tasks:
- newer:less
- newer:jade
SomeOtherBundle: true
parallel: true
As CLI parameter:
./app/console deploy --grunt --grunt-tasks="SomeBundle=newer:less,newer:jade&SomeOtherBundle"
Add dependency:
composer.phar require doctrine/migrations
composer.phar require doctrine/doctrine-migrations-bundle
Register bundler in AppKerner
:
new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
First, configure migrations in ./app/config/config.yml
:
doctrine_migrations:
dir_name: %kernel.root_dir%/migrations
namespace: Migrations
table_name: migrations
name: Application Migrations
Then add task to deploy config in ./app/config/config.yml
:
deploy:
config:
migrate: {}
Then add task to deploy config in ./app/config/config.yml
:
deploy:
config:
assetsInstall: {}
Then add task to deploy config in ./app/config/config.yml
:
deploy:
config:
asseticDump: {}
Bundles with Assetic assets must be defined in ./app/config/config.yml
:
assetic:
bundles:
- AcmeBundle
This task will run composer command:
composer.phar install --optimize-autoloader --no-interaction
File composer.phar
must be in path, or you can redefine path to composer by param path
.
Add task config to ./app/config/config.yml
:
deploy:
config:
composer:
scripts: true # set true if you want to execute scripts. Default: true
update: true # Optional. If passed, update dependencied instead on install
path: composer.phar # Optiona. Default: composer.phar, specify path to composer
deploy:
config:
clearCache: {}
Task userd to sync data to production servers. Add configuration:
deploy:
config:
parallel: 3
rules:
web:
src: '.'
dest:
- [email protected]://var/www/some
- [email protected]://var/www/some
delete: true
verbose: true
exclude:
- /var
- /app/conf/nginx/
- /.idea
- /app/config/parameters.yml
include:
- /app/conf/nginx/*.conf.sample
Parameter rules
define rules to sync files from source to destination.
May be configured any number of rules. Every rule consists of parameter
src
(defaults to "."), parameter dest
which may be string or array of hosts.
Other rule parameters same to rsync
options. See man page of rsync
to find description of this options.
First, create task class which extends Sokil\DeployBundle\Task\AbstractTask
. Then add Symfony's service definition:
acme.deploy.my_task:
class: Acme\Deploy\Task\MyTask
abstract: true
public: false
tags:
- {name: "deploy.task", alias: "myTask"}
This service must contain tag with name deploy.task
and alias, which will be used as CLI command's option name and configuration section name.
Then, you may add it to bundle's configuration in app/config/config.yml
to deploy
section in proper place of order, if you want it to be run automatically:
deploy:
config:
git: {}
grunt: {}
myTask: {}
Now, your task will be calld third after git
and grunt
by calling deploy
command without arguments:
$ ./app/console deploy --env=prod
You also may call your task directly from console:
$ ./app/console deploy --myTask