Git पोस्ट कमिट हुक को कॉन्फ़िगर कैसे करें


127

जेनकींस से दूरस्थ रूप से बिल्ड को कैसे ट्रिगर किया जाए?
Git पोस्ट कमिट कॉन्फ़िगर कैसे करें?

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

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


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

मैंने इस कमांड को अपने git सर्वर हुक डायरेक्टरी (पोस्ट कमिट हुक) में रखा है।
जब भी परिवर्तन रिपॉजिटरी में होता है, तो यह स्वचालित बिल्ड चल रहा होता है।

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


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

जवाबों:


165

जैसा कि " मतदान मरना चाहिए: जेनकिंस को ट्रिगर हुक से बनाता है ", आप एक नई प्रतिबद्धता के जेनकींस को सूचित कर सकते हैं:

नवीनतम Git प्लगइन 1.1.14 (जो मैं अभी जारी करता हूं) के साथ, अब आप इसे और अधिक> आसानी से निम्नलिखित कार्यों को निष्पादित करके कर सकते हैं:

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

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

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

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

चूँकि हम Jenkins को स्टैंडअलोन वेबसर्वर के रूप में पोर्ट 8080 पर चला रहे हैं, URL /jenkinsइस तरह से बिना होना चाहिए :

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

उस अंतिम बिंदु को सुदृढ़ करने के लिए, ptha टिप्पणियों में जोड़ता है :

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

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

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


आप एक सरल पोस्ट-प्राप्त हुक का उपयोग कर सकते हैं जैसे " जेनकिंस और जीआईटी का उपयोग करके पुश आधारित बिल्ड "

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

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

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

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


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

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

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

मई २०१६: cwhsu टिप्पणियों में निम्नलिखित संभावित अंक की ओर इशारा करता है:

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

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


जून 2016, पोलरेत्तो टिप्पणियों में बताते हैं :

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

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

और फिर इसका उपयोग करें जैसे:

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

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

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

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

1
@IgorGanapolsky आपके नंगे रेपो के हुक फोल्डर में जो कमिट कर रहा है और जिसे जेनकिंस बुलाना है:yourRepo.git/hooks/post-receive
VonC

2
यह स्पष्ट हो सकता है, लेकिन मेरे पास मुद्दे थे curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>:। यूआरएल पैरामीटर बिल्कुल मेल खाना चाहिए क्या आप में है भंडार यूआरएल अपने जेनकींस नौकरी की। उदाहरणों की नकल करते समय मैंने प्रोटोकॉल छोड़ दिया, हमारे मामले में ssh: // और यह काम नहीं किया।
ptha

17

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

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

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

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

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

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


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

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

यह तब सफलतापूर्वक बन जाता है जब मेरे पास अंतिम परिवर्तन करने के लिए धक्का होता है लेकिन जब मैं बदलाव करता हूं तो निर्माण नहीं करता ... ???

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://user@gitserver/var/git/repo.git"])

इस मामले में मैं केवल मास्टर और अन्य शाखाओं को धक्का देने पर जेनकिंस नौकरियों को ट्रिगर करता हूं।


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

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

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

1
देर से जवाब - लेकिन स्क्रिप्ट का स्थान हुक / पोस्ट-प्राप्त में git सर्वर पर होगा। अधिक जानने के लिए गिट हुक पर पढ़ें।
ज़िट्रैक्स

3

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

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

मैंने दो संभावित उपाय देखे:

1: मेरे हुक को इसमें बदलना:

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

2: परियोजना आधारित प्राधिकरण स्थापित करना।

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

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

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

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