O meu estágio teve uma parte com CircleCI e com Docker aplicado no sistema operativo Windows Server 2019 tal como já tive oportunidade de vos falar num post anterior.
No meu pequeno projeto de Clean Architecture e SOLID decidi aprender um pouco mais de Docker e CircleCI. Só que em vez de utilizar o GitHub utilizei o BitBucket com o CircleCI. O procedimento é praticamente o mesmo que o de GitHub. Aceitar termos de utilização e etc.
Depois é necessário criar o ficheiro de configuração do CircleCI para correr na master.
Como tenho a restrição dos créditos por mês com o Linux, não fiz nada com Windows porque senão teria de pagar e eu não quero. Mas a lógica que vou falar aqui seria fácil de reproduzir no orb do Windows.
Fiz uma imagem do Docker com o Node.js 20.4.0 que é a versão que tenho instalada na minha maquina de desenvolvimento em que o sistem e o Ubuntu 22.04.
A ideia era ter uma imagem do sistema que estou a utilizar e não usar as imagens já existentes. "Ah podias ter usado a própria imagem do Node". Tá mas eu queria aprender a fazer from scratch para entender melhor o processo e como a imagem oficial foi feita.
Então criei uma imagem do Docker com Ubuntu e com o Node.js v20.4.0.
As principais dificuldades que eu tive foi em instalar o Node.js versão 20.4.0
Reparem neste erro do CircleCI:
Na minha imagem do Docker tinha instalado a versão v12.22.9 do Node.js e como podem ver estou a utilizar uma versão do Node.js incompativel com as dependencias do Typescript.
Porquê ?
Utilizei o comando "apt-get install nodejs npm"
Isto instala no Node.js mais antigo e com estas dependencias nao funciona.
Então decidi utilizar o nvm-sh para instalar o node.js v20.4.0. Isto é um gestor de versões do Node. Também utilizei isto no estágio mas para Windows.
Tive muita dificuldade porque o nvm utiliza um script sh para instalar e o Docker como roda em containers diferentes cada comando, ele não reconhece o que foi instalado anteriormente.
Até que pesquisei em foruns nomeadamente Stack Overflow sobre este problema e consegui ultrapassar a minha dificuldade. Vou deixar o link do post para vocês verem:
https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker/60137919#60137919
No post Didatic Version encontram a resposta.
Vou então partilhar o Dockerfile que eu realizei:
Neste caso não utilizei o MongoDB porque ao executar os testes de integração(rodava direito os unitários porque são independentes de framework) não conectava ao MongoDB que estava instalado na imagem. Portanto fiz o seguinte:
Procurei uma imagem do MongoDB 6.0.8 no CircleCI no entanto não encontrei nenhuma com essa versão.
Então experimentei uma coisa diferente.
Pesquisei se era possivel usar duas imagens Docker ao mesmo tempo.
E sim, é possível.
Então utilizei a imagem do MongoDB oficial com a versão que queria.
E gerei este config.yml seguinte:
Ele importa a imagem que contém o Node.js(a de cima) e a imagem do MongoDB 6.0.8.
Então, de seguida ele roda os testes.
Aqui está o resultado dos testes:
E se fosse com o Windows como seria a lógica ?
Ora, se fosse com o Windows, a ideia seria meter a correr a imagem do MongoDB a apontar para a porta 27107 com o docker run. Ele rodaria a imagem em segundo plano.
De seguida, com o nvm incluindo no Windows Server 2019 trocávamos a versão para a v20.4.0 e rodávamos os comandos npm install e os testes e estes teoricamente passavam.
Porquê que eu digo que ia funcionar ?
Como o MongoDB estava a ser rodado em segundo plano, o host teria acesso ao 27107 e faria as chamadas para a base de dados.
Portanto esta lógica também é replicável no Windows no entanto utiliza apenas um Docker com o MongoDB em vez de dois Dockers.
Como o CircleCI nativamente funciona com Linux, eu consigo colocar dois Dockers sem dificuldade e estes a comunicarem um com o outro. Como o meu container do Node não tinha um comando inicial, ele não executou como foi com o MongoDB e entrou no container do Ubuntu. Estes comandos foram executados dentro do container do Ubuntu.
No entanto, com o Windows ele já está no container e então basta usar o container do Mongo.
Estas foram algumas das aprendizagens que obtive nesta aventura com o Docker e o CircleCI.