Buildando aplicações com Bazel (parte 2)

Na primeira parte desse tutorial, configuramos o Bazel e o gazelle em nosso projeto. Ao final conseguimos utilizar o Bazel para gerar nosso arquivo binário.

Agora que já temos todo o ambiente configurado e funcionando, vamos adicionar as regras para gerar uma imagem e subir ela para um registry.

Primeiro passo é adicionar o http_archive das regras do docker no arquivo WORKSPACE.

http_archive(
    name = "io_bazel_rules_docker",
    sha256 = "59536e6ae64359b716ba9c46c39183403b01eabfbd57578e84398b4829ca499a",
    strip_prefix = "rules_docker-0.22.0",
    urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.22.0/rules_docker-v0.22.0.tar.gz"],
)

As regras do docker já vem com algumas funções para auxiliar na criação de imagens para linguagens como Python, NodeJS, Java, C e etc…

Para carregar as funções de auxílio do Go, precisamos adicionar dois load no arquivo WORKSPACE.

load(
    "@io_bazel_rules_docker//repositories:repositories.bzl",
    container_repositories = "repositories",
)

container_repositories()

load(
    "@io_bazel_rules_docker//go:image.bzl",
    _go_image_repos = "repositories",
)

_go_image_repos()

Pronto, agora que temos tudo o que precisamos do docker configurado em nosso projeto, abrindo o arquivo BUILD que se encontra na raiz do projeto, vamos carregar a função go_image e configurá-la.

load("@io_bazel_rules_docker//go:image.bzl", "go_image")

go_image(
    name = "api_image",
    binary = ":gorilla",
    importpath = "github.com/aprendagolang/gorilla",
)

No primeiro parâmetro, name, podemos colocar qualquer coisa. Escolhemos api_image por ser a regra quer irá gerar a imagem da nossa API.

O segundo parâmetro, no exemplo que encontramos no repositório das regras do docker, seria o srcs, parâmetro que configura-se passando os nomes dos arquivos .go, assim como fizemos na função go_binary. Como já usamos a função go_binary, mudamos o segundo parâmetro para o binary, onde tudo que precisamos fazer é apontar para a regra que gera o binário do nosso programa.

Por último, configuramos o importpath, que nada mais é do que o nome do nosso módulo.

Para garantir que está tudo funcionando 100%, execute um bazel build api_image. Se você não recebeu nenhum erro, quer dizer que tudo funcionou como deveria, e que agora só falta fazer o push dessa imagem.

Nessa etapa, ainda no arquivo BUILD da raiz do nosso projeto, precisamos fazer o load da função container_push e configurá-la.

load("@io_bazel_rules_docker//container:container.bzl", "container_push")

container_push(
   name = "push_api",
   image = ":api_image",
   registry = "index.docker.io",
   repository = "aprendagolang/gorilla-mux",
   tag = "bazel",
)

Como para todas as regras do bazel, o parâmetro name pode ser qualquer coisa. Escolhemos push_api.

No parâmetro image, passamos o nome da regra que está gerando a imagem, no nosso caso api_image.

As três próximas regras definem para onde o push será feito, qual repositório e tag. Como estamos fazendo o push para o docker hub, o registry deve ser index.docker.io. No repository, preenchemos com “USERNAME/NOME_DA_IMAGEM”. Na tag colocamos bazel só para referenciar como geramos nossa imagem.

Antes de fazer o push, é necessário que você esteja logado em sua conta do docker. Para fazer isso no terminal, é só executar docker login -u USERNAME e depois digitar sua senha.

Regra configurada e logado no docker, agora rodamos o comando bazel para executar a regra push_api.

$ bazel run push_api

Pronto, se você for até sua conta do docker, vai ver que uma nova imagem foi adicionada. Para ver a que geramos aqui, é só clicar aqui!

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta