2012-10-09 12 views
101

जेनकींस से दूरस्थ रूप से निर्माण को कैसे ट्रिगर करें?
गिट पोस्ट प्रतिबद्ध हुक को कॉन्फ़िगर कैसे करें?गिट पोस्ट प्रतिबद्ध हुक को कॉन्फ़िगर कैसे करें

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

जेनकिंस ट्रिगर बिल्ड सेक्शन में मैंने ट्रिगर को दूरस्थ रूप से निर्मित किया।
.git निर्देशिका में, हुक निर्देशिका में है कि हमें पोस्ट प्रतिबद्ध फ़ाइल को कॉन्फ़िगर करना होगा।
मैं भ्रमित हूं कि वहां से निर्माण को कैसे ट्रिगर करना है (मुझे कुछ हिस्सा पता है कि हमें कर्ल कमांड का उपयोग करना चाहिए)।


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con 

मैं (पोस्ट के लिए प्रतिबद्ध हुक) मेरी Git सर्वर हुक निर्देशिका में इस आदेश दिया है।
जब भी परिवर्तन भंडार में होता है तो यह स्वचालित निर्माण चला रहा है।

मैं परिवर्तन में जांचना चाहता हूं कि कम से कम एक जावा फ़ाइल में निर्माण शुरू होना चाहिए या नहीं।
मान लीजिए डेवलपर्स केवल एक्सएमएल फाइलों या संपत्ति फ़ाइलों को बदलते हैं जो निर्माण शुरू नहीं होना चाहिए।
xml के साथ, मान लीजिए कि .java फाइलें हैं, तो निर्माण शुरू होना चाहिए।

+0

मैंने आपके प्रश्न के दूसरे भाग को संबोधित करने के लिए अपना उत्तर संपादित कर दिया है। – VonC

उत्तर

125

"Polling must die: triggering Jenkins builds from a git hook" में उल्लेख किया है, आप एक नया की जेनकींस सूचित कर सकते हैं के लिए प्रतिबद्ध के रूप में:

साथ

नवीनतम Git plugin 1.1.14 (है कि मैं अभी-अभी जारी), अब आप बस को क्रियान्वित करते हुए आसानी से इस अधिक> क्या कर सकते हैं निम्न आदेश:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository> 

यह सभी नौकरियों है कि निर्दिष्ट URL की जाँच करने के लिए कॉन्फ़िगर किया गया है स्कैन करेगा, और अगर वे भी मतदान के साथ कॉन्फ़िगर किया गया है, इसे तुरंत मतदान को गति प्रदान करेंगे (और है कि अगर एक परिवर्तन के लायक एक पाता है निर्माण, एक निर्माण बदले में ट्रिगर किया जाएगा।)

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

mentioned here रूप में, अपने जेनकींस सर्वर के लिए सही पते का उपयोग सुनिश्चित करें:

के बाद से हम पोर्ट 8080 यूआरएल /jenkins बिना किया जाना चाहिए था, इस तरह पर स्टैंडअलोन वेबसर्वर के रूप में चला रहे हैं जेनकींस :

http://jenkins:8080/git/[email protected]:tools/common.git 

कि अंतिम बिंदु को सुदृढ़ करने के लिए, ptha कहते हैं in the comments:

यह स्पष्ट हो सकता है, लेकिन मैं के साथ मुद्दों था:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

यूआरएल पैरामीटर से मेल खाना चाहिए कि वास्तव में क्या आप अपने जेनकींस नौकरी के भंडार यूआरएल में है।
उदाहरणों की प्रतिलिपि करते समय मैंने प्रोटोकॉल को छोड़ दिया, हमारे मामले में ssh://, और यह काम नहीं किया।


तुम भी "Push based builds using Jenkins and GIT"

#!/bin/bash 
/usr/bin/curl --user USERNAME:PASS -s \ 

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx 

में की तरह एक साधारण के बाद प्राप्त हुक का उपयोग कर सकते एक प्रमाणीकरण का उपयोग करने के लिए "उत्प्रेरक दूर से बनाता है" में सक्षम हो सकता है और करने के लिए अपने जेनकींस काम कॉन्फ़िगर टोकन (1qaz2wsx इस उदाहरण में)।

हालांकि, यह एक परियोजना-विशिष्ट लिपि है, और लेखक इसे सामान्यीकृत करने का एक तरीका बताते हैं।
पहला समाधान आसान है क्योंकि यह प्रमाणीकरण या विशिष्ट प्रोजेक्ट पर निर्भर नहीं है।


मैं परिवर्तन है कि क्या कम से कम एक जावा फ़ाइल सेट में जाँच करना चाहते हैं वहाँ का निर्माण शुरू कर देना चाहिए है।
मान लीजिए डेवलपर्स ने केवल एक्सएमएल फाइलों या प्रॉपर्टी फाइलों को बदल दिया है, तो बिल्ड शुरू नहीं होना चाहिए।

मूल रूप से, अपने निर्माण स्क्रिप्ट कर सकते हैं:

  • एक 'का निर्माण' नोट्स (git notes देखें) पहली कॉल
  • आगामी कॉल पर
  • पर डाल दिया, के HEAD के बीच प्रतिबद्ध की सूची हड़पने अपने निर्माण के लिए शाखा उम्मीदवार और git notes 'बिल्ड' (git show refs/notes/build) द्वारा संदर्भित प्रतिबद्धता: git diff --name-only SHA_build HEAD
  • आपकी स्क्रिप्ट उस सूची को पार्स कर सकती है और यह तय कर सकती है कि इसे निर्माण के साथ आगे बढ़ने की आवश्यकता है या नहीं।
  • किसी भी मामले में, अपने git notes 'build' को HEAD पर बनाएं/स्थानांतरित करें।

