Um pouco de nossa experiência tentando migrar pipelines do GoCD para Concourse-CI
Recentemente um de nossos clientes solicitou a criação de um time para que fosse feita a migração de todas as suas pipelines (que estão no GoCD) para o ConcourseCI. Não vamos entrar em detalhes dos motivos por trás dessa decisão, mas contar como foi o processo que adotamos, quais foram os desafios e por que ao final de um mês chegamos a conclusão que para o seu contexto a migração não seria recomendada.
Nota: O time que foi montado era composto por apenas três pessoas, eu, Melina Deraldo e Marco Valtas.
Nota 2: Utilizamos a versão 3.9.1, por isso alguns dos problemas que vamos descrever podem ter sido resolvidos ou melhorados nas novas versões.
O Começo
Como o tempo era bem curto para a realização dessa migração (o cliente queria ir a produção com sua nova plataforma já usando suas pipelines migradas, e isso aconteceria em mais ou menos 2 meses) e nenhum de nós havia trabalhado anteriormente com Concourse, decidimos ir o mais Lean possível e para isso criamos um board no Trello e listamos as principais atividades que deveriamos realizar, tais como:
Listar pipelines a serem migradas
Comparar os recursos do Concourse com o GoCD
Subir uma instância do Concourse na AWS
-
Com as primeiras atividades conseguimos listar algumas das características e recursos do Concourse:
- No concourse tudo se baseia em conceitos de companhias aereas então temos alguns recursos que são nomeados como ATC (Air Traffic Control) que é a interfade web e scheduler de builds.
- Utiliza uma CLI nomeada como fly que é a responsável por rodar as builds no ATC.
- TUDO é executado dentro de containers Docker, TUDO mesmo.
- A interface web é fácil de ser manuseada e de se entender.
- A configuração das pipelines é feita inteiramente em arquivos YAML.
- Podemos ter pipelines separadas por
times
. - Sua documentação abrange quase tudo que é necessário para a construção de suas pipelines.
- Já possui alguns plugins criados pela comunidade que facilitam a extensão das pipelines.
Tendo um entendimento básico de como o Concourse funciona, subimos duas instâncias EC2 na AWS utilizando o Terraform. Uma instância com o container docker web (contém toda a interface do Concourse e é com ela que os workers se comunicam) e outra com um container docker contendo um worker (responsável por executar as pipelines, se comunica diretamente com o container web).
O fato de tudo utilizar containers Docker nos ajudou bastante e fez com que o processo de subida para a AWS fosse rápido.
Tendo nosso CI em operação, passamos para o próximo passo: as pipelines.
Criando pipelines no Concourse
Se você já é familarizado com o GoCD, talvez conheça o Gomatic. Nele você pode fazer toda a configuração de seu ambiente do GoCD utilizando Python.
No Concourse a nossa única opção era trabalhar com YAML para a criação das pipelines, que por si só não é uma coisa ruim, pois é bem fácil de se manusear até para pessoas que nunca trabalharam com este tipo de arquivo.
A única maneira de interagir e configurar o Concourse é através de sua CLI Fly e isso significa que você terá que ter o binário do Fly em algum lugar, e ele deve ser executado toda vez que houver uma alteração nas pipelines.
A criação de uma pipeline é bem simples:
- Suba o servidor do Concourse.
- Crie sua pipeline Yaml. (Exemplos de Pipelines)
- Utilize o Fly para criar sua pipeline no servidor.
- Pronto, agora você tem uma pipeline pronta e rodando. Simples, não ?
Bem... agora vamos a alguns probleminhas com o Concourse.
Então... os problemas.
Como nem tudo na vida são flores, começamos a ter problemas quando nossa primeira pipeline evoluiu para mais de uma e quando começamos a ter dependências entre pipelines.
Alguns probleminhas que encontramos:
Um obrigado especial a Melina que compilou essa lista junto comigo.
-
A única maneira de se criar pipelines com o concourse é através de sua cli (fly cli).
-
A única maneira de interagir e configurar o concourse é também através do fly que se conecta a ele e gera as configurações.
-
O Concourse possui o conceito de times que é uma feature maravilhosa, porém você só consegue criar novos times usando sua cli.
-
Quando criamos uma nova pipeline usando a cli-fly todo seu conteúdo é exibido em plain-text e isso significa que se alguma credencial for mudada a antiga será exibida.
-
Tudo precisa rodar em containeres docker, então quando você precisar que uma pipeline gere uma imagem docker você precisará de trabalhar com docker dentro de docker.
-
Seus dashboards começam a ficar muito difíceis de se entender quando temos uma grande quantidade de jobs. Atualmente existe um esforço para melhorá-los, porém ainda em desenvolvimento
-
O Concourse se descreve como um modelo de pipelines unificadas, porém a maneira com que ele realmente funciona é por uma serie de jobs independentes.
-
Você não pode rodar uma pipeline com uma versão antiga de seu repositório, apenas se você definir a versão do repositório de modo fixo no arquivo pipeline.yml e reconfigurar todas as suas pipelines (https://github.com/concourse/concourse/issues/413).
-
No concourse não temos o conceito de upstream e downstream. A única maneira de executar um job é manualmente ou com alguma atualização (check in/commit) em um repositório. É possível definir condições para que um job seja executado como dependência do sucesso de um job anterior, mas esse job não será executado por pelo job anterior.
-
Todos os estados dos builds precisam ser passados de job para job na forma de um * resource* que precisa ser guardado em um recurso externo (como o git). O concourse é stateless, o único elemento que mantém o estado no concourse são os recursos que como mencionado, precisam ser versionado e guardados em um data store externo.
-
Uma tarefa do Concourse precisa executar dentro de um container docker (a documentação oficial diz que isso não é necessário quando você informa a plataforma, porém quando não utilizamos uma imagem docker um erro é lançado: https://github.com/concourse/concourse/issues/1154)
-
Os "workers" do Concourse acabam ficando em um estado chamado "stalled" frequentemente. Tentamos vários tipos de configurações em nossas instâncias da Amazon EC2, porém o problema continuou a ocorrer (pode ser por uma má configuração de nossos arquivos do terraform, mas não conseguimos identificar a causa nem resolver o problema).
Conclusão
Ao final do experimento o que eu posso tirar como conclusão é que por mais promissora que seja a ideia por trás da criação do Concourse, a ferramenta em si não está madura o suficiente para que possa ser utilizada em organizações que tenham várias pipelines complexas e com dependências entre si.
Lembrando que a ferramenta ainda é relativamente nova e possui uma comunidade ativa no github e slack, e por isso pode ser que sua evolução se de de maneira rápida.