Skip to content

Instantly share code, notes, and snippets.

@sidigi
Created September 17, 2018 07:08
Show Gist options
  • Save sidigi/bb7557b7485fe560fe0c828def9c0218 to your computer and use it in GitHub Desktop.
Save sidigi/bb7557b7485fe560fe0c828def9c0218 to your computer and use it in GitHub Desktop.
Laravel deploy (envoy file)
@setup
$user = '';
/*
|--------------------------------------------------------------------------
| Git Config
|--------------------------------------------------------------------------
|
| The git repository location.
|
*/
$repo = '';
$branch = 'master';
/*
|--------------------------------------------------------------------------
| Server Paths
|--------------------------------------------------------------------------
|
| The base paths where the deployment will happens.
|
*/
$timezone = 'Europe/Moscow';
$date = new DateTime('now', new DateTimeZone($timezone));
$path = '/var/www/salaries';
$current_dir = $path . '/current';
$releases_dir = $path . '/releases';
$release = $date->format('YmdHis');
$release_dir = $releases_dir . '/' . $release;
/*
|--------------------------------------------------------------------------
| Num of releases
|--------------------------------------------------------------------------
|
| The number of releases to keep.
|
*/
$keep = 15;
/*
|--------------------------------------------------------------------------
| Sharable resources
|--------------------------------------------------------------------------
|
| Define a associative array with the resources to be shared across releases.
| The value of a element in the array can only be 'd' for directories or 'f' for files.
|
*/
$shared = [
'storage' => 'd',
'.env' => 'f',
];
/*
|--------------------------------------------------------------------------
| Writable resources
|--------------------------------------------------------------------------
|
| Define the resources that needs writable permissions.
|
*/
$writable = [
'storage'
];
@endsetup
@servers(['production' => $user . '@' ])
@macro('app:install', ['on' => 'production'])
clone
composer:install
assets:install
assets:build
permissions
symlinks
{{-- migrate:refresh
tests--}}
clean
@endmacro
@macro('app:import', ['on' => 'production'])
import
@endmacro
@macro('app:deploy', ['on' => 'production'])
clone
composer:install
assets:install
assets:build
permissions
symlinks
down
migrate
optimize
up
{{--tests--}}
clean
@endmacro
@task('clone', ['on' => $on])
mkdir -p {{$release_dir}}
git clone --depth 1 -b {{$branch}} "{{$repo}}" {{$release_dir}}
echo '# - Repository has been cloned'
@endtask
@task('composer:install', ['on' => $on])
composer self-update
cd {{$release_dir}}
composer install --no-interaction --no-dev --prefer-dist -q -o
echo '# - Composer dependencies has been installed'
@endtask
@task('permissions', ['on' => $on])
@foreach($writable as $item)
chmod -R 755 {{ $release_dir }}/{{ $item }}
chmod -R g+s {{ $release_dir }}/{{ $item }}
chgrp -R www-data {{ $release_dir }}/{{ $item }}
echo "# - Permissions have been set for {{ $release_dir }}/{{ $item }}"
@endforeach
@endtask
@task('symlinks', ['on' => $on])
[ -d {{ $path }}/shared ] || mkdir -p {{ $path }}/shared;
@foreach($shared as $item => $type)
if ( [ -{{ $type }} '{{ $path }}/shared/{{ $item }}' ] && [ -{{ $type }} '{{ $release_dir }}/{{ $item }}' ] );
then
rm -rf {{ $release_dir }}/{{ $item }};
echo "# - rm -rf {{ $release_dir }}/{{ $item }}";
elif ( [ ! -{{ $type }} '{{ $path }}/shared/{{ $item }}' ] && [ -{{ $type }} '{{ $release_dir }}/{{ $item }}' ] );
then
mv {{ $release_dir }}/{{ $item }} {{ $path }}/shared/{{ $item }};
echo "# - mv {{ $release_dir }}/{{ $item }} {{ $path }}/shared/{{ $item }}";
fi
ln -nfs {{ $path }}/shared/{{ $item }} {{ $release_dir }}/{{ $item }}
echo "# - Symlink has been set for {{ $release_dir }}/{{ $item }}"
@endforeach
ln -nfs {{ $release_dir }} {{ $path }}/current;
chgrp -h www-data {{ $path }}/current;
echo "# - All symlinks have been set"
@endtask
@task('optimize', ['on' => $on])
cd {{$release_dir}}
php artisan clear-compiled --env={{ $on }};
{{--php artisan optimize --env={{ $on }};--}}
php artisan config:cache --env={{ $on }};
{{--php artisan route:cache --env={{ $on }};--}}
php artisan cache:clear --env={{ $on }};
echo '# - Artisan optimized';
@endtask
@task('migrate', ['on' => $on])
php {{ $release_dir }}/artisan migrate --force --no-interaction;
@endtask
@task('migrate:refresh', ['on' => $on])
php {{ $release_dir }}/artisan migrate:refresh --seed --force --no-interaction;
@endtask
@task('assets:install', ['on' => $on])
cd {{ $release_dir }};
yarn;
echo '# - Assets has been installed'
@endtask
@task('assets:build', ['on' => $on])
cd {{ $release_dir }};
yarn run production;
echo '# - Assets has been build'
@endtask
@task('tests', ['on' => $on])
{{ $release_dir }}/vendor/bin/phpunit {{ $release_dir }};
echo '# - All test has passed'
@endtask
@task('clean', ['on' => $on])
cd {{ $releases_dir }};
rm -rf $(ls -t | tail -n +{{ $keep }});
echo '# - Old releases has been deleted'
@endtask
@task('down')
cd {{ $release_dir }};
php artisan down;
echo '# - App is down'
@endtask
@task('up')
cd {{ $current_dir }};
php artisan up;
echo '# - App is up'
@endtask
@task('import', ['on' => $on])
cd {{$current_dir}}
php artisan import
echo '# - Import was successfully done'
@endtask
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment