วิธีรันบิลด์ในคอนเทนเนอร์ Docker จาก Jenkins


18

ฉันพยายามใช้ Jenkins เพื่อสร้างโครงการ C ++ ในคอนเทนเนอร์ Docker ฉันไม่มีปัญหาในการสร้างเจนกินส์หรือสร้างในภาชนะนอกเจนกินส์

ด้านล่างเป็นสิ่งที่ฉันพยายาม ฉันกำลังข้ามการทำแผนที่ปริมาณเพื่อความชัดเจน

กรณีที่ 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

เจนกินส์สามารถเรียกใช้งานบิลด์ได้สำเร็จ อย่างไรก็ตามมีปัญหาร้ายแรงเมื่อยกเลิกการสร้าง บิลด์จะถูกทำเครื่องหมายทันทีว่าถูกยกเลิก แต่คอนเทนเนอร์ยังคงทำงานอยู่จนกว่าบิลด์จะเสร็จสิ้น นอกจากนี้ภาชนะจะไม่ถูกลบออกหลังจากออกจาก

เมื่อรันในเชลล์คำสั่งจะสร้างสำเร็จ แต่ไม่สามารถขัดจังหวะได้ นอกจากนี้ภาชนะจะถูกลบออกหลังจากออกจาก

คำถาม

มีใครบ้างที่รู้วิธีการรัน builds อย่างสมบูรณ์ในคอนเทนเนอร์ Docker จาก Jenkins และรักษาความสามารถในการยกเลิก builds

การใช้ปลั๊กอิน Jenkins ใด ๆ ไม่ใช่ตัวเลือกเนื่องจากการโทรผ่าน Docker อยู่ในสคริปต์และไม่สามารถแตกออกได้ง่าย


1
อาจจะมีงานโพสต์บิลด์ซึ่งมีหน้าที่ลบคอนเทนเนอร์หรือไม่ และสำหรับกรณีที่คุณยกเลิกการสร้างบางทีคุณอาจมีการสร้างพิเศษที่หยุดและลบภาชนะปลอมทั้งหมด นี่เป็นสิ่งที่ไม่ดี แต่อย่างน้อยมันก็ง่ายที่จะติดตั้ง :-)
lgeorget

1
สิ่งนี้ไม่ตรงกับคำจำกัดความของฉันสะอาด :) แต่ฉันขอขอบคุณข้อเสนอแนะและแน่นอนมันเป็นวิธีแก้ปัญหาที่ถูกต้อง
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 ...เพื่อสร้างคำสั่ง build และทดสอบของคุณ
  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.