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

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

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

내가 시도한 것은 다음과 같습니다. 명확성을 위해 볼륨 매핑을 생략했습니다.

사례 1

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

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

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

cannot enable tty mode on non tty input

사례 2

다음 명령은 이전 명령과 유사하지만 대화형 기능이 비활성화되어 있습니다.

docker run --rm $IMAGE make

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

셸에서 실행하면 명령이 성공적으로 빌드되지만 이를 중단할 수 있는 방법은 없습니다. 컨테이너는 종료 후에도 제거됩니다.

질문

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

Docker 호출이 스크립트 내부에 있고 쉽게 추출할 수 없기 때문에 Jenkins 플러그인을 사용할 수 없습니다.

답변1

Jenkins에서 Docker 빌드를 실행하는 가장 쉬운 방법은 파이프라인 작업을 사용하는 것입니다. 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/orchestrated-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 스크립트, 이것스크립트는 컨테이너 내부에서 실행됩니다.그리고도커 문서사용된 이미지입니다.

관련 정보