segunda-feira, 18 de novembro de 2019

Gitlab Auto DevOps com dotnet core

Como configurar o pipeline do gitlab auto devops usando dotnet core?

Já falei antes sobre o recurso Auto Devops do Gitlab. Mas não mencionei algumas restrições e como a magica funciona.

No artigo anterior, abordei o pipeline do gitlab trabalhando com um cluster kubernetes. E como disse, é possível, fazendo uso apenas de um Dockerfile, ter sua aplicação fazendo o Build, Test e Deploy em um cluster Kubernetes.
Obviamente, não é uma magica e sua aplicação deve seguir alguns critérios para que essa facilidade se torne disponível. Como por exemplo: Dockerfile deve estar na raiz da sua aplicação, recurso auto devops deve estar ativo nas configurações do projeto e você precisa utilizar uma das linguagens suportadas pelo padrão. Isso já basta para que sua aplicação "magicamente", tenha o pipeline construído sem nenhum tipo de esforço adicional.

Certo, mas e quando minha linguagem não é suportada?

Como tudo é baseado em Dockerfile, podemos utilizar a imagem correta para fazer o trabalho por nós. No caso do dotnet core, teremos de utilizar duas imagens, uma para build e outra de runtime.
Já testei diversas imagens, a que mais utilizei, foram as versões 2.1 e 2.2.

Para montar o Dockerfile, vamos imaginar a seguinte estrutura de projeto Pokemon:

./src/api (sua aplicação aqui)
./src/api/nuget.config
./src/api/pokemon.csproj
./src/test (seus testes aqui)
./src/test/nuget.config

E o resultado do Dockerfile, é o seguinte:

FROM microsoft/dotnet:2.2-sdk-alpine AS build

WORKDIR /app

COPY ./src/ ./

RUN dotnet restore --configfile Api/nuget.config Api
RUN dotnet restore --configfile Test/nuget.config Test

RUN dotnet test test
RUN dotnet publish api -c production -o out
FROM microsoft/dotnet:2.2-aspnetcore-runtime-alpine
COPY --from=build /app/api/out ./app WORKDIR /app EXPOSE 5000
ENTRYPOINT [ "dotnet", "Pokemon.dll" ]

Curiosidade: Se fosse um projeto node, por exemplo. O simples fato de ter um projeto de teste, já seria o bastante para que (com o padrão herokuish) ocorresse a detecção do padrão do projeto e as coisas acontecessem sem ter de rodar os testes dentro do Dockerfile (claro que você pode criar um step de teste no gitlab, mas teria que customizar o auto DevOps).

Bom, creio que seja isso :) 
Caso tenha dúvidas no seu projeto, basta postar no stackoverflow e mandar o link aqui nos comentários que tentarei te ajudar.

Ah, da uma lida nesse material:
https://docs.gitlab.com/ee/topics/autodevops/#custom-helm-chart.
Você certamente vai precisar em algum momento :P

Abraços, boa sorte \o/