Integração contínua para aplicações PHP usando Github Actions \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 07 Horas 

 54 Min 

 24 Seg 

   Tempo restante da oferta: 07 54 24 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Integração contínua para aplicações PHP usando Github Actions  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Integração contínua para aplicações PHP usando Github Actions

 Veja como usar Github Actions para criar um workflow de análise e teste do seu projeto desenvolvido em PHP

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/15163425/github-actions.png)  

[Github Actions](https://github.com/features/actions) é um serviço relativamente novo e, ainda que em estágio beta, possui boa estabilidade. Ele permite que criemos workflows com jobs a serem executados a partir dos eventos disparados no Github. Então, por exemplo, sempre que um novo *pull request* é criado ou que um *push* é feito no Github, são exemplos de eventos que podem disparar a execução de workflows. Esse serviço favorece muito a implementação de integração e entrega contínua sem que haja a necessidade de sairmos do Github para serviços externos como Travis, CircleCI etc.

No caso específico do [PHP](https://www.treinaweb.com.br/blog/o-que-e-php/ "O que é PHP?") podemos criar um *workflow* para que a cada novo *push* em determinado *branch* dispare a execução de um job para rodar os testes unitários do projeto, executar o [PHPStan](https://github.com/phpstan/phpstan) (analisador estático) e até mesmo executar o [PHP Insights](https://phpinsights.com/) para avaliar a qualidade do código. Enfim, é possível executar qualquer ferramenta que faça sentido pro contexto do projeto.

Mas, há de ressaltar, o Github Actions é muito mais que isso. Possui uma infinidade de eventos que podem ser trabalhados. Nesse artigo focaremos na integração contínua de uma aplicação PHP tradicional, no sentido de rodar testes unitários, executar o PHPStan e o PHP Insights a cada novo *push* ou *pull request* a fim de garantir que o código esteja dentro dos parâmetros exigidos pela equipe antes dele ser incorporado. Mas o Github Actions pode ser usado para qualquer projeto de qualquer linguagem.

[  ![Laravel - Desenvolvimento de APIs REST](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/laravel.svg)   Curso Laravel - Desenvolvimento de APIs REST Conhecer o curso ](https://www.treinaweb.com.br/curso/laravel-desenvolvimento-de-apis-rest)

**No que se baseia o Github Actions?**

O *Github Actions* se baseia em *Workflows* que são fluxos de trabalho, por exemplo: Build, Teste e Publicação poderiam ser três tipos de workflows. Cada Workflow deve possuir um ou mais jobs. O Job refere-se à execução de uma tarefa, por exemplo, poderíamos em um workflow termos um job para dar build nos assets e outros job para executar os testes. É no workflow que configuramos quais eventos e ambientes (ubuntu, macOS etc) os nossos jobs serão executados. Em resumo, temos um workflow que possui N jobs e um job possui N steps (ações). Veremos isso na prática daqui a pouquinho, o que tornará mais fácil de visualizar a dinâmica da coisa toda.

**O Github Actions é pago ou grátis?**

É grátis para repositórios públicos e pago para repositórios privados com cobrança por minuto de execução. Na página do [Github Actions](https://github.com/features/actions) você consegue visualizar melhor os detalhes de cobrança. Lembrando que enquanto estiver em fase beta o serviço estará grátis tanto para repositórios públicos quanto para privados.

**O que eu preciso fazer para começar a usar?**

Como o serviço ainda está em beta é preciso que você se [inscreva](https://github.com/features/actions/signup/?account=KennedyTedesco) para utilizá-lo. Basta que você esteja logado na sua conta do Github e então clicar no botão “*Sign up for the beta*”:

![Tela de inscrição do Github Actions](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14194842/github-actions-beta.png)

Depois é só confirmar:

![Tela de confirmação](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14195029/github-actions-beta2.png)

## O projeto de teste

Criei um projeto de uma classe e um método só, para que foquemos no assunto central do artigo, que se trata da criação de um Workflow de teste e validação do código do nosso projeto.

O nosso Workflow executará as seguintes ferramentas:

- PHPUnit
- PHPStan
- PHP Insights

Recomendo que você leia o artigo [Ferramentas essenciais para um projeto PHP](https://www.treinaweb.com.br/blog/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](https://github.com/KennedyTedesco/github-actions-php/actions), clique nela:

![Tela com a lista dos Workflows](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14204421/github-actions-workflows.png)

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

![Tela com listagem de commits e status](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14204825/github-actions-commits.png)

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:

https://github.com/KennedyTedesco/github-actions-php/commit/4a5be2bbaf5a09247321efa6c2e799f4c621d699/checks?check_suite_id=264838943

![Tela de passos de execução](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14205201/github-actions-steps.png)

É 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

![Tela de um commit com falha proposital](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14205538/github-actions-wrong-test.png)

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:

https://github.com/KennedyTedesco/github-actions-php/commit/9f6fb1142a5e2b98a2ecedd904eaa10301c1eb0e/checks?check_suite_id=264846074

![Workflow com teste de falha](https://dkrn4sk0rn31v.cloudfront.net/2019/10/14205758/github-actions-failed.png)

[  ![Git - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/git.svg)   Curso Git - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/git-fundamentos)

## Definindo o Workflow no projeto

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`:

```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”:

```yaml
  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:

```yaml
  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:

```yaml
    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](https://github.com/sdras/awesome-actions "https://github.com/sdras/awesome-actions")

Voltando ao nosso workflow, a segunda action:

```yaml
      - 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

```dockerfile
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

```yaml
      - 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` é:

```shell
#!/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:

```yaml
      - 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](https://github.com/nektos/act "act") para localmente testar as suas actions. Incrível, não?

**Concluindo**

Eu encorajo que você leia a [documentação](https://help.github.com/en/categories/automating-your-workflow-with-github-actions) e veja todos os recursos e opções disponíveis. Por exemplo, na página [Workflow syntax for GitHub Actions](https://help.github.com/en/articles/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](https://help.github.com/en/articles/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!

- [ #PHP ](https://www.treinaweb.com.br/blog/tag/php)
- [ #GitHub ](https://www.treinaweb.com.br/blog/tag/github)
- [ #Continuous Integration ](https://www.treinaweb.com.br/blog/tag/continuous-integration)

Autor

 ![Kennedy Tedesco](//secure.gravatar.com/avatar/236c86e9469327ba7a9250ff15fef424?d=mm)

## Kennedy Tedesco

 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](https://twitter.com/KennedyTedesco) 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/camadas-e-componentes-do-padrao-arquitetural-porto-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ Camadas e componentes do padrão arquitetural Porto ](https://www.treinaweb.com.br/blog/camadas-e-componentes-do-padrao-arquitetural-porto) 

     Conheça as camadas e componentes do padrão arquitetural Porto. Nesse artigo vamos aprender como cada camada se comunica e a responsabilidade dos componentes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/06/11140050/sockets-redes-tcp-udp-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Programação de Sockets em PHP ](https://www.treinaweb.com.br/blog/programacao-de-sockets-em-php) 

     Neste artigo veremos uma introdução à programação de sockets com o PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/background-post-400x280.jpg)  [ Algoritmos ](https://www.treinaweb.com.br/blog/categoria/algoritmos) 

     10 anos atrás

    ##  [ Complexidade ciclomática, análise estática e refatoração ](https://www.treinaweb.com.br/blog/complexidade-ciclomatica-analise-estatica-e-refatoracao) 

     Veremos nesse artigo como se dá a mensuração da complexidade ciclomática; como os analisadores estáticos podem nos auxiliar e a importância da refatoração.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/24120107/streams-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Streams no PHP ](https://www.treinaweb.com.br/blog/streams-no-php) 

     Você, desenvolvedor PHP, já teve a oportunidade de trabalhar mais intimamente com Streams? Se você já teve ou não, esse artigo é pra você! Uma introdução ao essencial sobre o assunto.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/04204421/capa-alm--400x280.png)  [ Governança ](https://www.treinaweb.com.br/blog/categoria/governanca) 

     8 anos atrás

    ##  [ Você sabe o que é ALM? ](https://www.treinaweb.com.br/blog/voce-sabe-o-que-e-alm) 

     Veja neste artigo o que vem a ser o ALM (Application Lifecycle Management).

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/08152035/capa-TENDÊNCIAS-2019-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     8 anos atrás

    ##  [ Tendências de TI para 2019 ](https://www.treinaweb.com.br/blog/tendencias-de-ti-para-2019) 

     Confira neste artigo quais são as tendências de tecnologia para este ano.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/11/25224114/REDHAT-OPENSHIFT-400x280.png)  [ DevOps ](https://www.treinaweb.com.br/blog/categoria/devops) 

     8 anos atrás

    ##  [ O que é o OpenShift? ](https://www.treinaweb.com.br/blog/o-que-e-o-openshift) 

     Conheça mais sobre o OpenShift e como ele funciona.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/12180648/dev-ops-400x280.png)  [ DevOps ](https://www.treinaweb.com.br/blog/categoria/devops) 

     8 anos atrás

    ##  [ Afinal, o que é DevOps? ](https://www.treinaweb.com.br/blog/afinal-o-que-e-devops) 

     Você sabe o que é DevOps? Confira neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/03/29143505/TW-ENTREVISTAS-JOAO-BATISTA-400x280.png)  [ Entrevistas ](https://www.treinaweb.com.br/blog/categoria/entrevistas) 

     9 anos atrás

    ##  [ TW Entrevista 03: João Batista Neto ](https://www.treinaweb.com.br/blog/tw-entrevista-03-joao-batista-neto) 

     Fizemos uma série de entrevistas com desenvolvedores chamada "TW Entrevista". O entrevistado de hoje é o João Batista Neto, engenheiro de aplicações e administrador do fórum iMasters e iMasters Code.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/12200152/serverless-400x280.png)  [ Computação em nuvem ](https://www.treinaweb.com.br/blog/categoria/computacao-em-nuvem) 

     8 anos atrás

    ##  [ Serverless: uma introdução ](https://www.treinaweb.com.br/blog/serverless-uma-introducao) 

     Nesse artigo uma introdução à arquitetura Serverless e um pouco sobre o AWS Lambda, um dos principais serviços do mercado.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/ANGULAR-400x280.png)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     7 anos atrás

    ##  [ O que é o Angular e para que serve? ](https://www.treinaweb.com.br/blog/o-que-e-o-angular-e-para-que-serve) 

     Frameworks SPA atualmente são um padrão de mercado quando falamos sobre desenvolvimento front-end. Neste artigo, vamos abordar o Angular, um dos mais populares.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/03/dicionario-programador-iniciante-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     4 anos atrás

    ##  [ Dicionário básico para quem está iniciando na programação ](https://www.treinaweb.com.br/blog/dicionario-basico-para-quem-esta-iniciando-na-programacao) 

     Você está iniciando na programação e está perdido nos termos e siglas que você lê ou ouve falar por aí? Confira neste artigo um guia rápido para você começar a se familiarizar com esse universo da TI.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **07h 54min 24s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
