Integração Contínua com Travis-CI

Chegou a hora de ter menos dores de cabeça durante o desenvolvimento do seu app.

Postado por Fabricio Serralvo em 26/03/2017

Integração Contínua com Travis CI

Integração Contínua é, em outras palavras, a prática que busca manter o ambiente de desenvolvimento em pleno funcionamento após iterações feitas pelos devs do projeto. Para que isso ocorra, é necessário que a cada alteração no repositório, alguns itens do projeto sejam verificados, como a geração da build e execução de testes, por exemplo.

Você pode ler um pouco mais sobre o assunto aqui (conteúdo em inglês).

Travis CI

O Travis CI é um serviço dedicado exclusivamente à integração contínua. Ele opera integrado ao GitHub, assim, algumas tarefas são simplificadas, como a automação da obtenção do source do projeto. Devido à integração, é necessário que seu projeto esteja hospedado no GitHub.

O uso do Travis para projetos open source é gratuito 🎉 (isso sem dúvida ajudou a popularizá-lo). Para utilizá-lo em projetos privados você terá que desembolsar alguns dólares, o valor mensal* vai de $69 no plano Bootstrap até $489 💸 na opção Premium.

Para começar a utilizar basta acessar travis-ci.org para projetos open source ou travis-ci.com para projetos privados. O processo de sign-up é bastante simples.

* Informações de março, 2017

Benefícios

Entre os benefícios do uso do Travis (ou qualquer outra solução de integração contínua) destaco a velocidade em que os problemas corriqueiros são encontrados, afinal, quanto mais rápido descobrirmos alguma adversidade, menor a chance de uma dor de cabeça das grandes. 

Outro ponto interessante é a integração realizada pelo Travis com o GitHub, onde a cada commit ou pull request, o Travis executa seu job e marca visualmente se o ambiente foi comprometido ou não. Além também da geração dos tradicionais badges informando o status do projeto.

Marcação visual do status da build

Hora do Show

Para exemplificar o funcionamento do Travis criei um projeto para iOS em Swift 3. Nele, adicionei uma dependência que servirá para demonstrar como obter as bibliotecas ou frameworks do projeto.

Esse projeto gerou três ítens para explorarmos: 

  • Será necessário gerenciar as dependências do projeto —  sim, é isso que você está pensando: CocoaPods.
  • Execução da build.
  • Por fim, notificaremos o time sobre o status do projeto.

Arquivo .travis.yml

Para que essas tarefas listadas acima funcionem, nós precisaremos criar um arquivo que fornecerá instruções para o Travis. Aí é que entra o .travis.yml.

Antes de começarmos a escrever o arquivo de configuração, precisamos entender como funciona o ciclo de vida do processo de build do Travis:

O Travis divide a execução do job em duas etapas, a primeira delas é responsável pela atualização das dependências, seja do projeto, ou do ambiente. A segunda etapa é voltada para a execução da build e outras tarefas relacionadas, como tests, reports e deploy. Nessas etapas podemos detectar eventos do ciclo de vida e incluir ações de acordo com a necessidade do projeto.

Para começarmos, o primeiro passo é realizar o cadastro no Travis. Para repositórios públicos ou privados, o funcionamento será o mesmo.

O próximo passo é “ativar” o Travis para o repositório desejado. Feito isso, no próximo commit ou pull request, o job será executado.

Após o cadastro chegou a hora de criar o arquivo .travis.yml na raiz do repositório. Feito isso, vamos incluir duas linhas: A primeira é usada para definir a linguagem do projeto (que é um valor obrigatório). No caso adicionaremos objective-c. A segunda representa a imagem que será usada para fazer a build do projeto, no caso, adicionaremos xcode8.1. Veja abaixo:

language: objective-c
osx_image: xcode8.1

Agora você pode estar assim: 🤔

Ué, objective-c?! Mas o projeto não está escrito em Swift? Sim, isso mesmo, até o momento o Travis utiliza o valor objective-c para Swift e também para Objective-C.

Baixando as dependências

Se você já usou CocoaPods ao menos uma vez, sabe que basta executar pod install para obter as dependências do projeto. No ambiente do Travis isso é um pouco diferente: se o Podfile estiver na raiz do projeto, o Travis fará o fetch automaticamente, caso contrário, basta indicar no .travis.yml qual o local de tal arquivo:

podfile: path/to/Podfile

Se o seu projeto usa outro gerenciador de dependências, é possível fazer override da etapa de install para realizar a instalação de acordo com sua necessidade:

install: sh dependencies.sh

Build e Sucesso

Após obter as dependências do projeto, basta apenas configurar alguns parâmetros para a execução da build. Esses parâmetros envolvem alguns ítens necessários para continuar o processo. São eles:

  • Path do xcworkspace ou xcproject.
  • Algum scheme com a opção shared ativada (saiba mais aqui).
  • SDK que será usado (no caso estamos usando iphonesimulator).

Conhecendo tais parâmetros é hora de realizar a build do projeto, para isso, vamos adicionar na etapa script a chamada do xcodebuild.

script:
  - xcodebuild -workspace DemoTravisCI.xcworkspace -scheme 'DemoTravisCI' -sdk iphonesimulator build

Sendo assim, no momento o arquivo .travis.yml possui o seguinte conteúdo:

language: objective-c
osx_image: xcode8.1

script:
  - xcodebuild -workspace DemoTravisCI.xcworkspace  -scheme DemoTravisCI -sdk iphonesimulator build

Notificações

Para detectar possíveis problemas com o projeto, é interessante compartilhar o status da build com o time a cada iteração. O Travis provê diversas opções para notificações, começando pelo envio de e-mails e abrindo um leque de possibilidades graças às integrações. No nosso caso, vamos ser avisados via Slack 📢.

Para isso, o primeiro passo é adicionar uma nova integração ao Slack. Após selecionar o time e as demais opções, na própria página do Slack você encontrará o conteúdo que deve ser adicionado ao seu arquivo de configuração.

Concluído tal passo, vamos incluir a chave notifications no arquivo .travis.yml:

notifications:
  slack: yourteam:G1P621hDDwEH3pXeCcJpck8i

Importante: Caso seu projeto seja aberto, é recomendado criptografar a chave. Esse é um processo bastante simples e você pode saber mais aqui.

Considerações Finais

Ferramentas de integração contínua são realidade no mercado e fazem parte da rotina de qualquer grande projeto de software. Algumas demandam maior esforço para que sejam configuradas (principalmente ferramentas self-hosted), outras não, como é o caso do Travis, onde basta um arquivo de marcação para que a mágica aconteça.

Se você se interessou pelo assunto e deseja implantar tal processo em seus projetos, e por alguma limitação não irá conseguir utilizar o Travis, saiba que existem diversas opções, como Jenkins, Xcode Server, CircleCI, entre outras.

Para finalizar, Integração Contínua é um dos pilares do desenvolvimento ágil, e podemos considerar que também é um passo para a Entrega Contínua, mas isso é assunto para outro artigo 🙃.

Um obrigado especial ao Roger Oba e também ao Cícero Duarte.

Referencias: