Deploying Sulu CMS with Deployer
For traditional non container deployments, Deployer is a value tool to simplify & automate the deployment process of a PHP application. Thanks to its collection of default deployment recipes, Deployer can be used out-of-the-box for deployments.
One of the many out-of-the-box recipes offers a default deployment workflow for Sulu CMS. To use the recipe, create a deploy.php
file in your project repository with the following contents:
<?php
namespace Deployer;
require 'recipe/sulu.php';
// Configure project name and Git repository
set('application', 'My Sulu website');
set('repository', 'git@example.com:customer/sulu.git');
// import the hosts configuration
import(__DIR__.'/hosts.yml');
In the hosts.yaml
file, you define all hosts to deploy the application to:
hosts:
www.example.com:
deploy_path: /var/www/html/
remote_user: sulu-user
This allows you in your deployment pipeline to run a deployment by calling Deployer like this
./bin/dep deploy --file ./deploy.php
The downside of the command above is that it will always deploy the latest master branch state, which is not ideal for
reproducible deployments. Luckily, Deployer has a solution for that, by passing the --tag
argument, we can specify the git tag that should be used for the checkout:
./bin/dep deploy --file ./deploy.php -tag "1.2.3"
And the best thing about Deployer is its flexibility. For a standard Sulu setup, the Sulu recipe works fine. Since we are using the Sulu Headless Bundle for our projects, we have not only to deploy/compile the Sulu "backend" but also the React frontend.
This can be done by adding another task like this:
task('deploy:headless:deploy', function () {
run('cd {{release_path}}/assets/headless && yarn && yarn build');
});
after('deploy:prepare', 'deploy:headless:deploy');
Or if you prefer to compile the frontend in your CI environment and just upload the build frontend, the following deployment snippet will do:
task('deploy:headless:deploy', function () {
upload('public/build/headless', '{{release_path}}/public/build');
});
after('deploy:prepare', 'deploy:headless:deploy');
As you can see, using Deployer is not too complicated, thanks to recipes that come with Deployer out-of-the-box. Thanks to its flexibility, you can adjust all the bolts as needed. For example, if you are using Tideways for application performance monitoring, you can use Deployer to trigger a Tideways Deployment event for the Tideways reports.