Skip to content

Notes for creating builds and deployment for Symfony2 projects

License

Notifications You must be signed in to change notification settings

o/symfony-build-deploy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 

Repository files navigation

Symfony2, Symfony3 build and deployment best practices

Upload your code to the production server

Tag a version of your code as a release

git tag ${TAG_NAME}
git push --tags

Download a tagged version from Git as tar.gz archive

From any git server

git archive --format=tar.gz -o "/path/to/archive/folder/${GIT_REPOSITORY}-${TAG_NAME}.tar.gz" --prefix="${GIT_REPOSITORY}-${TAG_NAME}/" ${TAG_NAME}

From Github

curl -L --user "${GIT_USERNAME}:${GIT_PASSWORD}" --output "/path/to/archive/folder/${GIT_REPOSITORY}-${TAG_NAME}.tar.gz" "https://github.com/${GIT_ACCOUNT}/${GIT_REPOSITORY}/archive/${TAG_NAME}.tar.gz"

Create a release directory (Creating seperate folder for each release is strongly recommended)

mkdir -p /path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}

Extract contents of archive to release directory

tar -zxf "/path/to/archive/folder/${GIT_REPOSITORY}-${TAG_NAME}.tar.gz" --directory "/path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}" --strip-components 1

Copy parameters.yml contains production parameters to project folder

cp "/path/to/parameters/${GIT_REPOSITORY}.yml" "/path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}/app/config/parameters.yml"

Post install tasks

cd "/path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}"

For running post-install-cmd scripts run in the production environment

export SYMFONY_ENV=prod

Install vendors

composer.phar install --no-dev --optimize-autoloader

Clear cache

/usr/bin/php app/console cache:clear --env=prod --no-debug

For Symfony3

/usr/bin/php bin/console cache:clear --env=prod --no-debug

Dump your assets (If you need)

/usr/bin/php app/console assetic:dump --env=prod --no-debug

For Symfony3

/usr/bin/php bin/console assetic:dump --env=prod --no-debug

Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.

/usr/bin/php app/console doctrine:schema:update --force

For Symfony3

/usr/bin/php bin/console doctrine:schema:update --force

Give necesssary permissions (in this example, www-data belongs to nginx)

chown -R www-data: "/path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}"

Finally, symlink release folder to web server root

ln -sf "/path/to/release/folder/${GIT_REPOSITORY}-${TAG_NAME}" "/var/www/${GIT_REPOSITORY}"

If you use op-code cache with php-fpm, restart php5-fpm for invalidating cache every release. If you're using Apache with mod_php, you should restart it.

Don't forget to disable op-code cache on CLI interface using opcache.enable_cli (in php.ini) configuration option to prevent inconsistent results. You can check quickly with $ php -i | grep opcache.enable

Notes on deploying to multiple servers:

Compress files for easy transfer

tar -zcf "/path/to/build/folder/${GIT_REPOSITORY}-${TAG_NAME}" .

Extract files to same directory on destination server

Following Ansible tasks helps to distribute builds to other servers

 - name: Create release directory
   file:
     path={{release_directory}}
     state=directory

 - name: Extracting release
   unarchive:
     src={{build_directory}}/{{project_name}}-{{release_version}}.tar.gz
     dest={{release_directory}}
     owner=www-data

 - name: Symlinking release
   file:
     src={{release_directory}}
     dest={{application_directory}}
     state=link

 - name: Start PHP5-FPM
   service:
     name=php5-fpm
     state=reloaded

About

Notes for creating builds and deployment for Symfony2 projects

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published