Cách chạy các bản dựng trong các container Docker từ Jenkins


18

Tôi đang cố gắng sử dụng Jenkins để xây dựng dự án C ++ trong bộ chứa Docker. Tôi không gặp vấn đề gì khi xây dựng ở Jenkins, hoặc xây dựng trong một container bên ngoài Jenkins.

Dưới đây là những gì tôi đã cố gắng. Tôi đang bỏ qua các ánh xạ khối lượng cho rõ ràng.

Trường hợp 1

Lệnh sau chạy thành công bản dựng trong trình bao.

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

Tuy nhiên, khi chạy trong Jenkins như một bước "thực thi trình bao" Docker trả về lỗi sau.

cannot enable tty mode on non tty input

Trường hợp 2

Lệnh sau tương tự lệnh trước nhưng vô hiệu hóa tính tương tác.

docker run --rm $IMAGE make

Jenkins có thể chạy một bản dựng thành công. Tuy nhiên, có những vấn đề nghiêm trọng khi hủy bỏ một bản dựng. Bản dựng ngay lập tức được đánh dấu là bị hủy bỏ nhưng container vẫn tiếp tục chạy cho đến khi bản dựng hoàn thành. Ngoài ra, container không được gỡ bỏ sau khi thoát.

Khi chạy trong shell, lệnh xây dựng thành công nhưng không thể làm gián đoạn nó. Ngoài ra các container được gỡ bỏ sau khi thoát.

Câu hỏi

Có ai biết làm thế nào để chạy sạch các bản dựng trong các container Docker từ Jenkins và giữ lại khả năng hủy bỏ các bản dựng không?

Sử dụng bất kỳ plugin nào của Jenkins không phải là một tùy chọn vì các lệnh gọi Docker nằm trong tập lệnh và không thể trích xuất dễ dàng.


1
Có lẽ với một công việc hậu xây dựng có nhiệm vụ là loại bỏ container? Và đối với các trường hợp bạn hủy bỏ một bản dựng, có lẽ bạn có thể có một bản dựng đặc biệt dừng và loại bỏ tất cả các thùng chứa giả? Điều này là tối ưu nhưng ít nhất, nó là một cách giải quyết dễ dàng để thiết lập. :-)
lgeorget

1
Điều này không hoàn toàn phù hợp với định nghĩa của tôi về sạch :) Nhưng tôi đánh giá cao đề xuất này và nó chắc chắn là một cách giải quyết hợp lệ.
marcv81

Câu trả lời:


3

Cách dễ nhất để chạy các bản dựng docker của bạn trong Jenkins là sử dụng công việc đường ống. Nó có rất nhiều plugin sẵn có có thể kiểm soát môi trường Docker và các thùng chứa của bạn.

một vài ví dụ là

    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.

Để biết thêm thông tin: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

Bạn có thể thực hiện quy trình làm việc sau đây:

  1. tạo một thùng chứa docker và chỉ định một tên để bạn có thể dễ dàng tham khảo nó (ví dụ như trong các tập lệnh)
  2. khởi động nó và sử dụng một cái gì đó làm điểm vào giữ cho container hoạt động
  3. Sử dụng docker exec container cmd ...để phát hành các lệnh xây dựng và kiểm tra của bạn
  4. Dừng container
  5. Xóa hình ảnh

docker exec ...giống như một vỏ từ xa truy cập vào một máy mạng. Theo mặc định, nó không tương tác và cũng không phân bổ một tty. Điều này sẽ tốt cho việc biên dịch và thực hiện các bộ thử nghiệm. Lệnh chuyển tiếp đúng trạng thái thoát của lệnh được thực thi bên trong container.

Một công việc xây dựng sau đó có thể bị hủy bỏ thông qua:

  • docker stop container (gửi TATE và KILL và đợi ở giữa), hoặc
  • docker kill containerhoặc thậm chí
  • docker exec container pkill someexecutable

Quy trình làm việc với các lệnh cụ thể:

$ 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

Đối với một ví dụ thực tế sử dụng quy trình công việc này, bạn có thể xem tệp .travis.yml này , tập lệnh CI thực tế , tập lệnh chạy bên trong vùng chứatập tin docker của hình ảnh được sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.