जेनकिन्स से डॉकटर कंटेनरों में बिल्ड कैसे चलाएं


18

मैं एक डॉकटर कंटेनर में C ++ प्रोजेक्ट बनाने के लिए जेनकिंस का उपयोग करने की कोशिश कर रहा हूं। मुझे जेनकिंस में कोई समस्या नहीं है, या जेनकींस के बाहर एक कंटेनर में निर्माण करने की कोई समस्या नहीं है।

नीचे मैंने कोशिश की है। मैं स्पष्टता के लिए मैपिंग संस्करणों को छोड़ रहा हूं।

मामला एक

निम्न आदेश सफलतापूर्वक शेल में एक बिल्ड चलाता है।

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

हालांकि जब जेनकींस में "निष्पादित शेल" कदम के रूप में चलाया जाता है तो डॉकर निम्न त्रुटि देता है।

cannot enable tty mode on non tty input

केस 2

निम्न आदेश पिछले एक के समान है, लेकिन अन्तरक्रियाशीलता को निष्क्रिय करता है।

docker run --rm $IMAGE make

जेनकिंस एक बिल्ड सफलतापूर्वक चला सकते हैं। हालांकि एक निर्माण को रद्द करते समय गंभीर मुद्दे हैं। बिल्ड को तुरंत गर्भपात के रूप में चिह्नित किया जाता है लेकिन जब तक निर्माण पूरा नहीं हो जाता तब तक कंटेनर चलता रहता है। साथ ही कंटेनर को बाहर निकलने के बाद हटाया नहीं जाता है।

जब एक शेल में चलाया जाता है तो कमांड सफलतापूर्वक बनती है लेकिन इसे बाधित करना संभव नहीं है। साथ ही कंटेनर को बाहर निकलने के बाद हटा दिया जाता है।

सवाल

क्या कोई जान सकता है कि जेनकींस से डॉकटर कंटेनरों में साफ-सुथरी इमारतें कैसे बनती हैं और बिल्ड को खत्म करने की क्षमता बरकरार रहती है?

जेनकिन्स प्लगइन्स में से किसी का उपयोग करना एक विकल्प नहीं है क्योंकि डॉकर कॉल स्क्रिप्ट के अंदर हैं और आसानी से नहीं निकाले जा सकते हैं।


1
शायद पोस्ट-बिल्ड जॉब के साथ कंटेनर को हटाने का काम किसका है? और उन मामलों के लिए जहां आप एक बिल्ड को निरस्त करते हैं, हो सकता है कि आपके पास एक विशेष निर्माण हो सकता है जो सभी नकली कंटेनरों को रोक और निकाल सकता है? यह सबॉप्टीमल है, लेकिन कम से कम, इसे स्थापित करना आसान है। :-)
लैजोरगेट

1
यह मेरी साफ-सुथरी परिभाषा से मेल नहीं खाता है :) लेकिन मैं सुझाव की सराहना करता हूं, और यह निश्चित रूप से एक मान्य समाधान है।
marcv81

जवाबों:


3

जेनकींस में अपने डॉक का निर्माण करने का सबसे आसान तरीका पाइपलाइन कार्य का उपयोग करना है। इसमें बहुत सारे इनबिल्ट प्लग इन दिए गए हैं जो आपके डॉकर वातावरण और कंटेनरों को नियंत्रित कर सकते हैं।

कुछ उदाहरण हैं

    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-derer


2

आप निम्नलिखित वर्कफ़्लो को लागू कर सकते हैं:

  1. एक डॉकटर कंटेनर बनाएं और एक नाम निर्दिष्ट करें, जिसे आप आसानी से संदर्भित कर सकते हैं (जैसे लिपियों में)
  2. इसे शुरू करें और प्रवेश बिंदु के रूप में कुछ का उपयोग करें जो कंटेनर को चालू रखता है
  3. docker exec container cmd ...अपनी बिल्ड और टेस्ट कमांड जारी करने के लिए उपयोग करें
  4. कंटेनर बंद करो
  5. छवि निकालें

docker exec ...एक नेटवर्क मशीन के लिए एक रिमोट शेल एक्सेस की तरह है। डिफ़ॉल्ट रूप से यह संवादात्मक नहीं है और यह एक tty आवंटित नहीं करता है। यह परीक्षण सूट को संकलित करने और निष्पादित करने के लिए ठीक होना चाहिए। कमांड ठीक से कंटेनर के अंदर निष्पादित कमांड की निकास स्थिति को आगे की ओर।

एक निर्माण कार्य के माध्यम से गर्भपात किया जा सकता है:

  • docker stop container (अवधि और किल भेजता है और बीच में इंतजार करता है), या
  • 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 स्क्रिप्ट , कंटेनर के अंदर चलने वाली स्क्रिप्ट और उपयोग की गई छवियों की डॉक फ़ाइलों को देख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.