CI/CD com Github Actions, Fastlane e React Native
Tags: react, reactnative, github, mobile
Published: 2021-01-23 13:46:57

## Por que utilizar ?
- Com os benefícios que a utilização que o CI/CD nos trazem nos permite automatizar processos que consumiriam tempo de um profissional para realizá-los, assim tendo maior foco nos requisitos do projeto, qualidade e segurança do código.

## Introdução as tecnologias

### [Fastlane](https://fastlane.tools/)

- **Fastlane** é uma ferramenta para automatizar processo de desenvolvimento e lançamento dos apps.

### [Github Actions](https://docs.github.com/pt/actions)

- Github Actions é uma ferramenta para executar seus processos de desenvolvimento, sendo totalmente personalizável.

### [React Native](https://reactnative.dev/)

- É um framework baseado no React, é utilizado para construções de aplicativos híbridos (iOS/Android).

---

## Pré-requisitos

1. Fastlane CLI
2. XCODE (apenas se quiser fazer para iOS)
3. Seus aplicativos PRECISAM estar assinados para darmos o deploy.

## Entendendo a estrutura.

- Crie a pasta `fastlane` na raiz do seu projeto.

![Fastfile folder](https://dev-to-uploads.s3.amazonaws.com/i/7od2lif19z4unyvvopp9.png)
- O arquivo `Fastfile` é o responsável pelas execuções do CI/CD.

- O arquivo `Appfile` contém as informações do seu aplicativo iOS.

    ![Appfile](https://dev-to-uploads.s3.amazonaws.com/i/y64vbc13rmwgmmuqtt08.png)

- O arquivo `Matchfile` contém as informações para executar a função `match`.

    ![Matchfile](https://dev-to-uploads.s3.amazonaws.com/i/k2oukoctea4a8aqhpa1n.png)

- O arquivo `Pluginfile` é o arquivo que contém os plugins que você deseja utilizar.

![Pluginfile](https://dev-to-uploads.s3.amazonaws.com/i/6r43kzbodk3blme6c99b.png)

---

## Construção do Fastfile

### Entendendo os funções

- Usaremos uma lista de funções fornecidas pelo próprio Fastlane, vamos explicar cada uma delas.

> before_all

- Essa função executará antes de todas as `lanes` que teremos.

```ruby
before_all do
  # Insira seu código.
end
```

> is_ci

- Essa função verifica se quem está rodando é um usuário ou uma máquina (Github Actions, Travis, Jenkins)
 ```ruby
if is_ci
  puts "I'm a computer"
else
  say "Hi Human!"
end
```
> create_keychain

- Essa função é necessária para criar uma keychain, para guardarmos as informações dos certificados temporariamente.

```ruby
create_keychain(
        name: ENV["CI_KEYCHAIN_NAME"],
        password: ENV["CI_KEYCHAIN_PASSWORD"],
        default_keychain: is_ci,
        unlock: true,
        timeout: 3600,
        lock_when_sleeps: false
      )
```

> match

- Permite você sincronizar seus certificados e perfil com seu time. Nesse exemplo criei um repositório privado para guardar os certificados.

```ruby
match(
        git_basic_authorization: Base64.strict_encode64(GIT_ACCESS),
        git_url: GIT_URL,
        app_identifier: APP_IDENTIFIER",
        type: "development",
        keychain_name: keychain_name,
        keychain_password: keychain_password,
        readonly: true
      )
```

Obs: se vc tiver vários perfis de aplicação `DEBUG`, `STAGING`, `PROD`..., é necessário fazer o match para cada uma de acordo com seu `type:adhoc, development, appstore`.

> testflight

- Função para lançar seu app para o **Apple Testflight.**

```ruby
testflight(
      skip_submission: true,
      skip_waiting_for_build_processing: true
    )
```

> gym

- Realiza o Build do seu applicativo assinado `ipa` ou `app` file.

```ruby
gym(
      scheme: PROJECT_NAME,
      export_method: "app-store",
      workspace: XCODE_WORKSPACE,
      silent: true,
      include_bitcode: true
    )
```

> gradle

- Realiza as ações do `gradle`.

```ruby
gradle(
      project_dir: "android/",
      task: "assemble",
      flavor: "Production",
      build_type: "Release"
    )
```

> upload_to_play_store

- ~~Esse aqui é meio díficil de explicar.~~ Realiza o upload da sua aplicação para a **Play Store.**

```ruby
upload_to_play_store(track: 'production', json_key: 'path...')
```

## GitHub Access Token

- Será preciso gerar um Personal Token da sua conta do `github` com o intuito de conseguirmos acessar o projeto dos certificados no `GitHub Actions`, para isso acesse o seu **GitHub > Developer settings > Personal access tokens > Generate new token > Dê um nome > Marque a opção `REPO` > Salve o token > Copie-o.**

![Personal Token](https://dev-to-uploads.s3.amazonaws.com/i/00rr6ajkwznnmpz0hcpw.png)

---
![Personal Token](https://dev-to-uploads.s3.amazonaws.com/i/idf5n503khflwyehtvce.png)

- Agora iremos adicionar o seu `Personal Token` nos `SECRETS` do seu projeto do `GitHub`.

![Secrets](https://dev-to-uploads.s3.amazonaws.com/i/xq0wq3iwsb4pypsekr2d.png)
---

![Secrets](https://dev-to-uploads.s3.amazonaws.com/i/uhs5ag94ssx8dmo3cpce.png)

---

![Secrets](https://dev-to-uploads.s3.amazonaws.com/i/74p8mukuv4wc31ly6ncn.png)

---

## Finalmente o Fastfile...

- Seu Fastfile ficará parecido com esse abaixo, porém com suas varíaveis e podendo haver mudanças de acordo com a sua necessidade.

{% gist https://gist.github.com/jjairojr/1db59f0805432b5feca5ba8aeb91739d %}

---

## Workflows do Github Actions

- Cria uma pasta na raiz do seu projeto com o nome `.github` e dentro dela crie uma pasta `workflows` é lá que iremos colocar nossos workflows (jura ??????)

![Workflows](https://dev-to-uploads.s3.amazonaws.com/i/sfrh2ge3e132vf4kosvq.png)

- Agora iremos fazer nossos workflows do Github Actions, no total tenho 5 workflows.
- Lembrando que `MATCH_PASSWORD` é a senha dos repositório do certificado e `FASTLANE_PASSWORD` é a senha de acesso para a **Apple**.

> Executa testes e Linter no projeto
{% gist https://gist.github.com/jjairojr/3718c1bf16b881e94bf6037de531acf2 %}

> Android QA
{% gist https://gist.github.com/jjairojr/e05f232332c30703e02e96b858f16b7c %}

> Android Produção
{% gist https://gist.github.com/jjairojr/83e38e8eeff1dc03f3ab7ea9dcb4f3f2 %}

> iOS QA
{% gist https://gist.github.com/jjairojr/2631db0dfad1e50edd0b548097dd41a8 %}

> iOS Produção
{% gist https://gist.github.com/jjairojr/1a01d25aa4b14fa5daa57b75b0113baa %}

Espero que essa publicação consiga te ajudar!
- **[Github](https://github.com/jjairojr)**
- **[Linkedin](https://www.linkedin.com/in/jjairo/)**