Por dentro do skaffold dev

Alvaro David
google-cloud-brasil
4 min readSep 5, 2022

No post Como facilitar o ciclo de desenvolvimento com Skaffold vimos como o Skaffold pode nos ajudar a simplificar o desenvolvimento de aplicações e mostramos como o comando skaffold dev pode facilitar e agilizar os testes e desenvolvimento local. De forma resumida, ele fica “monitorando” as alterações no código e fazendo o processo de build e deploy (local) de maneira automática. Isso evita que tenhamos que repetir vários comandos de build e deploy a cada alteração.

Nesse post vamos investigar como o comando skaffold dev faz isso e o que acontece quando o executamos.

Desde o momento que salvamos nosso código até ele ser implantado pelo Skaffold, existe uma série de passos a serem executados. Dentro do Skaffold esses passos são chamados de “Estágios”. Executar skaffold dev equivale a executar skaffold build, skaffold test e skaffold deploy de maneira constante, algo que podemos chamar de uma “pipeline de execução”. A imagem abaixo descreve esse processo:

skaffold dev pipeline

Vamos explorar cada um desses estágios, como exemplo de código vamos utilizar um hello-world feito em GoLang. Este código pode ser encontrado no repositório de exemplos de código do Google Cloud, no GitHub.

Cada estágio do Skaffold é independente e pode ser utilizado em diferentes ferramentas e de diferentes formas dentro do processo de desenvolvimento, integração e entrega das aplicações.

skaffold build

O skaffold buildlê nosso código e segundo nossas indicações — como um Dockerfile por exemplo — faz o build da imagem. É possível adicionar outras estratégias na hora de fazer o build. Como exemplo, neste skaffold.yaml estamos usando o sha256 para colocar tag (ou taguear) na imagem que será construída. O Skaffold suporta diferentes políticas de tag para imagens — Você pode encontrar maiores detalhes na documentação oficial.

skaffold.yaml — build

Também podemos usar a flag —-file-output=artifacts.json para gerar um JSON que armazena a tag utilizada na hora de fazer o build da imagem. Esta informação pode ser utilizada posteriormente para fazer testes e deployment usando a flag --build-artifacts.

skaffold build

skaffold test (Custom)

Existem dois tipos de testes no Skaffold, o Container Structure Test, que valida a integridade estrutural das imagens, e o Custom Test, que nos permite executar comandos personalizados na fase de testes.

Importante: O Custom test está em alpha (até o momento da publicação deste post), mas é uma importante ajuda para validar que as modificações que a gente fez no código não vão quebrar outras funcionalidades.

Para fazer os testes executamos
skaffold test --build-artifacts=artifacts.json e as indicações descritas no arquivo skaffold.yaml serão seguidas:

skaffold.yaml — test

No repositório do Hello world temos um arquivo main_test.go (de outro exemplo mas podemos aproveitar) para testes com duas condições de sucesso:

  • O request no “/” deve retornar um status 200.
  • O request no “/” deve conter a frase “Congratulations,…” (adaptamos o texto para nosso exemplo).
main_test.go
resultado do teste

É importante comentar que se algum dos testes falhar, o Skaffold vai parar a execução do pipeline.

skaffold deploy

Com nossa imagem pronta e os testes realizados, podemos fazer o deploy da nossa aplicação no cluster executando skaffold deploy --build-artifacts=artifacts.json, e, de igual maneira o Skaffold vai aplicar o que for indicado no skaffold.yaml. Neste cenário e pra esse exemplo, estamos utilizando kubectl para fazer o deploy baseado nos manifestos que estão na pasta kubernetes-manifest/. Para maiores detalhes sobre as estratégias de deploy do Skaffold, consulte a documentação oficial.

skaffold.yaml — deploy

Skaffold em pipelines de CI/CD

Todo este fluxo é bastante familiar e faz sentido porque cada estágio faz parte de um pipeline de CI/CD. Skaffold pode cuidar de nosso pipeline de desenvolvimento local mas também de outros pipelines de ambientes como staging e produção. Isso significa que os desenvolvedores e o time de operações podem seguir um mesmo fluxo padrão e facilitar a comunicação entre os diferentes times.

Num outro post vamos explorar como criar esse pipeline de CI/CD, mas desta vez utilizando recursos de computação em nuvem da Google Cloud.

--

--