Flutter CI & CD na ClickUp
Engineering at ClickUp

Flutter CI & CD na ClickUp

Com uma equipe móvel em crescimento e lançamentos semanais, é essencial ter um pipeline de CI confiável. Precisamos ser capazes de criar e testar nossos aplicativos e implantá-los na App Store e na Google Play Store. Também mantemos versões de pré-visualização internas para testar os recursos mais recentes.

Saiba como usamos o ClickUp, o Fastlane e o GitHub Actions para automatizar nossa integração contínua (CI) e entrega contínua (CD).

A vida de um bug 🐜

Vamos começar revisando rapidamente nosso processo de gerenciamento e correção de bugs.

  1. Um bug (ou solicitação de recurso) é relatado e uma tarefa é criada no ClickUp.
  2. A tarefa é atribuída a um desenvolvedor e corrigida em um PR contra o branch de staging.
  3. A CI executa todos os testes, cria o aplicativo, implanta uma pré-visualização na web e carrega tudo na tarefa do ClickUp.
  4. Nossa equipe de controle de qualidade verifica a correção e, se estiver tudo certo, a tarefa é marcada como concluída.
  5. O PR é mesclado automaticamente no ambiente de teste.
  6. A ramificação de teste é criada e implantada em nosso TestFlight interno.
  7. Todas as quartas-feiras, uma ramificação de lançamento é criada, construída e testada.
  8. Às sextas-feiras, criamos uma versão no GitHub e a CI implanta a versão na App Store e na Play Store.

Uma tarefa do ClickUp contém todas as informações sobre o bug. Usamos status personalizados, como Em andamento ou Revisão de código, para acompanhar o bug. Os fluxos de trabalho de CI alteram o status automaticamente. Os campos personalizados contêm informações adicionais, como quem relatou o bug, quem está trabalhando nele, quando ele será lançado etc.

Fluxo de trabalho de RP 📜

As duas primeiras etapas descritas acima não estão realmente relacionadas à CI, mas a terceira é interessante...

Nosso fluxo de trabalho de desenvolvimento é executado para qualquer PR. Ele verifica lints, formatação e executa todos os testes antes de começar a construir os artefatos Android e iOS.

Quando uma compilação é bem-sucedida, a CI publica uma mensagem na tarefa vinculada. Os engenheiros de controle de qualidade podem acessar o PR, baixar os artefatos da compilação ou usar a visualização na web.

A CI publicará uma mensagem na tarefa vinculada.
Uma mensagem de CI automatizada publicada na tarefa vinculada do ClickUp após uma compilação bem-sucedida.

Uma mensagem de CI automatizada publicada na tarefa vinculada do ClickUp após uma compilação bem-sucedida.

Configurando o Flutter no CI Runner 🛠

Usamos a conhecida ação GitHub subosito/flutter-action para configurar o Flutter na CI. Por padrão, ela instalará a versão estável mais recente do Flutter. Para evitar interromper seus fluxos de trabalho de CI quando uma nova versão do Flutter for lançada, você deve especificar a versão manualmente.

Se você tiver vários fluxos de trabalho, é melhor armazenar a versão do Flutter em um arquivo. Usamos FLUTTER_VERSION na raiz do repositório.

Outra solução fácil é armazenar a versão do Flutter como segredo do GitHub e acessá-la usando {{ secrets. FLUTER_VERSION }}.

Pré-visualização na web 🕸

Graças à capacidade do Flutter de ser executado na web, podemos criar uma visualização totalmente funcional das solicitações de pull. Usando o pacote device_preview, é possível ajustar o tamanho e as configurações do dispositivo.

A visualização prévia tem se mostrado muito útil e não é utilizada apenas pela nossa equipe de controle de qualidade. Designers e gerentes de produto também gostam dela para iterar rapidamente em novos recursos.

Pré-visualização web totalmente funcional no Flutter
via Flutter

via Flutter

Como criar uma visualização na web 🐶

Para começar, certifique-se de que seu aplicativo seja compatível com o Flutter web — nem todas as APIs são suportadas.

Em nosso aplicativo, por exemplo, precisávamos desativar notificações push e web sockets.

Este fluxo de trabalho de exemplo cria uma pré-visualização web do seu aplicativo Flutter e o carrega em um bucket S3. Usamos uma variável de ambiente ENABLE_DEVICE_PREVIEW para desativar o device_preview na produção.

A etapa Fix base href é necessária porque a visualização não estará na raiz do bucket.

E alguns códigos para habilitar condicionalmente o device_preview.

As variáveis de ambiente são uma ferramenta poderosa e permitem que o algoritmo de tree shaking do Flutter descarte o código de depuração para compilações de lançamento.

Fastlane 💨

O Fastlane simplifica muito a criação, assinatura e implantação de aplicativos Flutter. Ele gerencia nossos certificados, perfis de provisionamento e outras configurações. Usamos segredos do GitHub para armazenar senhas e tokens com segurança.

Ações úteis do Fastlane:

Exemplo de compilação de desenvolvimento iOS 🍏

Não se esqueça do setup_ci, ele irá poupá-lo de erros estranhos. Saiba mais sobre o Fastlane para aplicativos Flutter.

Assinatura Android 🔒

A maneira mais fácil de assinar compilações de lançamento do Android com segurança é armazenar os tokens como segredos do GitHub e usar variáveis de ambiente e uma chave temporária. jks criados pela CI:

Armazenamos a chave .jks como uma string codificada em base64 no Github Secrets e a decodificamos no fluxo de trabalho:

Fluxo de trabalho de lançamento e produção 🚀

O fluxo de trabalho de pré-lançamento é executado para ramificações que começam com release/v. Ele remove toda a depuração e o código interno para garantir que testemos o mesmo código que será lançado.

Além disso, o fluxo de trabalho de pré-lançamento publica em vários canais do Slack para notificar as equipes de controle de qualidade e marketing sobre um novo lançamento usando webhooks recebidos.

Depois que tudo é testado exaustivamente, criamos uma versão no GitHub que aciona o fluxo de trabalho de produção. Ela compila e assina o aplicativo com certificados de produção e o envia para a App Store.

Mais dicas para sua CI 🦾

Se você usar o gatilho push para GitHub Actions, provavelmente encontrará problemas se houver vários pushes para o mesmo branch em rápida sucessão. Mais de uma instância do fluxo de trabalho será iniciada e consumirá minutos de compilação ou causará outros problemas.

Resumo 🍩

Construir sua CI é um processo divertido. É fácil começar e você pode evoluir à medida que avança. Nossa CI segue um dos valores fundamentais do ClickUp: Progredir em direção à perfeição. Estamos constantemente trabalhando em melhorias de CI para nossas equipes de controle de qualidade e engenharia.

A combinação do ClickUp, GitHub Actions e Fastlane é muito poderosa e permite construir um pipeline de CI/CD flexível e totalmente automatizado em menos de uma hora. Experimente!

Temos muitos tópicos interessantes em preparação, por isso continue acompanhando o blog de engenharia da ClickUp! 🦄