हमारे पास गोलंग, एक अलग विषय कफ़्का, क्लिकहाउस, गिटलैब-सी और एक गिरती हुई पेलाइन, एक सड़े हुए एसश-की और सेवा के साथ-साथ एक छुट्टी का मौसम, शहर में भयानक बारिश, एक टूटे हुए लैपटॉप, रात में अलर्ट और एक गर्म बिक्री है। । ऐसा नहीं है कि यह सब इस लेख के लिए आवश्यक था, लेकिन एक बार जब आप परीक्षक के सामान्य रोजमर्रा के जीवन को दिखाते हैं, तो अंत में अपने इरादे पर जाएं। केवल एक चीज जो मुझे परेशान करती थी वह था p0। दुनिया में टेस्टर से ज्यादा हताश, उदास और उदास कुछ भी नहीं है जो इसे ठेस से चूक गया। लेकिन मुझे पता था कि बहुत जल्द मैं इसमें उतर जाऊंगा।
यह सब क्यों?
सेवाओं का एक सामान्य बंडल है - सेवा स्वयं जो कुछ करती है - और एक डेटाबेस जिसमें ये परिणाम लिखे जाते हैं। कभी-कभी यह सीधे तौर पर होता है, अर्थात "सेवा - आधार"। मेरे मामले में, रिकॉर्डिंग एक मध्यस्थ के माध्यम से होती है, अर्थात, "सेवा - कतार - आधार"।
कुल में, कई तत्व हैं, और इन तत्वों की सीमा - एक का आउटपुट और दूसरे का इनपुट - यह वह जगह है जहां समस्याएं दिखाई देती हैं। वे बस वहाँ दिखाई नहीं दे सकते।
एक ज्वलंत उदाहरण: सेवा में, मूल्य क्षेत्र को फ़्लोट 32 के रूप में संसाधित किया जाता है, डेटाबेस में इसे दशमलव (18, 5) के रूप में कॉन्फ़िगर किया जाता है, हम फ़्लोट 32 का अधिकतम मूल्य परीक्षण के मामले में सेवा के आउटपुट से डेटाबेस - ओउ तक खिलाते हैं, डेटाबेस जवाब नहीं देता है। या अधिक दुखद उदाहरण - डेटाबेस क्रैश नहीं करता है, लेकिन डेटाबेस में डेटा लॉग में कोई त्रुटि नहीं है। यह सिर्फ इतना है कि डेटाबेस अब नहीं डालता है। या रिकॉर्डिंग के माध्यम से चला जाता है, लेकिन डेटा की हानि के साथ या विरूपण के साथ: क्षेत्र फ्लोट64 के रूप में सेवा से बाहर निकलता है, और फ्लोट 32 के रूप में दर्ज किया जाता है।
या, सेवा जीवन चक्र की प्रक्रिया में, उन्होंने तय किया कि इस या उस क्षेत्र के प्रकार को बदलना आवश्यक था। क्षेत्र लंबे समय तक ठेस पर लागू किया गया है, लेकिन यहां इसे संपादित करना आवश्यक है। और निश्चित रूप से हमने इसे केवल एक ही स्थान पर बदल दिया है। होबा, फिर से कुछ गलत हो गया।
कार्य
मैं इन सभी बदलावों पर नज़र नहीं रखना चाहता। मैं चाहता हूं कि यह न घटे। मैं चाहता हूं कि रिकॉर्डिंग सही हो।
बाहर निकलें: एकीकरण परीक्षण!
कार्यान्वयन और कठिनाइयों
कहाँ तोड़ना है?
एक देव वातावरण है: बहुत अस्थिर है और आमतौर पर डेवलपर्स द्वारा सैंडबॉक्स के रूप में उपयोग किया जाता है। एक कठिन बैकएंड की अराजकता और अराजकता विशेषता है।
एक परीक्षण वातावरण या क्यूए-स्टैंड है: यह बेहतर ट्यून है, यहां तक कि देवोप्स भी इसे देख रहे हैं, लेकिन जब तक आप उन्हें किक नहीं करते, तब तक कुछ भी नहीं होगा। और यह वातावरण अक्सर अद्यतन किया जाता है। और इससे भी अधिक बार, वहाँ कुछ टूट गया है।
और एक ठेस है - पवित्र का पवित्र: उस पर ऐसा कुछ भी नहीं चलाना बेहतर है। एकीकरण परीक्षण एक बग की संभावना का सुझाव देते हैं जो उन्हें ठेस पहुंचने से पहले ढूंढना होगा।
तो पर्यावरण के साथ क्या करना है जब यह अस्थिर या मुकाबला है? यह सही है, अपना खुद का बनाएं!
आधार के साथ क्या करना है?
डेटाबेस को कई तरीकों से लॉन्च किया जा सकता है।
जैसा कि हमने ऊपर चर्चा की, हम इस या उस वातावरण के वास्तविक आधार से नहीं जुड़ेंगे।
सबसे पहले, आप आवश्यक सेटिंग्स के साथ
cruttle क्लिकहाउस-सर्वर बढ़ा सकते हैं, उस पर आवश्यक एसक्यूएल को रोल आउट कर सकते हैं और क्लिकहाउस-क्लाइंट के माध्यम से इसके साथ संवाद कर सकते हैं। इसी तरह का आधार रखने के पहले सफल प्रयास पर, सीआई दुखी थे। परीक्षण भड़क गए, सर्वर बाहर नहीं गया और काम करना जारी रखा। चलिए हम बताते हैं, यह अभी भी मेरे लिए एक रहस्य बना हुआ है कि इसकी शुरुआत क्यों हुई। (यह स्वयं, मुझे इससे कोई लेना देना नहीं है)। मैं इस विकल्प की सिफारिश नहीं करता हूं।
बॉक्स से बाहर एक सुविधाजनक विकल्प
डॉक छवि का उपयोग है।
अपनी कार के लिए वांछित संस्करण डाउनलोड करें। क्लिकहाउस को शुरू करने के लिए सेटिंग्स के साथ config.xml की जरूरत है। अधिक जानकारी
यहाँपुन: उपयोग की गई क्लिक छवि के लिए, आपको सही डॉकफाइल बनाने की आवश्यकता है। हम इसमें संकेत देते हैं कि हम config.xl को फ़ोल्डर में कॉपी करना चाहते हैं, हम अन्य आवश्यक कॉन्फ़िगरेशन को डॉक करते हैं। अपने आधार को तैनात करने के लिए लिपियों की नकल करना सुनिश्चित करें।
चूंकि हम बाहर से छवि एक्सेस कर रहे हैं, हमें उन पोर्ट्स को खोलने की आवश्यकता है जिनके माध्यम से हम क्लिकहाउस के साथ संवाद करेंगे। Http पर 8123 और tcp पर 9000 पर क्लिक करें।
हमें निम्नलिखित डॉकफाइल मिले:
From yandex/clickhouse-server Expose 8123 Expose 9000 Add config.xml /etc/clickhouse-server/config.xml Add my_init_script.sql /docker-entrypoint-initdb.d/
कैसे एक छवि ci में फेंकने के लिए?
किसी तरह से सीआई में docker की छवि के साथ काम करने के लिए, आपको इसे किसी तरह वहां बुलाने की आवश्यकता है।
आप अपनी रिपॉजिटरी में छवि को कमिट और रन कर सकते हैं और परीक्षण चलाने के भाग के रूप में आवश्यक मापदंडों के साथ डॉक रन कर सकते हैं। केवल यहां क्लिक की डॉकटर-इमेज का वजन 350mb से कम है। इस तरह की फाइलों को जीआईटी में रखना अशोभनीय है।
इसके अलावा, यदि विभिन्न प्रोजेक्ट्स पर एक ही डॉकटर छवि की आवश्यकता होती है (उदाहरण के लिए, एक ही डेटाबेस के लिए अलग-अलग सेवाएं लिखी जाती हैं), तो सभी को और अधिक आपको ऐसा नहीं करना चाहिए। आप
docker रजिस्ट्री इमेज स्टोरेज का उपयोग कर सकते हैं
हम मानते हैं कि हमारी परियोजना में यह पहले से मौजूद है और इसका उपयोग किया जाता है। इसलिए, लॉग इन करें, डॉकटर छवि एकत्र करें और इसे वहां धक्का दें।
docker build -t my_clickhouse_image . docker login my_registry_path.domain.com docker push my_clickhouse_image
आठ और हमारी छवि रजिस्ट्री में उड़ गई। विधानसभा के दौरान टैग निर्दिष्ट करना सुनिश्चित करें!
आधार तैयार है।
रजिस्ट्री के बारे में अधिक पढ़ें
यहाँCi के साथ क्या करना है?
एक कदम के भीतर अपनी सेवा और डेटाबेस दोनों कैसे लॉन्च करें?
यह सब इस बात पर निर्भर करता है कि हम सेवा कैसे शुरू करते हैं और उसका उपयोग करते हैं। यदि आप सेवा के साथ डॉकटर छवि के रूप में काम करते हैं, और वास्तव में संपूर्ण .gitlab-ci.yml केवल उनके साथ काम करता है, तो सब कुछ सरल है।
एक भटका हुआ आवारा है - डॉक
-इन- द
-डोकर । यह मुख्य सेवा के साथ काम करता है के रूप में इंगित किया गया है, और आप पूरी तरह से डॉक का उपयोग करने की अनुमति देते हैं और बिल्कुल भी तनाव नहीं देते हैं।
हम नवीनतम छवि को पंप करते हैं, चरणों में आवश्यक परीक्षण चरण जोड़ते हैं, और हमारे कार्यों के अनुक्रम का वर्णन करते हैं।
image: docker:stable services: - docker:dind stages: - build … - test-click ... - test - release … test-click: variables: VERY_IMPORTANT_VARIABLE: “its value” before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker pull My_Service_Image - docker pull My_ClickHouse_Image - docker run -FLAGS My_ClickHouse_Image - docker run My_Service_Image /path/to/tests
आधिकारिक
docker docker कहता है कि यह
डिंड का उपयोग करने के लिए अनुशंसित नहीं है, लेकिन अगर आपको वास्तव में ...
मेरी परियोजना में, बाइनरी के लॉन्च के माध्यम से सेवा का परीक्षण किया जाना चाहिए। यहीं से शुरू होता है जादू।
ऐसा करने के लिए, एक सेवा के रूप में डेटाबेस का उपयोग करें। आधिकारिक गिटलैब-सीआई दस्तावेज़ीकरण सीआई में डॉकटर कंटेनर
के लिए सबसे आम उपयोग के मामले के
उदाहरण के रूप में एक आधार के साथ एक कंटेनर के उपयोग का हवाला देता है। यहां तक कि mysql, postress, और redis सेटिंग्स के
उदाहरण दिए गए हैं। लेकिन हम आसान तरीकों की तलाश नहीं कर रहे हैं, हमें एक क्लिकहाउस की आवश्यकता है।
आधार कनेक्ट करें! उर्फ निर्दिष्ट करना सुनिश्चित करें। यदि यह निर्दिष्ट नहीं है, तो आधार को एक यादृच्छिक नाम और यादृच्छिक आईपी सौंपा जाएगा। यही है, यह स्पष्ट नहीं होगा कि इसे कैसे एक्सेस किया जाए। उपनाम के साथ ऐसी कोई समस्या नहीं होगी - परीक्षण कोड में, कॉल उदाहरण के लिए,
http://my_alias_name:8123
द्वारा
http://my_alias_name:8123
।
परीक्षणों के लिए, डेटाबेस की एक छवि अभी भी आवश्यक है, जिसे हमने सावधानीपूर्वक रजिस्ट्री में डाल दिया है। छवि को डाउनलोड करने के लिए, आपको docker login और docker pull करने की आवश्यकता है, केवल ci को यह पता नहीं है कि docker क्या है - आपको इसे स्थापित करने की आवश्यकता है।
Gitlab-ci.yml में चरण के लिए परिणामी कोड:
Integration tests: Services: - name: my_clickhouse:latest alias: clicktest Stage: tests Variables: Variables_for_my_service: “value” Before_script: - curl -ssl https://get.docker.com/ | sh - docker login -u gitlab-ci-token -p $ci_build_token my_registry_path.domain.com Script: - ./bin/my_service & - go test -v ./tests -tags=integration Dependencies: - build
लाभ
- मेरे पास सर्विस बेस का एक कार्यशील गुच्छा है।
- ऑटोटेस्ट के हिस्से के रूप में, डेटाबेस तक पहुंचना आसान है - बस उपनाम से।
- मैं सेटअप परीक्षण के हिस्से के रूप में डेटाबेस के रिकॉर्ड और सेटिंग्स को रीसेट करता हूं, सेवा को कॉल करता हूं, यह डेटाबेस को लिखता है, मैं डेटाबेस की ओर मुड़ता हूं, मैं देखता हूं कि डेटाबेस गिर नहीं गया है, मैं देखता हूं कि क्या आ गया है, मैं मान्य करता हूं। अधिक परीक्षण फेंकें।
- आप पेन से टेस्ट नहीं कर सकते!
परिणाम
ऐसा लगता है कि gitlab-ci में सेटअप की कुछ पंक्तियाँ। डॉकटर छवि बनाना आसान है। स्थानीय रूप से स्थानीय स्तर पर चलना सरल है। मुझे पहले परीक्षणों के साथ एकीकरण मिला जिसमें एक दिन में समस्याएं मिलीं। लेकिन इसे ci में लॉन्च करने का प्रयास एक सप्ताह के दर्द और निराशा में बदल गया। और अब, डेवलपर्स के दर्द और निराशा के हफ्तों में, जो उन्हें वहां प्रोग्राम किए गए सभी चीजों की मरम्मत करना है।
हमने क्या करने का प्रबंधन किया?
- हमने क्लिकहाउस के साथ एक कंटेनर स्थापित किया है।
- हमने स्थानीय भंडारण में कंटेनर शुरू किया।
- हमने इस छवि को स्टेप ci में बनाना सीखा।
- इसे रनर में लॉन्च किया।
आसानी से डेटाबेस को डेटा भेजा और परीक्षण से इसे एक्सेस किया।
मैन्युअल रूप से भेदी एकीकरण की दिनचर्या से छुटकारा पाने के लिए स्वचालन एक बहुत ही सरल तरीका है।
इस पर ध्यान देना महत्वपूर्ण है: सुनिश्चित करें कि आधार के इनपुट प्रकार पिछले लिंक के आउटपुट प्रकारों के अनुरूप हैं। (और प्रलेखन
, यदि कोई हो )।