Ferramentas essenciais para um projeto PHP para conhecer um pouco mais sobre elas.
O projeto completo com o Workflow criado e ativo você pode visualizar em:
https://github.com/KennedyTedesco/github-actions-php
Antes de entrarmos na parte que toca a configuração do Workflow, primeiro quero mostrar o funcionamento visual dele lá no Github.
No projeto tem uma aba chamada Actions, clique nela:
Ela lista os Workflows configurados para o projeto. No nosso caso o workflow se chama “App Workflow”. Do lado direito temos a relação dos eventos que dispararam a execução dele. Ele foi disparado três vezes no evento de “push”, ou seja, quando subimos pro Github alterações.
No primeiro evento (de baixo pra cima) o workflow foi executado com sucesso, sem nenhum erro. Os testes passaram, o PHPStan não reportou nenhum erro e as métricas do PHP Insights estavam todas boas.
Já no segundo teste houve uma falha. Ah, o resultado da execução dos workflows também aparece na listagem dos commits:
https://github.com/KennedyTedesco/github-actions-php/commits/master
Observe os ícones de sucesso e erro.
Voltando na tela anterior, clique em um evento em que a execução do workflow teve sucesso, por exemplo, esse aqui:
É nessa tela que vemos os Jobs e suas Steps (passos onde ações são executadas). No caso, o Job “Tests” (à esquerda) executou todas as Steps (ações) da tela escura à direita. As ações que configuramos foram no sentido de definir o ambiente PHP em que a execução ocorrerá, instalação das dependências do Composer no projeto e execução das ferramentas de análise e teste.
O evento que causou falha na execução do workflow se deu por causa desse commit:
https://github.com/KennedyTedesco/github-actions-php/commit/9f6fb1142a5e2b98a2ecedd904eaa10301c1eb0e
Explicitamente fiz um teste falhar ao fazer ele comparar 4 === 8
.
Quando subi essa alteração para o Github, um evento de push
foi disparado fazendo executar o workflow, que então falhou:
Agora que já vimos como funciona lá na interface do Github a parte visual da execução do workflow, veremos como de fato podemos criar-lo dentro do nosso projeto.
Primeiro de tudo, devemos criar uma pasta chamada .github
dentro do projeto. E, dentro dessa pasta, devemos criar uma pasta chamada workflows
.
- github-actions-php
- - .github
- - - workflows
- - - - main.yaml
É dentro da pasta workflows
que criamos os arquivos de definição dos nossos workflows. São arquivos yaml
. Criamos apenas um workflow, portanto teremos apenas um arquivo yaml nessa pasta e demos o nome dele de main.yaml
:
name: App Workflow
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
build:
name: Tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Setting up PHP
uses: ./.github/actions/php
- name: Installing Composer
run: ./.github/scripts/run-composer.sh
- name: Running PHPStan
run: ./.github/scripts/run-phpstan.sh
- name: PHP Insights
run: ./.github/scripts/run-phpinsights.sh
- name: Running PHPUnit
run: ./.github/scripts/run-phpunit.sh
Esse é o nosso workflow completo. Em name
definimos o nome dele.
Em on
especificamos em quais eventos de quais branches esse workflow será executado. No caso, estamos dizendo que ele será executado sempre que um push
ou um pull request
for feito para o branch master
.
Em jobs
é onde definimos os jobs. No caso, temos apenas um job chamado build
, veja que na estrutura do yaml eu dei o nome de build
mas ao definir o nome dele lá pro Github eu o chamei de “Tests”:
build:
name: Tests
Isso não importa muito, você vai definir o nome que achar mais conveniente e lógico para o que você estiver executando. Eu poderia tranquilamente tê-lo chamado de:
tests:
name: Tests
Sem problema algum.
A diretiva runs-on
do job especifica em qual ambiente a execução acontecerá. O ideal é você escolher o mesmo ambiente que você roda em produção.
Em steps
é onde executamos as ações do job. Um job pode executar N ações. A action Checkout é padrão, é ela quem clona o projeto no ambiente de execução. Veja que ela possui um endereço do Github:
steps:
- name: Checkout
uses: actions/checkout@master
Ela é mantida pelo Github e pode ser visualizada aqui: https://github.com/actions/checkout
Ou seja, podemos executar actions que estejam em repositórios arbitrários. Existe todo um ecossistema de actions que podem ser reutilizadas. Existe até mesmo um Marketplace de Actions no próprio Github:
https://github.com/marketplace?type=actions
Também tem uma lista de centenas de actions mantidas pela comunidade:
https://github.com/sdras/awesome-actions
Voltando ao nosso workflow, a segunda action:
- name: Setting up PHP
uses: ./.github/actions/php
Ela especifica que se trata de um Dockerfile contido em ./.github/actions/php
que instalará a versão 7.3 do PHP que será usada para rodar os testes e validações:
https://github.com/KennedyTedesco/github-actions-php/tree/master/.github/actions/php
FROM php:7.3-cli-alpine
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
Ou seja, podemos criar actions baseadas em Dockerfiles.
A terceira action:
https://github.com/KennedyTedesco/github-actions-php/blob/master/.github/scripts/run-composer.sh
- name: Installing Composer
run: ./.github/scripts/run-composer.sh
Veja que ao invés de uses
ela especifica run
, pois estamos definindo qual comando ou arquivo ela deverá executar ao invés de qual action ela deverá usar.
Essa action é responsável pela instalação das dependências do composer no projeto. Nesse ponto já teremos o PHP configurado. Eu gosto de trabalhar com arquivos shell script para definir as tarefas que serão executadas. O conteúdo do arquivo run-composer.sh
é:
#!/bin/sh
cp .env.ci .env
composer install --no-ansi --no-interaction --no-suggest --prefer-dist
Ela copia o arquivo .env.ci
para .env
na raiz do projeto e depois instala as dependências. O arquivo env.ci
não tem nenhuma utilidade para o nosso projeto, eu deixei ele criado apenas para mostrar o que você pode fazer quando estiver criando um workflow para uma aplicação Symfony ou Laravel que use variáveis de ambiente. Nesse sentido, você pode ter variáveis de ambiente específicas para a execução do workflow.
Ao invés de executar o arquivo run-composer.sh
poderíamos ter executado esses comandos diretamente no yaml
do workflow, por exemplo:
- name: Installing Composer
run: |
cp .env.ci .env
composer install --no-ansi --no-interaction --no-suggest --prefer-dist
Mas eu prefiro definir arquivos shell script.
As últimas três ações rodam o PHPStan, PHP Insights e PHPUnit, respectivamente. Também são simples arquivos shell script. E com isso fechamos a configuração do nosso workflow.
Testando localmente as suas actions
Você pode usar a ferramenta act para localmente testar as suas actions. Incrível, não?
Concluindo
Eu encorajo que você leia a documentação e veja todos os recursos e opções disponíveis. Por exemplo, na página Workflow syntax for GitHub Actions tem muita informação valiosa sobre as outras sintaxes e opções.
E, não menos importante, quando você for criar um workflow para sua aplicação de maior porte, você certamente precisará lidar com a integração de variáveis de ambiente entre os jobs e actions, para isso, sugiro que você leia Virtual environments for GitHub Actions.
Como não dá pra masterizar o assunto em um artigo, tentei focar no essencial, no principal para uma aplicação PHP tradicional. Mas essas mesmas ideias podem ser agregadas para que você crie sua integração contínua para Laravel, Symfony ou outro framework qualquer. Sem contar que além do workflow de teste, você poderia ter um workflow para uma tarefa de corrigir o estilo do seu código e criar um pull request disso de forma automatizada, por exemplo. Como também poderia ter workflows para entrega/deploy contínuos. As possibilidades são muitas.
Até a próxima!
Head de desenvolvimento. Vasta experiência em desenvolvimento Web com foco em PHP. Graduado em Sistemas de Informação. Pós-graduando em Arquitetura de Software Distribuído pela PUC Minas. Zend Certified Engineer (ZCE) e Coffee Addicted Person (CAP). @KennedyTedesco
Todos os artigosConheça as camadas e componentes do padrão arquitetural Porto. Nesse artigo vamos aprender como cada...
Neste artigo veremos o que é PHP e algumas de suas características e vantagens.
O PHP nunca esteve tão forte. Nesse artigo, algumas desconstruções de famosas falácias acerca do PHP...
Veja um pouco mais sobre o PHP 7 e, principalmente, as novidades do PHP 7.1, recém lançado.
O loop foreach no PHP é uma estrutura de repetição simples e flexível! Aprenda corretamente como uti...
Aprenda desde o início como declarar e acessar arrays no PHP. Veja o que são arrays, como trabalhar...
Aprenda como declarar variáveis no PHP, as principais regras de nomeação de variáveis, suas caracter...
Saiba o que são Iterators e Generators, bem como os seus casos de uso.
Iterator é um mecanismo que permite que um objeto seja iterado e ele próprio fica no controle granul...
Nesse post explicamos com exemplos tudo o que você precisa saber sobre definição de tipos em parâmet...
Aprenda como instalar o PHP e a extensão Xdebug no Windows. Ensinaremos os detalhes que você precisa...
Você, desenvolvedor PHP, já teve a oportunidade de trabalhar mais intimamente com Streams? Se você j...