Posted on: September 21, 2022 10:52 AM
Posted by: Renato
Views: 1211
Laravel: Como automatizar a implantação usando git e webhooks
Para nosso tutorial, precisaremos de algumas coisas antes de prosseguirmos:
- Um projeto Laravel
- Alguma versão do git (o Github seria usado para este tutorial, mas o processo é praticamente o mesmo)
- Acesso a um servidor (você pode testar localmente, mas não será o mesmo)
- Olhos
- Dedos
- Um cérebro
- ok vou parar agora...
Vamos começar do início, um projeto laravel
Quadro muito bonito, (sem arrependimentos de trapacear no asp.net [isso não é uma confissão 😶]).
A primeira coisa que queremos fazer em nosso projeto é usar o composer para instalar o symfony/process em nosso projeto, vamos precisar deste pacote mais tarde.
Você pode fazer isso executando este comando simples na raiz do seu projeto
$ composer require symfony/process
Isso carregaria os carregáveis necessários para o seu arquivo composer.json, para adicionar o pacote ao seu projeto, basta executar este comando
$ composer update
Isso deve adicionar o pacote à sua pasta de fornecedores e gerar as classes necessárias e assim por diante.
Aqui está um link para a documentação do Symfony onde você pode ler mais sobre isso.
Depois que isso for feito, vamos precisar de um script de shell que irá manter o molho para nossa mágica.
É assim que nosso script de shell se parece:
#!/bin/sh# ativa o modo de manutenção
php artisan down# atualiza o código fonte
git pull# atualizar dependências do PHP
composer install --no-interaction --no-dev --prefer-dist# --no-interaction Não faça nenhuma pergunta interativa
# --no-dev Desativa a instalação de pacotes require-dev.
# --prefer-dist Força a instalação do pacote dist mesmo para versões dev.# atualiza banco de dados
php artesão migrar --force# --force Necessário para execução em produção.# pare o modo de manutenção
php artisan up
Podemos chamar esse arquivo de deploy.sh
A verdade é que este é apenas um modelo, você pode modificar este script para atender às suas necessidades.
Agora você tem que tornar este script executável
$ sudo chmod +x deploy.sh
Dependendo do seu ambiente de produção, esse método é muito arriscado, então se você é um daqueles loucos por “segurança”, apenas bata palmas e siga em frente…
Mas se você é um com a força (Linux) por favor prossiga, só fica interessante a partir daqui.
Agora que temos nosso script pronto, precisaríamos nos preparar para nosso git webhook.
No GitHub, na página do seu repositório, selecione a guia Configurações e, em seguida, Webhooks na navegação à esquerda. Ou vá diretamente para a URL:
https://github.com/<sua conta>/<seu repositório>/settings/hooks
Clique em Adicionar Webook:
- URL de carga útil: http://example.com/deploy
- Segredo: Alguma String longa aleatória (quanto mais longa, melhor 😏)
Agora precisaríamos adicionar este webhook ao nosso projeto (é aí que fica divertido)
Em primeiro lugar, precisamos adicionar nosso segredo ao projeto ou, nos termos do Layman, precisamos fazer ou projeto entender que há um segredo que uma url precisa antes de prosseguirmos.
Em config/app.php, adicione esta linha:
'deploy_secret' => env('APP_DEPLOY_SECRET'),
Em seu arquivo .env, adicione seu segredo do webhook:
APP_DEPLOY_SECRET=alterar agora ou enfrentar as consequências
Agora terminamos a parte manual, vamos escrever alguns códigos
Precisamos fazer um controlador que abrigue nossa lógica e processo para fazer nosso processo de implantação ser executado. Agora vamos fazer nosso controlador…
$ php artisan make:controller DeployController
Vou chamar esse controlador de DeployController para simplificar.
Então adicionaríamos todo o nosso código, não se preocupe que explicarei a maior parte. No final, nosso controlador deve ficar assim:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;
use Symfony\Component\Process\Process;class DeployController extends Controller
{
public function deploy(Request $request)
{
$githubPayload = $request->getContent();
$githubHash = $request->header('X-Hub-Signature'); $localToken = config('app.deploy_secret');
$localHash = 'sha1=' . hash_hmac('sha1', $githubPayload, $localToken, false ); if (hash_equals($githubHash, $localHash)) {
$root_path = base_path();
$process = new Process('cd ' . $root_path . '; ./deploy.sh');
$process->run( function ($type, $buffer) {
echo $buffer;
});
}
}
}
Antes de prosseguir, bata palmas, não é fácil recuar seu código aqui no medium.com.
O código acima faz o seguinte:
- Garante que a postagem seja solicitada do GitHub usando o X-Hub-Signature exclusivo do github. Você pode remover essa verificação específica se estiver se sentindo aventureiro, mas recomendo que você a mantenha.
Você sempre pode consultar a documentação do sistema de controle de versão do git que está usando para sua própria assinatura X - Garante que a solicitação de postagem esteja vindo do seu repositório do github verificando seu segredo de implantação (em um ambiente de produção, há outras verificações antes e depois disso, portanto, não se preocupe muito com a aparência frágil da segurança)
- Usa o processo symfony para executar o script deploy na raiz do caminho do projeto em um ambiente shell
Essa é a essência básica sobre o código acima, vamos continuar adicionando uma rota ao webhook que adicionamos ao github (ou qualquer inglês que soe adequado que se encaixe, inglês é difícil)
Navegue até route/web.php em seu projeto e adicione esta linha
Route::post('deploy', 'DeployController@deploy');
O método para essa rota deve ser sempre um método post porque o github envia apenas solicitações de postagem para webhooks, então você pode chamar isso de outra verificação, se quiser.
Em segundo lugar, para evitar erros de validação de token CSRF, adicionamos a rota acima à nossa rota de exceção no Middleware/VerifyCsrfToken.php
Que quando feito deve ficar assim:
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken como Middleware;class VerifyCsrfToken extends Middleware
{
/**
* Os URIs que devem ser excluídos da verificação de CSRF.
*
* @var array
*/
protected $except = [
'/deploy',
];
}
Depois disso, no seu servidor altere o grupo unix da pasta do seu projeto para www-data. Isso é necessário para permitir que o script de shell seja executado em paz (permitir que o usuário www-data atualize a pasta do projeto) isso pode ser feito simplesmente por:
$ sudo chgrp -R www-data .
Então, depois de tudo isso, você está feito.
Com isso, agora você configurou com sucesso um processo simples de autodeployment (coughs Continuous Deployment) em seu projeto usando git (enquanto Jenkins e Travis estão tendo algum tempo sozinhos).
Se você chegou até aqui, Parabéns!!!
Donate to Site
Renato
Developer
-
Renato Lucena - há 2 anos
Dicas => [ https://dev.to/kenean50/automate-your-laravel-app-deployment-with-github-actions-2g7j ];