Como executar compilações em contêineres do Docker a partir de Jenkins

18

Estou tentando usar o Jenkins para criar um projeto C ++ em um contêiner do Docker. Eu não tenho problema em construir em Jenkins, ou construir 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 seguinte comando executa com sucesso 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 seguinte comando é semelhante ao anterior, mas desativa a interatividade.

docker run --rm $IMAGE make

O Jenkins pode executar uma compilação com sucesso. No entanto, há problemas sérios ao abortar uma compilação. A compilação é imediatamente marcada como abortada, mas o contêiner continua em execução até que a compilação seja concluída. Além disso, o contêiner não é removido após a saída.

Quando executado em um shell, o comando é compilado com sucesso, mas não é possível interrompê-lo. Além disso, o contêiner é removido após a saída.

Pergunta

Alguém saberia como executar compilações de forma limpa em contêineres do Docker a partir do Jenkins e manter a capacidade de anular construções?

Usar qualquer um dos plug-ins do Jenkins não é uma opção, porque as chamadas do Docker estão dentro dos scripts e não podem ser extraídas facilmente.

    
por marcv81 28.01.2016 / 09:56

2 respostas

3

Você pode implementar o seguinte fluxo de trabalho:

  1. crie um contêiner docker e especifique um nome para que você possa consultá-lo facilmente (por exemplo, em scripts)
  2. inicie e use algo como ponto de entrada que mantém o contêiner em execução
  3. Use docker exec container cmd ... para emitir seus comandos de criação e teste
  4. Pare o contêiner
  5. Remover a imagem

O docker exec ... é como um acesso de shell remoto a uma máquina de rede. Por padrão, ele 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 job de construção pode ser abortado por meio de:

  • docker stop container (envia TERM e KILL e espera entre), ou
  • docker kill container ou mesmo
  • docker exec container pkill someexecutable

O fluxo de trabalho com comandos concretos:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

Para um exemplo real que usa esse fluxo de trabalho, você pode ver este .travis.yml , os scripts de IC reais , o script sendo executado dentro do contêiner e o arquivos docker das imagens usadas.

    
por 20.03.2016 / 10:06
3

A maneira mais fácil de executar a janela de encaixe construída no Jenkins é usar o job de pipeline. Ele tem vários plug-ins internos que podem controlar o ambiente e os contêineres do Docker.

alguns exemplos são

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

Para mais informações: link

    
por 24.08.2016 / 15:43