Flutter + Fastlane + Github Actions
Tags: flutter, fastlane, cicd
Published: 2021-02-15 18:51:43


Neste post vamos abordar como configurar o Githbub Actions para realizar build e distribuir via Fastlane.

*Não sabe configurar o Fastlane? Então [leia aqui](https://dev.to/yagoliveira92/como-configurar-fastlane-para-firebase-app-distribution-android-e-ios-1p1d)*.

Primeiro, configuramos o arquivo `.yaml` para ser usado no Actions. Todos os arquivos das actions devem ficar dentro de `.github/workflows` na raiz do seu projeto. Estes arquivos serão lidos pelo Github e acionados conforme configurados.

Criado o arquivo `test_fastlane.yaml` colocamos primeiro:

```yaml
name: App Distribution With Fastlane

on:
  push:
    branches: [master]

```
Aqui definimos o nome da Action (isso facilita quando você tem mais de uma e quer filtrar) e a forma como ela vai ser acionada (aqui no caso ela vai executar a cada Pull Request aberto na branch develop).

Definido isso, continuamos:

```yaml
jobs:
  run_test:
    runs-on: macos-latest
```

`jobs` são os trabalhos que serão feitos na execução daquela action. Dentro dele você pode definir o que será instalado, o que vai ser executado e qual Sistema Operacional será utilizado. Vale lembrar que cada job executa de forma **simultânea e independente**, então não é interessante colocar jobs que sejam interligadas. Mas caso seja necessário utilize-as de forma assíncrona ou realizando [dependência entre jobs](https://docs.github.com/pt/actions/learn-github-actions/managing-complex-workflows#creating-dependent-jobs). 

Nos jobs você define o SO em `runs-on`. Estão disponíveis 3 SOs: Ubuntu, Windows e MacOS. 

Depois disso chegou a hora interessante: definir os `steps`:

```yaml
 steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Install Java
      uses: actions/setup-java@v1
      with:
        java-version: ${{ env.java_version }}
    - name: Cache Flutter
      uses: actions/cache@v2
      with:
        path: /opt/hostedtoolcache/flutter
        key: ${{ runner.OS }}-flutter-install-cache-${{ env.flutter_version }}

    - name: Install Flutter    
      uses: subosito/flutter-action@v1
      with:
        flutter-version:  ${{ env.flutter_version }}
    - name: Install dependencies
      run: flutter pub get
    - name: Generate Files
      run: flutter packages pub run build_runner build --delete-conflicting-outputs
    - name: App Test
      run: flutter test
    - name: Build iOS
      run: flutter build ios --no-codesign -t lib/config/main_production.dart
```
Aqui já colocamos todas as `steps` necessárias para poder executar os comandos do Flutter. Primeiro utilizamos a action que irá acessar seu repositório, em seguida instalar o Java e, por fim, instalar o Flutter. No Flutter inserimos o cache para que nas próximas execuções ele não precise baixar tudo novamente (lembre que cada minuto no Actions é precioso) e em seguida todos os comandos que forem necessários para realizar build e executar os testes no projeto.

No ambiente em que trabalho preferi definir dois `jobs`: Um para executar o build do iOS no MacOS e outro para executar o build do Android no Ubuntu. Motivo: 1 min de MacOS consome 10 do seu tempo total no Actions. Os 3min de build do Android que você fizer irá tirar 30 minutos do teu tempo total, portanto, fica mais barato realizar dois jobs (apesar de executarem praticamente os mesmos comandos).

Depois de feito isso podemos executar o Fastlane

```yaml
    - name: Install Ruby    
      uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7.2'

    - name: Fastlane iOS        
      uses: maierj/fastlane-action@v2.0.1
      with:
        lane: 'homologacao_firebase'
        subdirectory: 'ios'

```

Acima instalamos o `Ruby` e em seguida a Action do Fastlane, indicando o subdirectory e qual a lane iremos executar.

Nas configurações do Fastlane são mais simples pois não nos preocupamos com o build do Flutter, executando exclusivamente as assinaturas e entrega ao Firebase Distribution (no caso do iOS). Essa parte do Fastlane para iOS abordaremos em um outro post.

É isso, qualquer sugestão podem colocar nos comentários que iremos corrigir e acrescentar na medida do possível.

**Referências:**

**Workflow syntax for GitHub Actions**, GITHUB. Disponível em: <https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions>. Acesso em 15 de Fevereiro de 2021, às 15:35.

**Distribuir apps iOS para testadores com o fastlane**, GOOGLE. Disponível em: <https://firebase.google.com/docs/app-distribution/ios/distribute-fastlane>. Acesso em 15 de Fevereiro de 2021, às 15:37.

**Deploying Flutter app to Firebase App Distribution using Fastlane**, CODEMAGIC. Disponível em: <https://blog.codemagic.io/deploying-flutter-app-to-firebase-app-distribution-using-fastlane/>. Acesso em 15 de Fevereiro de 2021, às 15:40. 

**CI/CD com GitHub Actions + Fastlane** LACERDA, Aryella. Disponível em: <https://medium.com/naqueles-dias/ci-cd-com-github-actions-fastlane-c4c68c37be88>. Acesso em 15 de Fevereiro de 2021, às 15:39. 

######<span>Photo by <a href="https://unsplash.com/@rileyhphotos?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Riley McCullough</a> on <a href="https://unsplash.com/s/photos/american-football?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>