Ambiente de Desenvolvimento PHP com Docker - Parte 3 - Git Pre-commit Hook & Automatização

Danilo Lutz
6 min readSep 12, 2018

--

E aí pessoal, tudo mundo nos trinques? Espero que sim…

Vamos a Parte 3 do nosso ambiente PHP. Nessa parte vamos facilitar algumas coisas, leia-se: automatizar algumas coisas. E como as pessoas que executaram a Parte 1 e a Parte 2 sabem, temos que fazer manualmente a execução das ferramentas de qualidade de código.

Do que precisaremos:

Engraçadão eu né?

Bora para ação?

Vamos então adicionar na raiz do nosso super projeto o seguinte arquivo:

O script de pre-commit vai funcionar da seguinte maneira:

  1. Da linha 3 até a linha 14 o script irá pegar todos os arquivos que o git entender que foram modificados.
  2. Da linha 16 até a linha 26 o script irá checar através do comando php se algum arquivo modificado possui erros de sintaxe.
  3. A linha 31 irá executar o phpcs para os arquivos que foram alterados verificando se possuem alguns erros, caso algum arquivo possua erros, o passo 4 será executado.
  4. Da linha 32 até a linha 36 o script irá tentar corrigir o que for capaz através do phpcbf para os aquivos que foram alterados.
  5. A linha 38 irá executar o phpcs novamente para os arquivos que foram corrigidos no passo 4, verificando se ainda possuem algum erro que o phpcbf não foi capaz de corrigir, caso algum arquivo ainda possua erros a listagem com os erros será exibida.

Agora para que funcione como queremos, devemos adicionar as seguintes linhas ao final da seção setup: do nosso arquivo Makefile vejam abaixo:

Quando executado o comando make setup ele irá copiar para a pasta do git a qual controla os hooks, o arquivo pre-commit-hook. Hooks são scripts que podem ser criados para customizar o funcionamento padrão do git. Não esqueçam que sempre antes de executarem o make setup devemos executar, na pasta raiz do projeto o comando docker-compose stop para desligar os containers em execução, caso estejam.

Agora vamos enviar tudo para os nossos respectivos repositórios no Github, com os comandos:

$ git add .
$ git commit -m"Segundo commit - Parte 3"
$ git push origin master

Pronto, podemos novamente, apagar ou renomear a pasta como fizemos anteriormente na Parte 2 e clonamos novamente, executando em seguida os seguintes comandos:

$ git clone https://github.com/seu-usuario/nome-do-seu-repositorio.git
$ cd nome-do-seu-repositorio
$ make setup

Ele deverá fazer tudo sozinho e a gente só precisa conferir novamente o phpinfo() digitando no navegador:

http://localhost/

Deu certo galera? Ótimo! Agora vamos fazer algumas alterações no nosso index.php como mostrado abaixo:

<?phpclass minha_Classe {
public static function imprimir_info() {
echo phpinfo();
}
}
minha_Classe::imprimir_info();

Da hora, esse código desse jeito funciona, mas está de acordo com a convenção PSR? Vamos ver a automatização funcionando em sua plenitude? Para isso, após alterarmos o index.php vamos executar alguns comandos já conhecidos:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.phpno changes added to commit (use "git add" and/or "git commit -a")$ git add .
$ git commit -m"Terceiro commit - Parte 3"

Nesse exato momento, veremos o que acontece..

