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
다음 워크플로를 구현할 수 있습니다.
- 도커 컨테이너를 생성하고 쉽게 참조할 수 있도록 이름을 지정합니다(예: 스크립트에서).
- 컨테이너를 시작하고 진입점으로 무언가를 사용하여 컨테이너를 계속 실행하세요.
docker exec container cmd ...
빌드 및 테스트 명령을 실행 하는 데 사용됩니다.- 컨테이너 중지
- 이미지 삭제
이는 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 스크립트, 이것스크립트는 컨테이너 내부에서 실행됩니다.그리고도커 문서사용된 이미지입니다.