Skip to content

Instantly share code, notes, and snippets.

@zgabievi
Created November 5, 2019 18:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zgabievi/58310f2eb4acb6173e360a4afddf21b9 to your computer and use it in GitHub Desktop.
Save zgabievi/58310f2eb4acb6173e360a4afddf21b9 to your computer and use it in GitHub Desktop.
@setup
if (!isset($env)) {
throw new Exception('--env must be specified');
}
$prod = false;
$server = '101.101.101.101';
$branch = 'develop';
$base_dir = '/var/www/html';
if ($env === 'prod') {
$prod = true;
$server = '101.101.101.101';
$branch = 'master';
$base_dir = '/var/www/html';
}
$user = 'root';
$repo = 'zgabievi/Repository';
$releases_dir = $base_dir . '/releases';
$current_dir = $base_dir . '/current';
$shared_dir = $base_dir . '/shared';
$new_name = date('Ymd-His');
$new_dir = $releases_dir . '/' . $new_name;
$writable = ['storage'];
function shout($message) {
return "echo '\033[32m" . $message . "\033[0m';\n";
}
@endsetup
@servers(['local' => '127.0.0.1', 'remote' => $user . '@' . $server])
@macro('deploy')
start
clone
composer
npm
assets
symlinks
optimize
migrate
cache
truncate
finish
@endmacro
@macro('auto-deploy')
clone
composer
npm
assets
symlinks
optimize
migrate
cache
truncate
@endmacro
@task('start', ['on' => 'local'])
{{ shout('πŸƒ Starting deployment...') }}
git checkout {{ $branch }}
git pull origin {{ $branch }}
@endtask
@task('clone', ['on' => 'remote'])
{{ shout('πŸŒ€ Cloning repository...') }}
[ -d {{ $releases_dir }} ] || mkdir {{ $releases_dir }};
[ -d {{ $shared_dir }} ] || mkdir {{ $shared_dir }};
[ -d {{ $shared_dir }}/storage ] || mkdir {{ $shared_dir }}/storage;
cd {{ $releases_dir }};
mkdir {{ $new_dir }};
git clone --depth 1 --branch {{ $branch }} git@github.com:{{ $repo }} {{ $new_name }}
cd {{ $new_dir }}
echo "{{ $new_name }}" > public/release.txt
@endtask
@task('composer', ['on' => 'remote'])
{{ shout('🚚 Running Composer...') }}
cd {{ $new_dir }};
composer install --prefer-dist --no-scripts -q -o --ignore-platform-reqs;
@endtask
@task('npm', ['on' => 'remote'])
{{ shout('πŸ“¦ Running npm...') }}
cd {{ $new_dir }};
npm install --no-progress
@endtask
@task('assets', ['on' => 'remote'])
{{ shout('πŸŒ… Generating assets...') }}
cd {{ $new_dir }};
npm run production
@endtask
@task('permissions', ['on' => 'remote'])
{{ shout('πŸ”’ Setting permission...') }}
@foreach($writable as $item)
chmod -R 755 {{ $new_dir }}/{{ $item }}
chmod -R g+s {{ $new_dir }}/{{ $item }}
chgrp -R apache {{ $new_dir }}/{{ $item }}
{{ shout('πŸ‘‰ Setting permission for "' . $new_dir . '/' . $item . '"...') }}
@endforeach
@endtask
@task('symlinks', ['on' => 'remote'])
{{ shout('πŸ”— Updating symlinks to persistent data...') }}
rm -rf {{ $new_dir }}/storage;
cd {{ $new_dir }};
ln -nfs {{ $shared_dir }}/storage storage;
cd {{ $new_dir }};
ln -nfs {{ $shared_dir }}/.env .env;
@endtask
@task('optimize', ['on' => 'remote'])
{{ shout('✨ Optimizing installation...') }}
cd {{ $new_dir }};
php artisan clear-compiled;
@endtask
@task('migrate', ['on' => 'remote'])
{{ shout('πŸ™ˆ Migrating database...') }}
cd {{ $new_dir }};
@if ($env === 'dev')
php artisan migrate:fresh --seed;
@else
php artisan migrate --force;
@endif
@endtask
@task('cache', ['on' => 'remote'])
{{ shout('πŸ™ Blessing new release...') }}
ln -nfs {{ $new_dir }} {{ $current_dir }};
cd {{ $new_dir }};
php artisan optimize
@endtask
@task('truncate', ['on' => 'remote'])
{{ shout('🚾 Cleaning up old releases...') }}
cd {{ $releases_dir }}
ls -dt {{ $releases_dir }}/* | tail -n +6 | xargs -d "\n" rm -rf;
@endtask
@task('finish', ['on' => 'local'])
{{ shout('πŸš€ Application deployed!') }}
@endtask
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment