Jenkins의 Docker 컨테이너에서 빌드를 실행하는 방법


18

Jenkins를 사용하여 Docker 컨테이너에서 C ++ 프로젝트를 빌드하려고합니다. Jenkins에서 빌드하거나 Jenkins 외부의 컨테이너에 빌드하는 데 문제가 없습니다.

아래는 내가 시도한 것입니다. 명확성을 위해 볼륨 매핑을 생략하고 있습니다.

사례 1

다음 명령은 쉘에서 빌드를 성공적으로 실행합니다.

docker run --rm --interactive=true --tty=true $IMAGE make

그러나 Jenkins에서 "execute shell"단계로 실행하면 Docker는 다음 오류를 반환합니다.

cannot enable tty mode on non tty input

사례 2

다음 명령은 이전 명령과 유사하지만 대화 형 기능을 비활성화합니다.

docker run --rm $IMAGE make

Jenkins는 빌드를 성공적으로 실행할 수 있습니다. 그러나 빌드를 중단 할 때 심각한 문제가 있습니다. 빌드는 즉시 중단 된 것으로 표시되지만 빌드가 완료 될 때까지 컨테이너는 계속 실행됩니다. 또한 종료 후 컨테이너가 제거 되지 않습니다 .

쉘에서 실행될 때 명령이 성공적으로 빌드되지만 인터럽트 할 수는 없습니다. 또한 컨테이너는 종료 후 제거됩니다.

질문

Jenkins의 Docker 컨테이너에서 빌드를 깨끗하게 실행하고 빌드를 중단하는 기능을 유지하는 방법을 아는 사람이 있습니까?

Docker 호출은 스크립트 내부에 있으며 쉽게 추출 할 수 없으므로 Jenkins 플러그인을 사용하는 것은 옵션이 아닙니다.


1
컨테이너를 제거하는 작업을 수행 한 빌드 후 작업 일 수 있습니까? 그리고 빌드를 중단하는 경우, 모든 가짜 컨테이너를 중지하고 제거하는 특수 빌드를 가질 수 있습니까? 이것은 차선책이지만 적어도 설정하기 쉬운 해결 방법입니다. :-)
lgeorget

1
이것은 clean :)에 대한 나의 정의와 일치하지 않지만 제안을 고맙게 생각하며 확실히 유효한 해결 방법입니다.
marcv81

답변:


3

Jenkins에서 도커 빌드를 실행하는 가장 쉬운 방법은 파이프 라인 작업을 사용하는 것입니다. Docker 환경과 컨테이너를 제어 할 수있는 많은 내장 플러그인이 있습니다.

몇 가지 예는

    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.

자세한 정보 : https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

다음과 같은 워크 플로우를 구현할 수 있습니다.

  1. 도커 컨테이너를 만들고 쉽게 참조 할 수 있도록 이름을 지정하십시오 (예 : 스크립트)
  2. 시작하고 컨테이너를 계속 작동시키는 진입 점으로 사용하십시오.
  3. 사용 docker exec container cmd ...빌드 및 테스트 명령을 실행할
  4. 컨테이너를 중지
  5. 이미지를 제거

이는 docker exec ...네트워크 시스템에 대한 원격 셸 액세스와 같습니다. 기본적으로 대화식이 아니며 tty를 할당하지 않습니다. 테스트 스위트를 컴파일하고 실행하는 데 좋습니다. 이 명령은 컨테이너 내에서 실행 된 명령의 종료 상태를 올바르게 전달합니다.

다음을 통해 빌드 작업을 중단 할 수 있습니다.

  • docker stop container (TERM과 KILL을 보내고 그 사이에 대기) 또는
  • docker kill container, 또는
  • docker exec container pkill someexecutable

구체적인 명령이 포함 된 워크 플로우 :

$ 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

이 워크 플로를 사용하는 실제 예를 보려면이 .travis.yml 파일, 실제 CI 스크립트 , 컨테이너 내에서 실행중인 스크립트 및 사용 된 이미지 의 도커 파일 을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.