Estou tentando usar o Jenkins para criar um projeto C ++ em um contêiner do Docker. Não tenho nenhum problema em construir em Jenkins ou em um contêiner fora de Jenkins.
Abaixo está o que eu tentei. Estou omitindo o mapeamento de volumes para maior clareza.
Caso 1
O comando a seguir executa com êxito uma compilação em um shell.
docker run --rm --interactive=true --tty=true $IMAGE make
No entanto, quando executado no Jenkins como uma etapa "executar shell", o Docker retorna o seguinte erro.
cannot enable tty mode on non tty input
Caso 2
O comando a seguir é semelhante ao anterior, mas desativa a interatividade.
docker run --rm $IMAGE make
Jenkins pode executar uma compilação com sucesso. No entanto, existem problemas sérios ao interromper uma compilação. A construção é imediatamente marcada como abortada, mas o contêiner continua em execução até que a construção seja concluída. Além disso, o recipiente não é removido após a saída.
Quando executado em um shell, o comando é construído com êxito, mas não é possível interrompê-lo. Além disso, o recipiente é removido após a saída.
Questão
Alguém saberia como executar compilações de maneira limpa nos contêineres do Docker da Jenkins e manter a capacidade de abortar compilações?
O uso de qualquer um dos plugins Jenkins não é uma opção, pois as chamadas do Docker estão dentro de scripts e não podem ser extraídas facilmente.
Respostas:
A maneira mais fácil de executar as construções do docker no Jenkins é usar o trabalho de pipeline. Ele possui muitos plug-ins embutidos que podem controlar o ambiente e os contêineres do Docker.
alguns exemplos são
Para obter mais informações: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
fonte
Você pode implementar o seguinte fluxo de trabalho:
docker exec container cmd ...
para emitir seus comandos de construção e testeO
docker exec ...
é como um acesso shell remoto a uma máquina de rede. Por padrão, não é interativo e também não aloca um tty. Isso deve ser bom para compilar e executar conjuntos de testes. O comando encaminha corretamente o status de saída do comando executado dentro do contêiner.Um trabalho de construção pode ser abortado através de:
docker stop container
(envia TERM e KILL e aguarda no meio), oudocker kill container
ou mesmodocker exec container pkill someexecutable
O fluxo de trabalho com comandos concretos:
Para um exemplo real que usa esse fluxo de trabalho, você pode ver este arquivo .travis.yml , os scripts de IC reais , o script em execução no contêiner e os arquivos de encaixe das imagens usadas.
fonte