मई 2016: बाहर in the commentscwhsu अंक निम्नलिखित संभव यूआरएल:

तुम सिर्फ curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN इस्तेमाल कर सकते हैं अगर आप अपने मद में ट्रिगर config सेट

http://i.imgur.com/IolrOOj.png


जून 2016 polaretto अंक बाहर in the comments:

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

repository=${PWD%/hooks}; 
repository=${repository##*/} 

मिलता है और फिर इसे का उपयोग करना चाहते:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository 
+0

हाय वॉन जैसा कि आपने पहली कॉल पर कहा था, मुझे बिल्ड नोट्स रखना होगा। मेरा पहला कॉल .java फ़ाइल को पढ़ना है जब भी डेवलपर गिट रेपो में बदलाव को दबाएगा। मैं इन सभी चीजों के लिए नया हूं इसलिए मैं हर कदम पूछ रहा हूं। कृपया ध्यान न दें और मुझे यह कार्य पूरा करना होगा। –

+0

यह मेरे लिए बहुत उपयोगी है। मैंने इस विषय की सहायता से गिट हुक लिखा है। टीएनएक्स दोस्तों! –

+0

मुझे पोस्ट-प्राप्त फ़ाइल में कर्ल कॉल जोड़ना पड़ा, जो इस उत्तर से पूरी तरह स्पष्ट नहीं है। वैसे भी बहुत मददगार! – Magnilex

3

पिछले जवाब के रूप में का एक उदाहरण दिखाने के कैसे पूरा हो सकता है हुक यहां देखें मेरे कामकाजी पोस्ट-प्राप्त हुक का कोड है:

#!/usr/bin/python 

import sys 
from subprocess import call 

if __name__ == '__main__': 
    for line in sys.stdin.xreadlines(): 
     old, new, ref = line.strip().split(' ') 
     if ref == 'refs/heads/master': 
      print "==============================================" 
      print "Pushing to master. Triggering jenkins.  " 
      print "==============================================" 
      sys.stdout.flush() 
      call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://[email protected]/var/git/repo.git"]) 

इस मामले में मैं टी केवल मास्टर और अन्य शाखाओं के लिए दबाव डालने पर केवल rigger जेनकींस नौकरियां।

+1

आप इस पायथन लिपि को जेनकींस में कैसे बांधते हैं? या आप इसे सिर्फ एक बार चलाते हैं? –

+0

जेनकिन्स इस हुक के बारे में नहीं जानते हैं, मुख्य भाग जेनकिंस सर्वर पर सूचित यूआरएल को लोड कर रहा है जो एक मतदान को ट्रिगर करेगा। मुझे लगता है कि मतदान सक्षम है लेकिन जेनकींस पक्ष पर एक कार्यक्रम के बिना। – Zitrax

+0

तो यह पायथन लिपि कहाँ रहती है? मुझे लगता है कि आप इसे अपने गिट इंस्टॉलेशन के साथ टाईज़ को ट्रैक करने के लिए जोड़ते हैं ... –

15

आशा इस मदद करता है: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

यह curl का उपयोग कर Git द्वारा प्रदान की Git हुक का उपयोग कर एक जेनकींस काम को गति प्रदान करने का मामला है।
आदेश

curl http://localhost:8080/job/someJob/build?delay=0sec 

एक जेनकींस काम चला सकते हैं, जहां someJob जेनकींस नौकरी का नाम है।

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

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

+0

देव मशीन से प्रतिबद्ध करने के बाद, पोस्ट-प्राप्तकर्ता को पोस्ट-प्रतिबद्ध नहीं कहा जाता है। दोनों हुक में लॉग स्टेटमेंट डालकर सत्यापित किया गया। क्या मैं दस्तावेज़ों को गलत पढ़ रहा हूं, क्या यह पोस्ट-प्रतिबद्ध नहीं होना चाहिए जिसे बुलाया जाता है? –

+0

@ शिरिश: अजीब बात है। शायद आप कुछ अलग कर रहे हैं – Nav

+1

यह एक सही जवाब है। धन्यवाद! – chao

2

मैं ऊपर दिए गए उत्तरों में जोड़ना चाहता हूं कि जेनकिंस प्रमाणीकरण सक्षम होने पर यह थोड़ा और मुश्किल हो जाता है।

इसे सक्षम करने के बाद मुझे एक त्रुटि संदेश मिला कि अनाम उपयोगकर्ता को पढ़ने की अनुमति की आवश्यकता है।

1: करने के लिए अपने हुक बदलना:

curl --user name:passwd -s http://domain?token=whatevertokenuhave 

2: सेटिंग परियोजना आधारित प्राधिकरण

मैं दो संभव समाधान को देखा।

पूर्व समाधानों का नुकसान यह है कि मुझे हुक फ़ाइल में अपना पासवाड खुलासा करना पड़ा। मेरे मामले में अस्वीकार्य।

मेरे लिए दूसरा काम करता है। वैश्विक लेख सेटिंग्स में मुझे कुल मिलाकर सक्षम करना था> बेनामी उपयोगकर्ता के लिए पढ़ें। प्रोजेक्ट में मैं ट्रिगर करना चाहता था मुझे नौकरी> बिल्ड और जॉब> बेनामी के लिए पढ़ें।

यह अभी भी एक आदर्श समाधान नहीं है क्योंकि अब आप लॉगिन के बिना जेनकींस में प्रोजेक्ट देख सकते हैं। Http लॉगिन के साथ पूर्व दृष्टिकोण का उपयोग करके एक बेहतर समाधान हो सकता है लेकिन मुझे यह पता नहीं लगा है।

संबंधित मुद्दे