Эта статья была рецензирована Верном Анчетой и Виражем Хатавкаром . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Автоматизация тестирования, непрерывная интеграция и непрерывная доставка в настоящее время довольно широко распространены в сообществе. Это привело к появлению множества сервисов, пытающихся сделать процесс более приятным и менее сложным для разработчиков, поэтому они могут сосредоточиться на поставке программного обеспечения, а не на создании / настройке инструментов для этого. Одним из таких сервисов является SemaphoreCI .
В этой статье мы рассмотрим, как использовать собственные сценарии и инструменты развертывания, чтобы продолжить процесс развертывания после успешного тестирования.
Мы будем использовать SemaphoreCI для непрерывной доставки и Deployer для отправки нашего кода на производственный сервер DigitalOcean. Если вы не знакомы с Deployer, рекомендуем вам ознакомиться с этим введением .
Демо-приложение
Мы будем использовать 500-пиксельное приложение, которое загружает фотографии с рынка. Он был построен с использованием Laravel, и вы можете прочитать полную статью о его процессе сборки здесь и найти репозиторий на GitHub .
Создание сценария развертывания
Мы используем Deployer, определяя серверы, а затем создавая задачи, которые обрабатывают процесс развертывания приложения на этих серверах. Наш скрипт deploy.php
выглядит так:
<?php require_once "recipe/common.php"; set('ssh_type', 'native'); set('default_stage', 'staging'); env('deploy_path', '/var/www'); env('composer_options', 'install --no-dev --prefer-dist --optimize-autoloader --no-progress --no-interaction'); set('copy_dirs', [ 'app/commands', 'app/config', 'app/controllers', 'app/database', 'app/lang', 'app/models', 'app/src', 'app/start', 'app/tests', 'app/views', 'app/filters.php', 'app/routes.php', 'bootstrap', 'public', 'composer.json', 'composer.lock', 'artisan', '.env', ]); set('shared_dirs', [ 'app/storage/cache', 'app/storage/logs', 'app/storage/meta', 'app/storage/sessions', 'app/storage/views', ]); set('writable_dirs', get('shared_dirs')); set('http_user', 'www-data'); server('digitalocean', '174.138.78.215') ->identityFile() ->user('root') ->stage('staging'); task('deploy:upload', function() { $files = get('copy_dirs'); $releasePath = env('release_path'); foreach ($files as $file) { upload($file, "{$releasePath}/{$file}"); } }); task('deploy:staging', [ 'deploy:prepare', 'deploy:release', 'deploy:upload', 'deploy:shared', 'deploy:writable', 'deploy:symlink', 'deploy:vendors', 'current',// print current release number ])->desc('Deploy application to staging.'); after('deploy:staging', 'success');
Вам следует прочитать статью Deployer, если вы хотите узнать больше о том, что делает этот конкретный скрипт. Наш следующий шаг — настроить проект SemaphoreCI. Пожалуйста, прочитайте статью об ускоренном курсе, если вы никогда не пробовали SemaphoreCI раньше, и делайте это.
Настройка развертывания
Чтобы настроить стратегию развертывания, нам нужно перейти на страницу проекта и нажать « Set Up Deployment
.
Далее мы выбираем универсальную опцию развертывания, так что SemaphoreCI дает нам свободу добавлять ручную настройку.
После выбора автоматического развертывания SemaphoreCI даст нам возможность задавать команды развертывания. Разница между ручным и автоматическим заключается в том, что автоматическое развертывание запускается после каждого успешного теста, а ручное развертывание позволяет нам развертывать любой успешный коммит.
Мы можем включить файл deployer.phar в наше хранилище в виде файла PHAR или потребовать его с помощью Composer. В любом случае, команды будут похожи.
Если мы решили развернуть приложение с использованием SSH, SemaphoreCI дает нам возможность хранить наш закрытый ключ SSH на своих серверах и сделать его доступным на этапе развертывания.
Примечание . SemaphoreCI рекомендует создать новый ключ SSH специально для процесса развертывания. В случае, если кто-то украл наши ключи или что-то еще, мы можем легко отозвать его. Ключ также будет зашифрован перед сохранением его на своем конце.
Ключ будет доступен в ~/.ssh/id_rsa
, поэтому identityFile()
можно оставить по умолчанию.
Нажмите, чтобы развернуть
Теперь, когда все настроено, нам нужно зафиксировать некоторые изменения в репозитории, чтобы запустить процесс интеграции и развертывания.
// Edit something git add . git commit -am "Updated deploy" git push origin master
Если что-то пошло не так, мы можем щелкнуть по неудачному процессу развертывания и просмотреть журналы для дальнейшего изучения проблемы.
Приведенный выше снимок экрана является неудачной фиксацией из-за того, что команда php artisan clear-compiled
возвращает ошибку, так как расширение mcrypt
не было включено.
Примечание . Еще одна полезная уловка, которую предоставляет SemaphoreCI, — это SSHing к серверу сборки, чтобы увидеть, что пошло не так.
Другие инструменты развертывания
Тот же процесс, который мы использовали здесь, может быть применен к любому другому инструменту развертывания. Например, Laravel Envoy может быть настроен так:
@servers(['web' => 'root@ip-address']) @task('deploy', ['on' => 'web']) cd /var/www @if($new) {{-- If this is the first deployment --}} git init git remote add origin [email protected] @endif git reset --hard git pull origin master composer update composer dumpautoload -o @if($new) chmod -R 755 storage php artisan storage:link php artisan key:generate @endif php artisan migrate --force php artisan config:clear php artisan route:clear php artisan optimize php artisan config:cache php artisan route:cache php artisan view:clear @endtask
И на этапе команды развертывания мы установим и запустим Envoy:
cd /var/www composer global require "laravel/envoy=~1.0" envoy run deploy
Это оно! Envoy теперь аутентифицируется с помощью ключа, который мы добавили, и запускает указанную нами команду обновления.
Вывод
Инструменты CI / CD значительно улучшают рабочий процесс разработчика и, безусловно, помогают командам интегрировать новый код в производственные системы. SemaphoreCI — отличный выбор, который я рекомендую за его простой в использовании интерфейс и прекрасную поддержку. Если у вас есть какие-либо комментарии или вопросы, пожалуйста, оставьте их ниже!