DEV Community

Lys
Lys

Posted on • Edited on

1 1 1 1 1

Protegendo credenciais em automatização de builds no Fastlane com Variáveis de Ambiente

Permitindo armazenar informações sensíveis, como API keys, tokens de autenticação e credenciais, de forma segura e fora do código-fonte, usar variáveis de ambiente reduz o risco de exposição desses dados ao fazer o versionamento do código.

Pensando na configuração de uma pipeline em Fastlane, para automatizar versões de teste, nosso arquivo Fastfile pode ser muito parecido com

default_platform(:ios)

platform :ios do
  desc "Builds the app and pushes to TestFlight"
  lane :beta do
    increment_build_number(
      xcodeproj: "FastlaneIOSTest.xcodeproj"
    )

    gym(
      scheme: "FastlaneIOSTest",        
      export_method: "app-store",                  
      clean: true,                                 
      export_options: {
        provisioningProfiles: {
          "br.com.lys.FastlaneIOSTest" => "iOS Distribution Profile -
 Fastlane Test"
        }
      }
    )

    pilot(
      skip_waiting_for_build_processing: true,
      notify_external_testers: true,           
      api_key: app_store_connect_api_key(
        key_id: "<SEU_KEY_ID>",
        issuer_id: "<SEU_ISSUER_ID>",
        key_filepath: "/caminho/para/sua/chave.p8"
      )
    )
  end
end
Enter fullscreen mode Exit fullscreen mode

Há valores que podemos adicioná-los em variáveis de ambiente, alguns para evitar informações hardcoded, facilitar manutenção e configuração para diferentes ambientes, mas também outros para não deixar exposto no código quando publicado.

As propriedades que achei que fariam sentido estar em uma variável de ambiente foram:

  1. Nome do projeto Xcode (xcodeproj).
  2. Nome do scheme do projeto (scheme).
  3. Método de exportação (export_method).
  4. Bundle Identifier do app (primeira parte do provisioningProfiles).
  5. Nome do perfil de provisionamento (segunda parte do provisioningProfiles).
  6. ID da chave da App Store Connect API (key_id).
  7. ID do emissor da App Store Connect API (issuer_id).
  8. Caminho para o arquivo da chave da App Store Connect API (key_filepath).

Há como criar variáveis de ambiente apenas com um comando no terminal

export VARIABLE_NAME="Your Value Here"
Enter fullscreen mode Exit fullscreen mode

Mas desse jeito não é persistido em novas sessões de terminal, você precisa adicioná-la aos arquivos de configuração do shell, como .bashrc, .bash_profile ou .zshrc, para saber o shell que está em uso

echo $SHELL
Enter fullscreen mode Exit fullscreen mode

Independente do que foi retornado, nano será o comando que usaremos para abrir, editar e adicionar nossas variáveis de ambiente, como abaixo

nano ~/.zshrc
Enter fullscreen mode Exit fullscreen mode

Substituia o ~/.zshrc por ~/.bashrc ou ~/.bash_profile, caso seu tipo de shell não seja o zsh

Ao abrir, adicione o texto que terá os export's das suas variáveis de ambiente

export XCODEPROJ_NAME="YourNameApp.xcodeproj"
export SCHEME_NAME="YourSchemeName"
export EXPORT_METHOD="app-store"
export BUNDLE_IDENTIFIER="br.com.YourBundleIdentifier"
export PROVISIONING_PROFILE_NAME="Your Provisioning Profile - NameApp"
export APP_STORE_CONNECT_API_KEY_ID="<YOUR_KEY_ID>"
export APP_STORE_CONNECT_API_ISSUER_ID="<YOUR_ISSUER_ID>"
export APP_STORE_CONNECT_API_KEY_FILE_PATH="/way/for/your/key.p8"
Enter fullscreen mode Exit fullscreen mode

Após adicionado, no Nano, use Ctrl + O para salvar e Ctrl + X para sair.

Para aplicar as mudanças sem precisar reabrir o terminal, rode o comando source com o path correspondente, por exemplo

source ~/.zshrc
Enter fullscreen mode Exit fullscreen mode

Acessaremos os valores adicionados com um ENV['']

ENV['YOUR_VARIABLE_NAME']
Enter fullscreen mode Exit fullscreen mode

Então, atualizando os valores no Fastfile, ficará assim

default_platform(:ios)

platform :ios do
  desc "Builds the app and pushes to TestFlight"
  lane :beta do
    increment_build_number(
      xcodeproj: ENV['XCODEPROJ_NAME']
    )

    gym(
      scheme: ENV['SCHEME_NAME'],        
      export_method: ENV['EXPORT_METHOD'],                  
      clean: true,                                 
      export_options: {
        provisioningProfiles: {
          ENV['BUNDLE_IDENTIFIER'] => ENV['PROVISIONING_PROFILE_NAME']
        }
      }
    )

    pilot(
      skip_waiting_for_build_processing: true,
      notify_external_testers: true,           
      api_key: app_store_connect_api_key(
        key_id: ENV['APP_STORE_CONNECT_API_KEY_ID'],
        issuer_id: ENV['APP_STORE_CONNECT_API_ISSUER_ID'],
        key_filepath: ENV['APP_STORE_CONNECT_API_KEY_FILE_PATH']
      )
    )
  end
end
Enter fullscreen mode Exit fullscreen mode

Sentry mobile image

App store rankings love fast apps - mobile vitals can help you get there

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read full post →

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay