DEV Community

Lys
Lys

Posted on • Edited on

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

Top comments (0)