DevBox
Devbox é uma ferramenta de linha de comando que permite que criar shells isolados para desenvolvimento sem a necessidade de contêineres Docker ou máquinas virtuais. o Devbox utiliza o Nix Package Manager para instalar os pacotes necessários.
Definimos as dependências do projeto em um arquivo devbox.json
, garantindo que todos na equipe utilizem as mesmas versões de ferramentas e bibliotecas. Isso elimina problemas comuns de configuração e facilita a integração contínua.
- Evita configurar manualmente ferramentas e bibliotecas no pipeline de CI.
- Rapidez na configuração
- Portabilidade para ambientes
- No caso de containers podemos manter uma base específica ao invés de preparar diferentes runners.
Além disso, o Devbox permite exportar seu ambiente de desenvolvimento para contêineres ou ambientes na nuvem, garantindo portabilidade e consistência entre desenvolvimento local e produção.
Em resumo, o Devbox é uma solução eficiente para criar ambientes de desenvolvimento isolados, consistentes e portáteis, simplificando o fluxo de trabalho e melhorando a produtividade da equipe.
Define-se a lista de pacotes necessários para seu projeto, e o Devbox cria um ambiente isolado e reproduzível com esses pacotes instalados.
DevBox vs NIX
Tive uma experiência com a distribuição NixOS e conheci o gerenciador de pacote Nix. Na época queria utilizá-lo no meu desktop pessoal pois queria um ambiente que eu pudesse replicar rapidamente e arrumar uma alternativa para o meu projeto Workstation com Ansible. A idéia é maravilhosa, pois o NixOS permite que configuremos o sistema operacional de forma declarativa e adota o conceito de imutabilidade. Cada alteração gera um novo estado permitindo rollout. Eu acabei abandonado a idéia de usá-lo no meu desktop pessoal pois ví que era muito trabalhoso, mas eu adorei a idéia e já pensei no uso dela para vários cenários, não para o meu desktop pessoal. Existe uma ferramenta chamada nix-shell que é um shell temporário. Tudo que você instalar enquanto ele estiver ativo é descartado quando fechamos a sessão e isso parecia muito promissor.
A barreira de entrada para o uso do Nix é grande. É necessário estudo, persistência e muita paciência. Não é uma tecnologia que podemos fácilmente aplicar em uma empresa, pois exigirá esforço de muitas pessoas para aprender. É ai que entra o DevBox resolvendo esse problema!
O Devbox utiliza o Nix como base, incluindo funcionalidades semelhantes ao nix-shell, mas oferece uma experiência simplificada e voltada para o desenvolvimento. O Devbox abstrai muitas das complexidades do nix-shell e do ecossistema Nix, tornando mais fácil para desenvolvedores criar e gerenciar ambientes de desenvolvimento reprodutíveis. Diminindo a complexidade ficou muito mais fácil de adotar propor o uso dela dentro da equipe, pois vamos usar Nix sem saber sobre Nix de uma maneira muito mais amigável.
Com o DevBox podemos criar o ambiente sem poluir o desktop ou precisar mudar configurações do sistema para rodar o projeto criando uma sessão shell exclusiva para o projeto. Geralmente fazemos isso com uso de containers, mas com o DevBox eliminaremos toda a complexidade e problemas que envolvem o uso do containers.
Instalação
Se estiver no Windows é necessário o uso do WSL pois é necessário um ambiente Linux. No Mac funciona perfeitamente.
curl -fsSL https://get.jetify.com/devbox | bash
devbox version
0.13.7
Utilizando o DevBox
Crie uma pasta teste qualquer simulando um projeto.
mkdir teste
cd teste
Agora vamos iniciar um devbox.json, ou seja, um arquivo que será a descrição de tudo que esse ambiente precisa.
devbox init
ls
devbox.json
cat devbox.json
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": [],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
}
Para entrar iniciar um devbox shell a partir do que temos ai.
❯ devbox shell
Starting a devbox shell...
A partir de agora estamos usando o devbox shell. Para confirmar se quiser apenas faça um env no terminal e veja a diferenças das variáveis de ambiente
❯ env | grep NIX
Para sair desse shell apenas digite exit
e refaça o env acima e veja que não teremos todas essas variáveis anteriores.
exit
# Voltando ao shell anterior podemso ver que a saída é muito menor tendo somente as variáveis padrão do devbox.
env | grep NIX
Por exemplo eu não tenho o binário yq na minha máquina, mas eu também não quero instalar, somente para esse projeto
yq
zsh: command not found: yq
Então vamos começar a adicionar as coisas que precisamos. Lembra de estar dentro do shell com o comando devbox shell
.
# Adicionando o yq
devbox add yq
Info: Adding package "yq@latest" to devbox.json
Info: Installing the following packages to the nix store: yq@latest
✓ Computed the Devbox environment.
Warning: Your devbox environment may be out of date. Run refresh to update it.
yq --version
yq 3.4.3
# Observer que ele entrou no devbox.json em packages
cat devbox.json
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": ["yq@latest"],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
}
Se sairmos do terminal e voltarmos o yq estará lá.
Para remover somente precisamos usar o rm ao invés do add.
devbox list
* yq@latest - 3.4.3
devbox rm yq
✓ Computed the Devbox environment.
Warning: Your devbox environment may be out of date. Run refresh to update it.
❯ cat devbox.json
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": [],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
Agora vamos colocar ele novamente manualmente. Não temos ele instalado. Saida do devbox com o comando exist
edit o devbox.json incluindo o package como tinhamos acima e iniciar novamente.
# Para sair do devbox shell
exit
# Edite o arquivo incluindo o pacote
❯ cat devbox.json
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": [
"yq@latest"
],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
}
# Iniciando e ele já instala para nós
❯ devbox shell
Info: Ensuring packages are installed.
✓ Computed the Devbox environment.
Starting a devbox shell...
yq --version
yq 3.4.3
Para procurar um pacote apenas use devbox search nome_do_pacote
. Nunca instalada o latest, procure fixar versões de tudo pois o devbox nos dá o poder para isso.
Na minha máquina fora do shell tenho o terraform instalado.
terraform version
Terraform v1.10.3
Vamos instalar outra versão dentro do projeto (terraform 1.9.8). Poderíamos apenas fazer o devbox add [email protected] mas vamos fazer de um jeito diferente para aprender alguns detalhes.
# Listando os pacotes usando o search.
devbox search terraform
Found 25+ results for "terraform":
* terraform (1.10.3, 1.10.2, 1.10.1, 1.10.0, 1.9.8, 1.9.7, 1.9.6, 1.9.5, 1.9.4, 1.9.3 ...)
* terraform-compliance (1.3.49, 1.3.48, 1.3.47, 1.3.46, 1.3.45, 1.3.44, 1.3.43, 1.3.34, 1.2.11)
* terraform-docs (0.19.0, 0.18.0, 0.17.0, 0.16.0, 0.15.0, 0.14.1, 0.13.0, 0.12.1, 0.12.0, 0.11.2 ...)
* terraform-full (1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.9, 1.1.8, 1.1.7 ...)
* terraform-inventory (0.10, 0.7-pre)
* terraform-landscape (0.2.1)
* terraform-local (0.20.0, 0.19.0, 0.18.2)
* terraform-ls (0.36.3, 0.36.2, 0.36.0, 0.34.3, 0.34.2, 0.34.1, 0.33.1, 0.33.0, 0.32.8, 0.32.7 ...)
* terraform-lsp (0.0.12, 0.0.10)
* terraform_1 (1.3.9, 1.3.5, 1.3.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.9, 1.1.8, 1.1.7 ...)
Warning: Showing top 10 results and truncated versions. Use --show-all to show all.
# Edite diretamente o arquivo devbox.json incluindo o pacote.
❯ cat devbox.json
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": [
"yq@latest",
"[email protected]"
],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
}
# Rodando o devbox install ele irá instalar todos os pacotes que encontrar no devbox.json
devbox install
Info: Ensuring packages are installed.
Info: Installing the following packages to the nix store: [email protected]
✓ Computed the Devbox environment.
Warning: Your devbox environment may be out of date. Run refresh to update it.
Finished installing packages.
# Estranho né? Deveria ser o 1.9.8
# Isso aconteceu pois ainda esta referenciando terraform da minha máquina que é acessível a ele.
# É necessário fazer um refresh
terraform --version
Terraform v1.10.3
# Saindo e voltando
exit
devbox shell
Starting a devbox shell...
terraform --version
Terraform v1.9.8
# Saindo para o meu sistema
exit
terraform version
Terraform v1.10.3
Instalando diretamente sem fazer esse malabarismo não acontece isso.
Podemos observar que temos a pasta oculta .devbox
no projeto. É nesta pasta que temos os pacotes de forma isolada do sistema. Para um projeto real lembre-se de colocar isso no .gitignore
para não subir isso para os repositórios.
ls -lha
total 8,0K
drwxr-xr-x 5 davidprata 160 Jan 13 08:09 .
drwxr-x---+ 53 davidprata 1,7K Jan 13 09:08 ..
drwx------ 10 davidprata 320 Jan 13 09:15 .devbox
-rw-r--r-- 1 davidprata 355 Jan 13 09:00 devbox.json
-rw-r--r-- 1 davidprata 3,8K Jan 13 08:53 devbox.lock
Remover a pasta do projeto eliminará tudo que foi instalado para para sua execução.
Agora imagine o poder disso dentro de um pipeline e o quanto poderíamos facilitar o desenvolvimento e diminuir código? Seria praticamente colocar o runner para executar o devbox shell que já instala tudo o que é necessário. Diminuiríamos vários steps dos pipelines e poderíamos reaproveitar a mesma definição em vários projetos.
Além disso ter todas as dependências declaradas dentro de um arquivo no repositório facilitará o conceito de GitOps.