GoLang

Implantação contínua de um aplicativo Golang usando o Travis CI

Então, você está desenvolvendo um aplicativo usando a linguagem de programação Go com uma equipe de desenvolvedores para a sua organização. As práticas recomendadas diriam que você precisa criar testes adequados e desenvolver uma estratégia de integração e implantação contínuas.

Se você estiver acompanhando meus tutoriais, lembrará que escrevi sobre como criar um pipeline de implantação contínua com Node.js e Jenkins. Desta vez, vamos mudar as coisas com a tecnologia de desenvolvimento e o serviço de CI/CD.

Veremos como implantar continuamente um aplicativo Golang que interage com Couchbase com o popular Travis CI serviço.

O objetivo deste tutorial é ajudá-lo a criar um aplicativo Golang que se comunica com o Couchbase. Esse aplicativo terá testes de unidade adequados que serão usados quando o Travis CI for acionado. Se os testes forem bem-sucedidos no Travis CI, o aplicativo será implantado automaticamente em algum servidor remoto com SSH.

Como pré-requisito, você precisará ter pelo menos uma instância do Couchbase Server disponível. Essa instância do Couchbase Server será usada durante a implementação.

Desenvolvimento de um aplicativo com Go e Couchbase NoSQL

Criaremos um novo projeto Golang para este exemplo. Em algum lugar em sua pasta $GOPATH criar um arquivo chamado main.go e incluem o seguinte:

O código acima é simples, mas sofrerá alterações significativas à medida que avançarmos neste tutorial. Por enquanto, vamos descobrir o que ele faz.

Como estamos usando o Couchbase, precisamos ter obtido o Go SDK. Ele pode ser instalado executando o seguinte:

Com o Go SDK instalado, podemos adicioná-lo às importações do nosso projeto.

O projeto terá duas funções muito simples. Haverá uma função para recuperar um documento e uma função para criar um documento. Cada documento terá a função Pessoa conforme definido no modelo estrutura.

Quando o aplicativo for iniciado, ele se conectará a um cluster do Couchbase, conforme especificado pelas variáveis de ambiente. Da mesma forma, uma conta RBAC será autenticada e um bucket será aberto.

Depois que o banco de dados estiver pronto, primeiro obtemos um documento com base em um ID:

Supondo que o documento exista, ele será retornado. Depois que o documento é recuperado, inserimos um novo documento no banco de dados.

Agora você deve estar se perguntando por que estamos criando funções para isso. Quero dizer, não estamos fazendo nada de especial além de usar o SDK real.

Use sua imaginação com essas funções. Suponha que elas sejam complexas porque estaremos escrevendo casos de teste para elas. Neste exemplo, elas são simples para facilitar a compreensão.

Projetando testes de unidade com dados de simulação

Temos uma base para o nosso projeto, portanto, podemos começar a pensar em escrever casos de teste para o nosso aplicativo. Antes de começarmos a escrever testes, vamos fazer algumas alterações no arquivo main.go que acabamos de criar.

Abra o main.go e inclua o seguinte:

Observe que há algumas pequenas alterações no código acima.

Ao escrever testes para funções que interagem com o banco de dados, provavelmente não é uma boa ideia fazer testes com o banco de dados real. Em vez disso, devemos usar dados simulados. No entanto, queremos escrever testes sem passar por muitos obstáculos.

Para testar facilmente, podemos criar uma interface que represente nosso bucket do Couchbase. Em nosso código principal, usaremos um bucket real e, em nosso código de teste, usaremos um bucket simulado.

Em nosso exemplo, a interface do nosso bucket inclui apenas duas das muitas funções possíveis do SDK. Essa interface corresponde ao que veríamos no SDK real.

As duas funções que criamos agora fazem parte do Banco de dados classe.

Criar um main_test.go em seu projeto e certifique-se de que ele contenha o seguinte código:

O código acima é realmente onde a mágica entra em nosso projeto. Ele usa uma mistura de código do arquivo pai e código de teste personalizado.

Veja, por exemplo, o seguinte:

Ao testar, não vamos trabalhar com um bucket real do Couchbase, portanto, temos que criar nosso próprio estrutura. Estaremos usando o Banco de dados do arquivo pai e usa a estrutura de dados BucketInterface.

Quando os testes começarem, poderemos criar nosso bucket fictício:

Agora, como nosso balde de simulação não tem nenhuma função como o balde real, temos de criar as funções conforme definido em nossa interface. Em outras palavras, temos que criar uma função Inserir e um Obter função.

Começando com o Inserir função:

Nosso teste será simples. Vamos tentar inserir qualquer documento, exceto um com uma chave de garoto. O teste será bem-sucedido ou reprovado com base na chave.

O Obter funciona de maneira semelhante.

Ao tentar obter um documento, estamos esperando uma chave de garoto. Se a chave correta tiver sido fornecida, retorne alguns dados organizados por nosso converter caso contrário, retornará um erro.

Novamente, essas são versões simuladas do que encontraríamos no Go SDK para operações de balde. Com as funções de interface criadas, podemos escrever nossas duas funções de teste.

O TestGetPersonDocument usará nosso banco de dados de teste que usa o mock bucket. No entanto, ele usa a variável GetPersonDocument do main.go arquivo. Lembre-se de que a nossa função principal poderia ser muito mais complexa, mas a parte do banco de dados agora é um mock.

O resultado de nossa função será decodificado no Pessoa usando a estrutura de dados estrutura do mapa pacote. Mais informações sobre o uso do pacote mapstructure podem ser lidas em aqui.

O TestCreatePersonDocument segue a mesma estratégia. Estamos usando o balde simulado, mas o balde real CreatePersonDocument função. A função Inserir usará o que criamos em nosso teste.

Não há muito o que fazer para testar um aplicativo Golang que inclui interação com o banco de dados. Sua melhor aposta é criar uma interface e usar suas próprias versões de simulação personalizadas das funções e dos dados.

Criação de uma configuração YAML para o Travis CI

Portanto, temos nosso aplicativo Go com alguns testes de unidade. Agora precisamos usar o Travis CI para testar automaticamente nosso aplicativo e implantá-lo se for bem-sucedido.

O Travis CI funciona a partir de um arquivo de configuração YAML. Veja a configuração a seguir, por exemplo:

A configuração acima diz que estamos usando o Go 1.8. Antes de começarmos a executar os scripts, precisamos fazer o download de um pacote necessário. Precisamos do sshpass que nos permite usar SSH com senhas de texto simples. No final, você provavelmente desejará usar chaves, mas, para este exemplo, não há problema.

Depois de sshpass foi baixado, precisamos executar nossos testes. Isso é feito na seção roteiros seção. Depois que o primeiro script for concluído, poderemos criar nosso projeto.

Supondo que os dois scripts tenham sido concluídos com êxito, queremos nos concentrar na implementação.

Dois comandos diferentes são executados para a implementação. O primeiro comando copiará o binário para um servidor remoto e o segundo comando executará esse arquivo no servidor remoto.

Ambos os comandos de implantação fazem referência a variáveis de ambiente no processo de CI/CD que são posteriormente passadas para o servidor.

Agora, você notará que não definimos nenhuma variável de ambiente. Essas variáveis são confidenciais e não devem ser texto simples em nosso repositório Git. Em vez disso, podemos usar segredos com o Travis CI.

Faça o download do travis CLI seguindo a documentação do Travis CI. Com a ferramenta instalada, execute o seguinte:

Em vez de adicionar todas as suas informações como texto simples no arquivo YAML, elas são criptografadas e podem ser compreendidas pelo Travis CI. A configuração YAML que ele adiciona terá a seguinte aparência:

Isso é algo que você pode manter em seu repositório Git e se sentir seguro. Uma abordagem ainda mais segura seria usar chaves públicas e privadas para SSH, mas isso é adequado para este exemplo.

Quando você enviar seu projeto, supondo que o tenha vinculado à sua conta do Travis CI, o aplicativo será testado e implantado automaticamente.

A importância do NoSQL com a implantação contínua

Vimos como criar testes que usam dados simulados como um banco de dados. Entretanto, o que é realmente conveniente é que não precisamos criar scripts de atualização quando nossos dados são alterados. Em um banco de dados relacional, você teria de criar scripts de alteração para sua tabela. Com o Couchbase, se o seu modelo de dados precisar ser alterado, basta mudar para estrutura para Pessoa no código.

Conclusão

Você acabou de ver como usar o Travis CI para implantar continuamente seu projeto Golang que usa um Couchbase Banco de dados NoSQL. Durante a fase de integração contínua, o aplicativo é testado usando dados simulados. Quando os testes são aprovados e o projeto é desenvolvido, ele é enviado para um servidor remoto e executado.

O exemplo usado neste tutorial pode ser encontrado em GitHub. Observe apenas que o servidor remoto para o qual o projeto é enviado foi removido.

Se você estiver interessado em saber mais sobre Go com o Couchbase, confira o Portal do desenvolvedor do Couchbase.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Nic Raboy, defensor dos desenvolvedores, Couchbase

Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.