Today we will learn a tool to support auto deploying PHP applications and especially with Laravel, Deployer.
1. Install Deployer
- To install Deployer is quite simple, on the Deployer home page also instructed, you just need to run the following commands:
1 2 3 4 | $ curl <span class="token operator">-</span> <span class="token constant">LO</span> https <span class="token punctuation">:</span> <span class="token comment">//deployer.org/deployer.phar</span> $ mv deployer <span class="token punctuation">.</span> phar <span class="token operator">/</span> usr <span class="token operator">/</span> local <span class="token operator">/</span> bin <span class="token operator">/</span> dep $ chmod <span class="token operator">+</span> x <span class="token operator">/</span> usr <span class="token operator">/</span> local <span class="token operator">/</span> bin <span class="token operator">/</span> dep |
Once installed, move to the directory where the project is located (under local) and run
1 2 | $ dep init |
then it will generate deploy.php
file in your project
2. Use Deployer
- Next, we config with
deploy.php
file
1. Configuration
- To use configuration variables, we use the
set()
function, to get it out we use theget()
function.
1 2 3 4 5 6 | <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'param'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'value'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$param</span> <span class="token operator">=</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'param'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
2. Task
- To define the task to execute, you use the
task()
function, but you can also describe the task with thedesc()
function, for example:
1 2 3 4 5 | <span class="token function">desc</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'My task'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'my_task'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- To perform a task:
1 2 | dep my_task |
- To display the available commands:
1 2 | dep list |
- You can also combine several tasks into one task:
1 2 3 4 5 6 7 8 | <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'deploy:prepare'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:update_code'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:vendors'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:symlink'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'cleanup'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- You can define tasks that can run before or after other tasks:
1 2 3 4 5 6 | <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy:done'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">write</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Deploy done!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">after</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:done'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3. Host
- You can define
host
by thehost()
function, for example:
1 2 3 4 | <span class="token function">host</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'domain.com'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">stage</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'production'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy_path'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'~/app'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Inside:
domain.com
: is the domain or IP you will deploystage
: Name of the environment you will deploy (staging, production) – Any name will be provided as long as you type the command to type the stage name correctly
4. Flow
- The general deployment flow will look like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'deploy:prepare'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:lock'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:release'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:update_code'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:shared'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:writable'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:vendors'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:clear_paths'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:symlink'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:unlock'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'cleanup'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'success'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Inside:
deploy:prepare
: Prepare deploy, checkdeploy_path
, if not, create it. It also checks for the existence of paths:relesases
: In this directory, releases releases will be storedshared
: File sharing on all releases.dep
: metadata used byDeployer
deploy:lock
: Deploy key to run only 1 deploy process at the same time, check the existence of.dep/deploy.lock
file, if deply process is canceled byCtrl + C
, rundeploy:unlock
to delete this file. go. In case of unsuccessful deploy, thendeploy:unlock
will automatically activatedeploy:release
: Create a folderrelease
based on the configurationrelease_name
while reading files.dep/releases
to get a list of the releases made before do.Ngoai, if indeploy_path
have symlinks the previous release, it will be deleteddeploy:update_code
: pull code from githubdeploy:shared
: createdeploy:shared
files and shared folders for the files that we define to share across versions. You can specify shared folders and files atshared_dirs
andshared_files
, the process is divided into steps: + Copy the folder fromrelease_path
toshared
if it doesn’t exist. + Delete therelease_path
directory + symlink the folder fromshared
torelease_path
.deploy:writable
: Set write permissions for the files listed inwritable_dirs
.deploy:vendors
: Runcomposer install
for the application.deploy:clear_paths
: Delete the specified directory inclear_paths
deploy:symlink
: symlink the current version torelease_path
.cleanup
: Clean old releasessuccess
: Print thesuccess
message.- And here is the configuration file I have configured in the
deploy.php
file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">Deployer</span> <span class="token punctuation">;</span> <span class="token keyword">require</span> <span class="token single-quoted-string string">'recipe/laravel.php'</span> <span class="token punctuation">;</span> <span class="token comment">// Project name</span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'application'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy_project'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Project repository</span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'repository'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="d1b6b8a591b6b8a5b9a4b3ffb2bebc">[email protected]</a> :name_organizations/name_project.git'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [Optional] Allocate tty for git clone. Default value is false.</span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'git_tty'</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Default branch</span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'branch'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'develop'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Shared files/dirs between deploys </span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'shared_files'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'.env'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'shared_dirs'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'storage'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'bootstrap/cache'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Writable dirs by web server </span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'writable_dirs'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'bootstrap/cache'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/app'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/app/public'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/framework'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/framework/cache'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/framework/sessions'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/framework/views'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'storage/logs'</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Hosts</span> <span class="token function">host</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'IP_server_or_domain'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">user</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">stage</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'zizou'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">set</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy_path'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'~/{{application}}'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">forwardAgent</span> <span class="token punctuation">(</span> <span class="token boolean">false</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Tasks</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'build'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'cd {{release_path}} && build'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'npm:install'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'cd {{release_path}} && npm install'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'npm:run_dev'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'cd {{release_path}} && npm run dev'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'reload:php-fpm'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'sudo /etc/init.d/php7.3-fpm reload'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'deploy:info'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:prepare'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:lock'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:release'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:update_code'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:shared'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'npm:install'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'npm:run_dev'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:writable'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:vendors'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'artisan:storage:link'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'artisan:view:clear'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'artisan:cache:clear'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'artisan:config:cache'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:clear_paths'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:symlink'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:unlock'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'cleanup'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'success'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [Optional] if deploy fails automatically unlock.</span> <span class="token function">after</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy:failed'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'deploy:unlock'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Migrate database before symlink new release.</span> <span class="token function">before</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'deploy:symlink'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'artisan:migrate'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">after</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'cleanup'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'reload:php-fpm'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span> |
And to run, we run:
1 2 | dep deploy zizou |
^^ or you can also run
1 2 | dep deploy zizou <span class="token operator">-</span> vvv |
to see details of the deploying process, what does it run?
Attention:
- To run this guy deploy, you need to have
ssh key
connect to the server - When you run the first time, you do not run the
migrate
task, the next deploy run can run themigrate
task, and each time the code is merged, you just need to run
1 2 | dep deploy |
- If you want to rollback to an earlier release, just run
1 2 | dep rollback |
- Above is what I tried with
Deployer
and success
Refer