मैं मास्टर को पुश पर जीआईटी ट्रिगर के साथ जेनकिंस सीआई कैसे बना सकता हूं?


205

मैं GitHub का उपयोग कर एक परियोजना के लिए जेनकिंस-सीआई स्थापित करने की कोशिश कर रहा हूं। मैं पहले से ही उपयुक्त प्लगइन्स के साथ जेनकिंस स्थापित कर चुका हूं। मैं चाहता हूं कि जेनकिंस तभी निर्माण स्क्रिप्ट चलाए जब कोई प्रोजेक्ट पर मास्टर को धक्का दे। अब तक मैं इसे स्थापित करने में सक्षम रहा हूं ताकि किसी भी समय किसी भी चीज को धक्का दिया जा सके एक निर्माण शुरू हो जाएगा, लेकिन यह बहुत व्यापक है। मैंने Git पर पोस्ट-प्राप्त सेवा हुक के साथ यह किया है।

मैंने जेनकिंस विकी पढ़ा है, और कुछ ट्यूटोरियल, लेकिन यह विशेष विवरण गायब है ... क्या यह मतदान के साथ कुछ करना है? या जीआईटी पक्ष पर काम किया जाना चाहिए, ताकि masterपरिवर्तन होने पर गीट केवल जेनकिंस को ट्रिगर करे ?


3
जेनकिंस के मूल लेखक, कोहसके कावागुची, वर्णन करते हैं कि कैसे Git plugin Git plugin 1.1.14 का उपयोग करके रिपॉजिटरी से पुश-नोटिफिकेशन किया जाता है। देखें kohsuke.org/2011/12/01/...
GeraldScott

जवाबों:


190

पहले से ही द्वारा बताया गया है gezzed उसकी टिप्पणी में, इस बीच वहाँ एक अच्छा समाधान है (में वर्णित मतदान मर जाना चाहिए: ट्रिगर जेनकींस एक Git हुक से बनाता है ):

  • पोल एससीएम में जेनकींस जॉब के बिल्ड ट्रिगर को सेट करें , लेकिन एक शेड्यूल निर्दिष्ट करें।

  • URL को सूचित करने के लिए GitHub पोस्ट-प्राप्त ट्रिगर बनाएँ

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • यह सभी बिल्ड को ट्रिगर करेगा जो निर्दिष्ट गिट रिपॉजिटरी को प्रदूषित करता है।

  • हालांकि, मतदान वास्तव में जाँच करता है कि क्या कुछ भी इस्तेमाल की गई शाखा में धकेल दिया गया है।

यह पूरी तरह से काम करता है।


1
इसने मेरे लिए भी बहुत अच्छा काम किया, आप स्थानीय दृष्टिकोण के साथ एक ही दृष्टिकोण का उपयोग कर सकते हैं: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
जस्टिन स्मिथ

4
Bitbucket के POST हुक (जेनकिन्स नहीं) के साथ भी काम करता है। प्रमाणीकरण क्रेडेंशियल्स को निर्दिष्ट करने के लिए, आप उपयोगकर्ता का उपयोग कर सकते हैं : URL के रूप में पासवर्ड @my.ci.server/git/notifyCommit? Url = ...।
लोवेबर्ग

क्या इसे कॉन्फ़िगर किया जा सकता है इसलिए जेनकींस रेपो के नवीनतम पुश से प्रभावित केवल लिब / प्रोजेक्ट बनाता है? फिर से पूरी शाखा का निर्माण नहीं?
क्रोलमैन

क्या आप इस हिस्से को स्पष्ट कर सकते हैं? "URL को सूचित करने के लिए एक जीथुब पोस्ट-ट्रिगर ट्रिगर बनाएं"
डेवॉल्ड 15

मुझे लगता है कि गिटब को आपके जेनकिंस उदाहरण तक पहुंचने में सक्षम होना है, जिसका अर्थ है कि इसे सार्वजनिक रूप से सुलभ होना चाहिए। क्या जेनकींस सर्वर के साथ यह काम करना संभव है जो गैर-सार्वजनिक है?
ए। मुरैना

33

