sokil / deploy-bundle
Symfony application deploy bundle
Installs: 95
Dependents: 0
Suggesters: 4
Security: 0
Stars: 3
Watchers: 2
Forks: 1
Open Issues: 24
Type:symfony-bundle
Requires
- php: ^5.5 || ^7.0
Requires (Dev)
- phpunit/phpunit: >=3.7.38 <6.0
- satooshi/php-coveralls: >=0.7.1 <2.0
- squizlabs/php_codesniffer: ^2.3
- symfony/console: ~2.0|~3.0
- symfony/event-dispatcher: ~2.1|~3.0
- symfony/framework-bundle: ~2.3|~3.0
- symfony/process: ~2.1|~3.0
README
Task runner for Symfony project
Installation
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(), ); } }
Configuration
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"
Tasks
Git
Configuring git task
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
Private repositories
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.
- Generate keys:
$ 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 git@github.com
ssh -T git@bitbucket.com
Webpack
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
Npm
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
Bower
deploy: config: bower: bundles: SomeBundle: true SomeOtherBundle: true
Grunt
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"
Migrations
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: {}
Install Assets
Then add task to deploy config in ./app/config/config.yml
:
deploy: config: assetsInstall: {}
Dump Assetic
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
Composer
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
Clear cache
deploy: config: clearCache: {}
Sync
Task userd to sync data to production servers. Add configuration:
deploy: config: parallel: 3 rules: web: src: '.' dest: - user@www1.server.com://var/www/some - user@www2.server.com://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.
Writing own tasks
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