2011-06-07 18 views
29

में अंतिम निर्माण के बाद से परिवर्तित फ़ाइलों की सूची कैसे प्राप्त करें, जेनकींस सेट अप कर चुके हैं, लेकिन यह पता लगाना चाहते हैं कि वर्तमान निर्माण और पिछले निर्माण के बीच कौन सी फाइलें जोड़ दी गईं/बदली गईं। स्रोत पेड़ के कुछ हिस्सों को बदल दिया गया था या नहीं, इस पर निर्भर करता है कि मैं कुछ लंबे समय तक चलने वाले परीक्षणों को चलाऊंगा।जेनकिंस/हडसन

इंटरवेब्स को खराब करने के बाद मुझे हडसन/जेनकींस के भीतर इस क्षमता का कोई उल्लेख नहीं मिल सकता है हालांकि एसवीएन पोस्ट-प्रतिबद्ध हुक का उपयोग करने के लिए सुझाव दिए गए थे। शायद यह इतना आसान है कि हर कोई (मुझे छोड़कर) जानता है कि यह कैसे करें!

क्या किसी को पता है कि यह संभव है?

उत्तर

4

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

एक पोस्ट-प्रतिबद्ध हुक एक उचित विचार है। आप नौकरी को पैरामीटर कर सकते हैं, और अपनी हुक स्क्रिप्ट को किए गए परिवर्तनों के अनुसार पैरामीटर मान सेट के साथ बिल्ड लॉन्च करना है। मुझे यकीन नहीं है कि आपके लिए कितना मुश्किल हो सकता है।

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

+1

"आप निर्माण के व्यवहार को बदलना चाहते हैं, इस पर निर्भर करता है कि कौन सी फाइलें संशोधित की गईं" उदाहरण के लिए, मैवेन इंकमेंटल बिल्ड (प्लगइन) के साथ। –

0

नोट: आपको परिवर्तन सूची प्राप्त करने के लिए जेनकिन के स्वयं के एसवीएन क्लाइंट का उपयोग करना होगा। एक खोल निर्माण चरण के माध्यम से इसे बनाने में बदलावों की सूची नहीं होगी।

16

मैंने इसे इस तरह से किया है। सुनिश्चित नहीं है कि यह सही तरीका है लेकिन काम कर रहा है। आपको जेनकिंस ग्रोवी प्लगइन स्थापित करने की आवश्यकता है और निम्न स्क्रिप्ट करें।

import hudson.model.*; 
import hudson.util.*; 
import hudson.scm.*; 
import hudson.plugins.accurev.* 

def thr = Thread.currentThread(); 
def build = thr?.executable; 

def changeSet= build.getChangeSet(); 

changeSet.getItems(); 

ChangeSet.getItems() आपको परिवर्तन देता है। चूंकि मैं accurev का उपयोग करता हूं, मैंने List<AccurevTransaction> accurevTransList = changeSet.getItems();

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

+0

इस समाधान के लिए आपके कोड का उपयोग किया गया: http://stackoverflow.com/a/12939663/734687, बहुत बहुत धन्यवाद! – ChrLipp

+0

यदि सुरक्षित नेविगेशन ('?') ऑपरेटर का उपयोग 'thr' पर किया जाता है, तो यह संभव नहीं है कि 'बिल्ड' शून्य हो सकता है, और फिर आपको' build.getChangeSet()' पर एक शून्य सूचक अपवाद मिलेगा। अगली पंक्ति नीचे? – solstice333

4
echo $SVN_REVISION 
svn_last_successful_build_revision=`curl $JOB_URL'lastSuccessfulBuild/api/json' | python -c 'import json,sys;obj=json.loads(sys.stdin.read());print obj["'"changeSet"'"]["'"revisions"'"][0]["'"revision"'"]'` 
diff=`svn di -r$SVN_REVISION:$svn_last_successful_build_revision --summarize` 
+0

क्या आप कृपया यह बता सकते हैं कि यह कैसे करें और कहां करें? आपका समाधान ऐसा लगता है जिसे मैं ढूंढ रहा हूं लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए। – Mike

+0

@ user1725378 उपखंड के लिए 'बिल्ड खोल' में चलाएं केवल – jollychang

2

आप जेनकींस Remote Access API का उपयोग अपनी पूरी परिवर्तन सेट सहित वर्तमान बिल्ड की एक मशीन पठनीय विवरण, प्राप्त करने के लिए कर सकते हैं। यहां सूक्ष्मता यह है कि यदि आपके पास 'शांत अवधि' कॉन्फ़िगर किया गया है, तो जेनकिंस एक ही संग्रह में एक ही भंडार में कई काम करता है, इसलिए एक संशोधन संख्या पर भरोसा करना थोड़ा सा बेवकूफ़ है।

मुझे अपने सबवर्जन पोस्ट-प्रतिबद्ध हुक अपेक्षाकृत सरल और हाथों को सीआई सर्वर पर बंद रखना पसंद है। ऐसा करने के लिए, मैं wget का उपयोग निर्माण, कुछ इस तरह ...

/usr/bin/wget --output-document "-" --timeout=2 \ 
    https://ci.example.com/jenkins/job/JOBID/build?token=MYTOKEN 

काम तो जेनकींस पक्ष पर कॉन्फ़िगर किया गया है Python स्क्रिप्ट है जो BUILD_URL वातावरण चर लाभ उठाता है और के लिए URL निर्माण पर अमल करने को गति प्रदान करने उस से एपीआई। यूआरएल इस तरह दिख रहा है:

