# Dart Analyze and Fix Workflow

{% hint style="info" %}
Essa etapa é uma repetição praticamente do uso do left hook, que trata localmente essas análises. Mas como segurança e garantia de qualidade, vamos adicionar a action também no repositório, e fazer com que pull requests só sejam aceitas casos essa action passe com sucesso.

A ideia desse workflow é que ele rode sempre que uma Pull Request for aberta nos projetos. Ao rodar, o workflow executa o comando dart fix --apply para aplicar correções no código.

Após essa correção, caso haja alterações, o workflow faz o commit automático das modificações. Em seguida, roda o dart analyze para verificar se o código ainda possui problemas. Caso o analyze encontre erros, o workflow falha. Caso contrário, ele finaliza com sucesso, liberando o merge da Pull Request.
{% endhint %}

## 🍴 Dart Analyze and Fix Workflow

Como realizar a criação de um workflow no GitHub Actions para aplicar correções e verificar código.

A ideia desse workflow é que ele rode sempre que uma **Pull Request** for aberta nos projetos. Ao rodar, o workflow executa o comando `dart fix --apply` para aplicar correções no código, como por exemplo:

* Adicionar `const` onde aplicável
* Remover `imports` não utilizados
* Corrigir práticas recomendadas do uso do Dart, entre outros

Após essa correção, caso haja alterações, o workflow faz o commit automático das modificações. Em seguida, roda o `dart analyze` para verificar se o código ainda possui problemas. Caso o `analyze` encontre erros, o workflow falha. Caso contrário, ele finaliza com sucesso, liberando o merge da Pull Request.

***

📌 **Importante**\
Embora o processo automatizado via CI seja útil, uma **alternativa recomendada é aplicar as correções localmente** antes de abrir a PR. Isso evita commits automáticos no pipeline e dá mais controle ao desenvolvedor.\
Ferramentas como [**Lefthook**](https://github.com/evilmartians/lefthook) podem ser configuradas para rodar `dart fix` e `dart analyze` nos ganchos de pré-commit, garantindo a qualidade do código ainda no ambiente local.

***

### 🔧 Como adicionar o workflow no GitHub Actions

Dentro da pasta `.github`, que fica na raiz do projeto (caso ela não exista, basta criar), é necessário adicionar uma subpasta chamada `workflows`, e dentro dela, criar o arquivo `dart_analyze.yml` com o conteúdo abaixo:

```yaml
name: Dart CI

on: [pull_request]

jobs:
  analyze_and_fix:
    runs-on: ubuntu-latest

    permissions:
      contents: write # To push a branch

    steps:
      # Faz o checkout do código do repositório
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }}

      # Configura o SDK Flutter
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.10.5" # Especifique a versão do Flutter aqui. Remova essa linha se quiser a versão estável mais recente.

      # Instala as dependências do Flutter
      - name: Install dependencies
        run: flutter pub get

      - name: Build Runner Files Generation
        run: flutter pub run build_runner build --delete-conflicting-outputs

      # Tentativa de correção automática de problemas
      - name: Auto-fix issues
        run: dart fix --apply

      - name: Setup .env
        run: cp .env.example .env.staging && cp .env.example .env.homolog

      # Roda o Dart Analyzer para verificar se ainda existem problemas
      - name: Run Dart Analyzer
        run: dart analyze

      # Faz commit e push das correções, se houver
      - name: Commit fixes
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git commit -am "Apply dart fixes" || echo "No changes to commit"
          git push origin ${{ github.head_ref }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

{% hint style="warning" %}
É importantissimo perceber que, nesse caso aqui, o step `Setup .env` é necessário apenas em projetos que utilizam variáveis de ambiente com `.env`. Caso não seja o seu caso, você pode remover esse step com segurança.
{% endhint %}

{% hint style="warning" %}
Na sessão de Setup Flutter, é importante que seja adicionado a versão atual do seu projeto.
{% endhint %}

Após isso, basta subir essas alterações para seu repositório, que a action vai rodar seu workflow a partir das próximas PR's abertas.