संस्करण 0.5 के रूप में, जेनकिंस के लिए GitHub प्लगइन एक निर्माण को ट्रिगर कर सकता है जब परिवर्तन को GitHub में धकेल दिया जाता है


23
@ नासिकौ - मूल प्रश्न गीथूब के बारे में था।
docwhat

यह एक अच्छा समाधान नहीं है क्योंकि यह बिल्ड को ट्रिगर करता है, भले ही किस शाखा को धक्का दिया गया हो।
शैनन

वास्तव में, ऐसा लगता है कि अगर यह "पोल एससीएम" (कोई शेड्यूल आवश्यक नहीं) सक्षम करता है, तो यह जीआईटी प्लगइन सेटिंग्स में शाखा विनिर्देशक का पालन करता है।
शान्नोन

1
हालांकि यह सच हो सकता है, यह तब भी गलत तरीके से निर्माण को ट्रिगर करता है जब कोई कार्यक्षेत्र मौजूद नहीं होता है ("कार्यक्षेत्र ऑफ़लाइन है। कार्यक्षेत्र प्राप्त करने के लिए एक नया निर्माण शेड्यूल करना। यह भी देखें issues.jenkins-ci.org/browse/JENKINS-18079
शैनन

GitHub प्लगइन सूचियों Git एक निर्भरता के रूप में प्लगइनविकि कहते हैं Github परियोजना "जब एक नौकरी बनाने, के तहत URL निर्दिष्ट" "और Git के तहत URL निर्दिष्ट चुनें" स्रोत कोड प्रबंधन "। इसे कहते हैं" यह ट्रिगर केवल प्लगइन का मिलान नहीं हुआ रेपो के खिलाफ हर भेजे घटना के लिए algo आंतरिक मतदान Git की शुरूआत की। "मैं सोचें कि इसका मतलब यह है कि पोल एससीएम को स्वीकार किए गए उत्तर में बहुत पसंद है, लेकिन इसमें वेबहूक को स्वचालित रूप से सेट करने और कुछ अन्य विशेषताओं के विकल्प हैं।
डॉसेंटरमैटर

9

ट्रिगर बनाने के बजाए दूरस्थ रूप से बनाता है , अपने जेनकिंस प्रोजेक्ट कॉन्फ़िगरेशन को मतदान द्वारा ट्रिगर बनाने के लिए बदलें।

जेनकींस एक निश्चित आंतरिक या एक URL के आधार पर मतदान कर सकता है। उत्तरार्द्ध वह है जिसे आप छोड़ना चाहते हैं यदि उस शाखा के लिए परिवर्तन नहीं हैं। दस्तावेज में सटीक विवरण हैं । अनिवार्य रूप से आपको बस "पोल एससीएम" विकल्प की जांच करने की ज़रूरत है, शेड्यूल सेक्शन को खाली छोड़ दें, और JENKINS_URL / जॉब / नाम / मतदान को हिट करने के लिए एक दूरस्थ URL सेट करें।

यदि आपके पास सुरक्षित जेनकींस का वातावरण है /build, तो एक गोचा इसके विपरीत है , /pollingURL को प्रमाणीकरण की आवश्यकता है। यहाँ निर्देशों का विवरण है। उदाहरण के लिए, मेरे पास GitHub Post-Receive हुक है username:apiToken@JENKIS_URL/job/name/polling


8

के लिए GitLab , निम्न चरणों का उपयोग करें:

  1. अपने प्रोजेक्ट की सेटिंग में जाएं → वेब हुक
  2. पुश इवेंट URL के रूप में अपने जेनकींस प्रोजेक्ट से "बिल्ड नाउ" URL दर्ज करें:

    http://server.com/jenkins/job/project_name/build?delay=0sec उदाहरण के लिए

  3. क्लिक करें Add Web Hookऔर फिरtest hook

फिर जब भी आप भंडार के लिए प्रतिबद्ध होते हैं, तो वेब हुक चालू हो जाता है और एक निर्माण होता है। अपने जेनकींस कार्यक्षेत्र को सेट करना सुनिश्चित करें delete workspace before each buildताकि आपको नए कोड की एक नई प्रतिलिपि मिल सके।


2
जब आप मास्टर ब्रांच पर जोर देते हैं, तो आप इस सवाल का समाधान कैसे कर सकते हैं?
कस्टोडियो

4

जीआईटी से संबंधित नहीं है, लेकिन नीचे मैं मर्क्यूरियल के साथ जेनकिंस नौकरी विन्यास के साथ मदद करूंगा। यह एक समान समस्या से दूसरों की मदद कर सकता है।

  1. URL ट्रिगर प्लगइन स्थापित करें
  2. नौकरी कॉन्फ़िगरेशन पृष्ठ पर जाएं और Poll SCMविकल्प चुनें । करने के लिए मान सेट करें* * * * *
  3. विकल्प की जाँच करें [URLTrigger] - Poll with a URL:। अब आप कुछ विकल्पों का चयन कर सकते हैं जैसे संशोधन तिथि परिवर्तन, URL सामग्री इत्यादि।
  4. विकल्पों में, URL सामग्री परिवर्तन चुनें, पहला विकल्प चुनें - Monitor change of content
  5. परिवर्तनों को सुरक्षित करें।

अब, कुछ टेस्ट चेक-इन द्वारा मर्क्यूरियल रिपॉजिटरी में कुछ बदलाव को ट्रिगर करें।

देखें कि SCM परिवर्तनों का पता लगाकर जेनकींस की नौकरी अब चलती है। जब मरक्यूरियल बदलाव के कारण बिल्ड को चलाया जाता है, तब, आप टेक्स्ट देखेंगे Started by an SCM change। Else, उपयोगकर्ता जो इसे मैन्युअल रूप से प्रारंभ करता है।


3

मुझे उम्मीद है कि यह मदद करता है: Git कमिट पर Jenkins बिल्ड को कैसे ट्रिगर किया जाए

यह सिर्फ Git द्वारा प्रदान किए गए Git हुक का उपयोग करके Jenkins नौकरी को ट्रिगर करने के लिए कर्ल का उपयोग करने की बात है।

कमांड curl http://localhost:8080/job/someJob/build?delay=0secजेनकिंस नौकरी चला सकता है, जहां जेनकिंस नौकरी someJobका नाम है।

अपने छिपे हुए .git फ़ोल्डर में "हुक" फ़ोल्डर के लिए खोजें। "पोस्ट-कमिट" फ़ाइल को "पोस्ट-कमिट" नाम दें। नोटपैड के साथ इसे खोलें, ": नथिंग" लाइन को हटा दें और उपरोक्त कमांड को इसमें पेस्ट करें।

बस। जब भी आप एक कमिट करते हैं, तो गिट फाइल में परिभाषित पोस्ट-कमिट कमांड्स को ट्रिगर करेगा।


मैं पहली बार आपकी टिप्पणी से यहाँ उलझन में था क्योंकि, मुझे लगा कि मुझे "नौकरी" को नौकरी के नाम से ऊपर के यूआरएल में बदलना होगा। मैं भी उलझन में था क्योंकि जब मैंने जेनकिन्स में "नया आइटम" दबाया था, तो मैंने "प्रोजेक्ट" को नौकरी नहीं दी थी, इसलिए जब आपने ऊपर "someJob" का संदर्भ दिया, तो मुझे नहीं पता था कि यह मेरे प्रोजेक्ट का नाम था। मुझे आखिरकार मेरे द्वारा बताए गए url का पता चला: लोकलहोस्ट: 8078 / जॉब / कोडेसेप्ट% 20tests / build जहां "codecept 20tests" मेरे प्रोजेक्ट का नाम था। आपके समाधान के लिए धन्यवाद
पॉल प्रीबिस्क

1
धन्यवाद पॉल। मैंने आपके समाधान का उल्लेख करते हुए एक अतिरिक्त नोट के साथ ब्लॉग पोस्ट को अपडेट किया है। "20%" विशेष रूप से दूसरों के लिए उपयोगी होगा।
नव

3

जेनिटक के साथ निरंतर एकीकरण, कोड को गिट कमांड / GUI से रिपॉजिटरी में धकेल दिया जाता है:

  1. केवल नौकरी के नाम के साथ जेनकिंस में एक नौकरी बनाएं और प्रोजेक्ट फ्रीस्टाइल के प्रकार का चयन करें। क्लिक करें OK। अगले पृष्ठ में कुछ भी नहीं जोड़ा गया है - बस क्लिक करें Save
  2. अपने स्थानीय गिट रिपॉजिटरी में जाएं जहां आपके पास स्रोत कोड है और .git/hooksफ़ोल्डर में नेविगेट करें ।
  3. hooksफ़ोल्डर कुछ फ़ाइलें हैं। "पोस्ट-कमिट" के लिए जांचें। यदि मौजूद नहीं है, तो फ़ाइल एक्सटेंशन के बिना, "पोस्ट-कमिट" एक फ़ाइल बनाएं:

    C:\work\test\\.git\hooks\post-commit
    
  4. नीचे दिए गए कमांड के साथ "पोस्ट-कमिट" फ़ाइल को संपादित करें। सुनिश्चित करें कि यह आपके स्थानीय स्रोत कोड हुक फ़ोल्डर में मौजूद है।

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    उदाहरण:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5।

    userName: जेनकिंस उपयोगकर्ता नाम

    jobName: बिल्ड का जॉब नाम

    apiToken: अपना एपीआई टोकन प्राप्त करने के लिए, अपने जेनकींस उपयोगकर्ता पृष्ठ (इंटरफ़ेस में शीर्ष दाएं) पर जाएं। यह पृष्ठ के बाईं ओर "कॉन्फ़िगर करें" मेनू में उपलब्ध है: "एपीआई टोकन दिखाएं"

  5. अपने स्रोत कोड में परिवर्तन करें और कोड को रिपॉजिटरी में बदलें।

  6. आपका काम, http://localhost:8080/jenkins/job/Gitcommittest/निर्माण होना चाहिए।


3

आपको शाखा निर्दिष्ट करने की आवश्यकता है। डिफ़ॉल्ट रूप से यह किसी भी चीज को सुनता है। ब्लॉग पोस्ट देखें हडसन: गिट और मावेन प्लगइन्स


मैंने हाल ही में जेनकींस को एक निर्दिष्ट शाखा पर परिवर्तन से काम खींचने के लिए सेटअप किया है। ठीक काम करता है। +1
ग्रेग के

मैंने वह सेटिंग भी कर ली है। मैं जो नोटिस कर रहा हूं, वह यह है कि जेनकिंस को जीथब के हर धक्के के बारे में सूचित किया जाता है, और उस पर प्रतिक्रिया देता है, लेकिन केवल शाखा कदम चलाता है अगर शाखा मास्टर बदल गया है। इसलिए हमें एक टन का निर्माण होता है जो "नो चेंजेस" कहता है। क्या आप भी इस व्यवहार को देख रहे हैं?
जिग्गी

मूल प्रश्न यह है कि आपके उत्तर में कॉन्फ़िगर किए गए व्यापक और अनावश्यक ट्रिगर (किसी भी शाखा पर किसी को धक्का देने पर ट्रिगर करना) को कैसे हल किया जाए। यदि आपके पास एक ही कॉन्फिग के साथ 5 जेंकिन जॉब्स हैं, सिवाय इसके कि पहली जॉब मास्टर ब्रांच सुनें, दूसरी डिवेल ब्रांच, तीसरी फीचरएक्स ब्रांच और इसी तरह, जब आप केवल फीचरएक्स ब्रांच पर जाएं तो सभी जेंकिंस जॉब्स आपके ट्रिगर हो जाएंगे। बहुत धीमे काम करता है।
जियोम

2

इसे प्राप्त करने के लिए जेनेरिक वेबहुक ट्रिगर प्लगिन को फिल्टरों से कॉन्फ़िगर किया जा सकता है।

जब से कॉन्फ़िगर किया गया है

  • एक चर नाम refऔर अभिव्यक्ति $.ref
  • टेक्स्ट के साथ एक फ़िल्टर $refऔर जैसे फ़िल्टर एक्सप्रेशन ^refs/heads/master$

फिर वह काम हर धक्का के लिए ट्रिगर होगा master। कोई मतदान नहीं।

आप शायद webhook से अधिक मूल्यों को वास्तव में निर्माण करना चाहते हैं। JSONPath के साथ बस अधिक चर जोड़ें, जो आपको चाहिए।

यहां कुछ उपयोग के मामले हैं: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plwins/gwt/bdd


"अची" क्या है ?
पीटर मोर्टेंसन

यह एक वर्तनी की गलती थी।
टॉमस बेजर्रे

आप जेनकिंस में $ GITCOMMIT को कैसे हड़पते हैं, यह हमेशा एक webhook के साथ शून्य लगता है। फिर सफलता या असफल कहने के लिए स्थिति वापस नहीं भेज सकते।
user3520245

1

मेरे वर्तमान संगठन में, हम मास्टर में ऐसा नहीं करते हैं, लेकिन इसे स्नैपशॉट बिल्ड बनाने के लिए विकसित और रिलीज़ / शाखाओं (हम Git Flow का उपयोग कर रहे हैं) पर करते हैं।

जैसा कि हम एक बहु शाखा पाइपलाइन का उपयोग कर रहे हैं, हम इसे {} सिंटैक्स ... के साथ जेनकिंसफाइल में करते हैं

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

यह इस ब्लॉग पोस्ट में विस्तृत है: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

उपरोक्त उत्तर सही हैं, लेकिन मैं उन्हें संबोधित कर रहा हूं जो अपनी सादगी के लिए यहां नौसिखिया हैं

विशेष रूप से पाइपलाइन के लिए बिल्ड ट्रिगर स्थापित करने के लिए:

गौर कीजिए कि आपकी दो गितुब शाखाएँ हैं: 1.मास्टर, 2.देव, और जेनकिंसफाइल (जहाँ पाइपलाइन लिपि लिखी गई है) और अन्य फाइलें प्रत्येक शाखा पर उपलब्ध हैं

नई पाइपलाइन परियोजना कॉन्फ़िगर करें (देव शाखा के लिए)

## 1. गिट-प्लगइन और क्रोन आधारित दृष्टिकोण के साथ कोड एकीकरण पूर्व- शर्त गिट प्लगइन स्थापित किया जाना चाहिए और इसे अपने नाम और ईमेल के साथ कॉन्फ़िगर करना चाहिए

  1. सामान्य अनुभाग.चेक बॉक्स - 'यह परियोजना मानकीकृत है' और नाम जोड़ें-SBRANCH डिफ़ॉल्ट मान -refs / remotes / मूल / dev '
  2. ट्रिगर्स सेक्शन बनाएँ "चेकबॉक्स - 'पोल एससीएम' और हर मिनट की जाँच करने के लिए '' / 1 * * * * * जैसे कमिट्स की आवश्यकता के अनुसार शेड्यूल करें।
  3. पाइपलाइन परिभाषा अनुभाग। चयन करें - SCM से पाइपलाइन स्क्रिप्ट-> git चुनें -> addRepository URL-> git क्रेडेंशियल्स जोड़ें-> उन्नत चुनें-> नाम जोड़ें- मूल, RefSpec- 'refs / सिर / देव: refs / remotes / मूल / जोड़ें देव '(देव जीथुब शाखा है) -> शाखाएँ बनाने के लिए - $ {SBRANCH} (रेफरी से व्यास नाम 1 बिंदु) -> स्क्रिप्ट पथ-> जेनकिंसफाइल -> लाइटवेटचेकआउट अनचेक करें
  4. लागू करें-> सहेजें

## 2.कोड एकीकरण: जीथब-प्लगइन और वेबहूक अप्रोच प्रीरेसियस जीथब प्लगइन स्थापित किया जाना चाहिए और जीथब सर्वर को कॉन्फ़िगर किया जाना चाहिए, यदि निम्न कॉन्फ़िगरेशन पर विचार नहीं किया गया तो कनेक्शन का परीक्षण किया जाना चाहिए।

जेनकिंस पर खाते के साथ Github प्लगइन कॉन्फ़िगर करें

GitHub सेक्शन में Github सर्वर जोड़ें, अगर मौजूद नहीं है URL URL: https://api.github.com क्रेडेंशियल: गुप्त पाठ जोड़ें (बटन जोड़ें पर क्लिक करें: गुप्त पाठ का चयन करें) मान के साथ निजी प्रवेश टोकन (इसे अपने Github खातों से उत्पन्न करें)> सेटिंग्स -> डेवलपर सेटिंग-> व्यक्तिगत एक्सेस टोकन-> टोकन जोड़ें-> चेक स्कोप्स-> टोकन कॉपी करें) टेस्ट कनेक्शन-> चेक करें कि क्या यह आपके Github खाते से जुड़ा हुआ है या नहीं, चेक हुक के साथ चेकबॉक्स को चेक करें अग्रिम में उप-सेक्शन का चयन करें 'साझा रहस्य' के लिए पिछली साख

यदि आपके द्वारा रिपॉजिटरी में नहीं जोड़ा गया है तो webhook जोड़ें

  1. Github रिपॉजिटरी सेटिंग में जाएं -> webhook जोड़ें-> URL जोड़ें
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. या यदि आपके पास Public_IP का उपयोग नहीं है ngrok । इंस्टॉल करें, प्रमाणित करें, कमांड से सार्वजनिक आईपी प्राप्त करें ।/ngrok http 80 (अपने jenkins_port का उपयोग करें) फिर webhook जोड़ें -> URL http जोड़ें : // Ngrok_IP / github-webhook /
  3. Webhook पेज से पेलोड पहुंचाकर इसका परीक्षण करें और जांचें कि आपको 200 का दर्जा मिला है या नहीं।

यदि आपके पास Github Pull request plugin है तो इसे प्रकाशित Jenkins URL से भी कॉन्फ़िगर करें।

  1. सामान्य अनुभाग। चेकबॉक्स चेक करें - 'जीथब प्रोजेक्ट' प्रोजेक्ट URL जोड़ें - (.ith / 'के साथ समाप्त होने वाला गीथब लिंक)
  2. सामान्य अनुभाग.चेक बॉक्स - 'यह परियोजना मानकीकृत है' और नाम जोड़ें-SBRANCH डिफ़ॉल्ट मान -refs / remotes / मूल / dev '
  3. ट्रिगर्स बनाएँ। जांच करें। चेकबॉक्स चुनें - 'GITSH मतदान के लिए GitHub हुक ट्रिगर'
  4. पाइपलाइन डिफाइन अनुभाग: चुनें - SCM से पाइपलाइन स्क्रिप्ट-> git चुनें -> addRepository URL-> git क्रेडेंशियल्स जोड़ें-> उन्नत चुनें -> नाम जोड़ें- मूल, RefSpec- 'refs / सिर / dev: refs / remotes / जोड़ें मूल / देव '(देव जीथुब शाखा है) -> शाखाएँ बनाने के लिए - $ {SBRANCH} (रेफरी से व्यास नाम १. बिंदु) -> स्क्रिप्ट पथ-> जेनकिंसफाइल-> लाइटवेटचेकआउट अनचेक करें
  5. लागू करें-> सहेजें


0

एक स्थानीय git सर्वर के लिए मेरा समाधान: अपने स्थानीय git सर्वर हुक निर्देशिका पर जाएं, मौजूदा update.sample को अनदेखा करें और एक नई फ़ाइल का शाब्दिक नाम "अद्यतन" बनाएं, जैसे:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

इको स्टेटमेंट आपके गिट पुश रिजल्ट के तहत प्रदर्शित होगा, टोकन आपके जेन्किन्स जॉब कॉन्फ़िगरेशन से लिया जा सकता है, इसे खोजने के लिए ब्राउज़ करें। यदि फ़ाइल "अपडेट" नहीं कहा जाता है, तो विस्तार "नमूना" के बिना उसी नाम के साथ कुछ अन्य फ़ाइलों का प्रयास करें।

बस इतना ही चाहिए

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