https://ci.example.com/jenkins/job/JOBID/BUILDID/api/json/ 

यहां कुछ नमूना पायथन कोड है जो शैल स्क्रिप्ट के अंदर चलाया जा सकता है। मैंने चीजों को पठनीय रखने के लिए किसी भी त्रुटि हैंडलिंग या HTTP प्रमाणीकरण सामग्री को छोड़ दिया है।

import os 
import json 
import urllib2 


# Make the URL 
build_url = os.environ['BUILD_URL'] 
api = build_url + 'api/json/' 

# Call the Jenkins server and figured out what changed 
f = urllib2.urlopen(api) 
build = json.loads(f.read()) 
change_set = build['changeSet'] 
items = change_set['items'] 
touched = [] 
for item in items: 
    touched += item['affectedPaths'] 
1

ग्रूवी के माध्यम से:

<!-- CHANGE SET --> 
<% changeSet = build.changeSet 
if (changeSet != null) { 
hadChanges = false %> 
<h2>Changes</h2> 
<ul> 
<% changeSet.each { cs -> 
hadChanges = true 
aUser = cs.author %> 
<li>Commit <b>${cs.revision}</b> by <b><%= aUser != null ? aUser.displayName :  it.author.displayName %>:</b> (${cs.msg}) 
<ul> 
<% cs.affectedFiles.each { %> 
<li class="change-${it.editType.name}"><b>${it.editType.name}</b>: ${it.path}        </li> <% } %> </ul> </li> <% } 

if (!hadChanges) { %> 
    <li>No Changes !!</li> 
<% } %> </ul> <% } %> 
3

बिल्ड फ्लो प्लगइन और Git का उपयोग करना:

final changeSet = build.getChangeSet() 
final changeSetIterator = changeSet.iterator() 
while (changeSetIterator.hasNext()) { 
    final gitChangeSet = changeSetIterator.next() 
    for (final path : gitChangeSet.getPaths()) { 
    println path.getPath() 
    } 
} 
+0

क्या फ़ाइल का पूर्ण पथ प्राप्त करने का कोई तरीका है? यह भंडार से संबंधित पथ देता है, इसलिए मैं यह नहीं समझ सकता कि फ़ाइल में कौन सा भंडार था। –

+0

मुझे अपने सिर के ऊपर से नहीं पता है। आपको स्रोत, https://github.com/jenkinsci/git-plugin/blob/master/src/main/java/hudson/plugins/git/GitChangeSet.java, और/या स्वयं का प्रयोग करना होगा। –

+0

बिल्ड फ्लो प्लगइन अब मेरे लिए हटा दिया गया है, मेरे लिए (जेनकिंस 2.89) यह समाधान काम नहीं कर रहा है। – heroin

2
#!/bin/bash 

set -e 

job_name="whatever" 
JOB_URL="http://myserver:8080/job/${job_name}/" 
FILTER_PATH="path/to/folder/to/monitor" 

python_func="import json, sys 
obj = json.loads(sys.stdin.read()) 
ch_list = obj['changeSet']['items'] 
_list = [ j['affectedPaths'] for j in ch_list ] 
for outer in _list: 
    for inner in outer: 
    print inner 
" 

_affected_files=`curl --silent ${JOB_URL}${BUILD_NUMBER}'/api/json' | python -c "$python_func"` 

if [ -z "`echo \"$_affected_files\" | grep \"${FILTER_PATH}\"`" ]; then 
    echo "[INFO] no changes detected in ${FILTER_PATH}" 
    exit 0 
else 
    echo "[INFO] changed files detected: " 
    for a_file in `echo "$_affected_files" | grep "${FILTER_PATH}"`; do 
    echo " $a_file" 
    done; 
fi; 

थोड़ा अलग - मैं एक विशेष फ़ोल्डर पर Git के लिए एक स्क्रिप्ट की जरूरत .. इसलिए, मैंने jollychang

पर आधारित एक चेक लिखा

इसे सीधे जॉब की exec shell स्क्रिप्ट में जोड़ा जा सकता है। कोई फ़ाइल का पता चला रहे हैं, तो यह exit 0 होगा, यानी SUCCESS .. इस तरह आप हमेशा रेपो के लिए चेक-इन पर ट्रिगर, लेकिन निर्माण कर सकते हैं जब ब्याज परिवर्तन की फ़ोल्डर

लेकिन .. में फ़ाइलों को आप ऑन बनाना चाहते थे तो मांग (यानी क्लिक करने अब बिल्ड) पिछले निर्माण से बदल के साथ .. आप _affected_files करने के लिए बदल जाएगा:

_affected_files=`curl --silent $JOB_URL'lastSuccessfulBuild/api/json' | python -c "$python_func"` 
1
जेनकींस पाइपलाइनों के साथ

(पाइपलाइन सहायक एपीआई प्लग 2.2 या इसके बाद के संस्करण) मेरे लिए इस समाधान काम कर रहा है:

def changeLogSets = currentBuild.changeSets 
for (int i = 0; i < changeLogSets.size(); i++) { 
    def entries = changeLogSets[i].items 
    for (int j = 0; j < entries.length; j++) { 
    def entry = entries[j] 
    def files = new ArrayList(entry.affectedFiles) 
    for (int k = 0; k < files.size(); k++) { 
     def file = files[k] 
     println file.path 
    } 
    } 
} 

https://support.cloudbees.com/hc/en-us/articles/217630098-How-to-access-Changelogs-in-a-Pipeline-Job-