Checking PHP Lint...
No syntax errors detected in ./index.php
Running Code Sniffer...
E 1 / 1 (100%)
FILE: /project/index.php
--------------------------------------------------------------------
FOUND 7 ERRORS AFFECTING 3 LINES
--------------------------------------------------------------------
3 | ERROR | [ ] Each class must be in a namespace of at least one
| | level (a top-level vendor name)
3 | ERROR | [ ] Class name "minha_Classe" is not in PascalCase
| | format
3 | ERROR | [x] Opening brace of a class must be on the line after
| | the definition
4 | ERROR | [ ] Method name "minha_Classe::imprimir_info" is not in
| | camel caps format
4 | ERROR | [x] Opening brace should be on a new line
4 | ERROR | [x] Whitespace found at end of line
5 | ERROR | [x] Whitespace found at end of line
--------------------------------------------------------------------
PHPCBF CAN FIX THE 4 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------
Time: 166ms; Memory: 6MbCoding standards errors have been detected. Running phpcbf...
F 1 / 1 (100%)
PHPCBF RESULT SUMMARY
--------------------------------------------------------------------
FILE FIXED REMAINING
--------------------------------------------------------------------
/project/index.php 4 3
--------------------------------------------------------------------
A TOTAL OF 4 ERRORS WERE FIXED IN 1 FILE
--------------------------------------------------------------------
Time: 45ms; Memory: 6MbRunning Code Sniffer again...
E 1 / 1 (100%)
FILE: /project/index.php
--------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 2 LINES
--------------------------------------------------------------------
3 | ERROR | Each class must be in a namespace of at least one level
| | (a top-level vendor name)
3 | ERROR | Class name "minha_Classe" is not in PascalCase format
5 | ERROR | Method name "minha_Classe::imprimir_info" is not in
| | camel caps format
--------------------------------------------------------------------
Time: 38ms; Memory: 6MbErrors found not fixable automatically

Wowww!! Não, não estava no padrão do PSR. O que ele pôde corrigir automaticamente, ele corrigiu, o que não pôde é com a gente, então…

Vamos corrigir o index.php segundo as recomendações da ferramenta.

<?php
namespace MeuSistema;
class MinhaClasse
{
public static function imprimirInfo()
{
echo phpinfo();
}
}
MinhaClasse::imprimirInfo();

E novamente executaremos a sequência de comandos:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.phpno changes added to commit (use "git add" and/or "git commit -a")$ git add .
$ git commit -m"Terceiro commit - Parte 3"
Checking PHP Lint...
No syntax errors detected in ./index.php
Running Code Sniffer...
. 1 / 1 (100%)
Time: 38ms; Memory: 6Mb[master 26ab99c] Terceiro commit - Parte 3
1 file changed, 4 insertions(+), 2 deletions(-)

Uia, ele fez tudo e agora não barrou nosso commit. Muito massa!! Não vamos esquecer de guardar no nosso GitHub.

$ git push origin master

Agora vamos a um plus…

Mas você falou que não precisaríamos de nada além da IDE, Git e do Docker.

É falei… O peixe morre pela boca, como diz o velho deitado (Afff Danilo). Como quase sempre, cumprindo o que falo, vamos agora configurar o PhpMyAdmin no nosso ambiente.

Vamos ao arquivo docker-compose.yml e adicionemos as seguintes linhas (24 até 29):

Adivinhem o que devemos fazer agora? Executamos o $ make setup. Em seguida checamos o funcionamento acessando o endereço: localhost:8080 no nosso navegador, nosso usuário é root e a senha é a que foi definida na linha 21, vocês também podem acessar com o usuário e senha definidos nas linhas 19 e 20.

PhpMyAdmin funcionando \o/.

Agora com o PhpMyAdmin funcionando, adeus Workbench, podemos enviar tudo para o Github com os comandos:

$ git add .
$ git commit -m"Quarto commit - Parte 3"
$ git push origin master

Podemos também fazer um teste mais radical, que seria renomear ou excluir a pasta do projeto, como vocês já sabem… pois já fizemos isso anteriormente.

Ah! Antes que eu me esqueça: se quiserem ver como ficou o meu repositório no Github acessem: https://github.com/danilolutz/ambiente-php

Bom galera, por hoje fico por aqui…

Por favor, não deixem de compartilhar, comentar e deixar seu feedback.

Referências:

--

--

Danilo Lutz

Obsessed for learning. OOP, PHP, C# and Python lover. Since 2003 coding...