2013-07-17 3 views
8

बिल्डबॉट के भीतर मुझे संकलन चरण करने से पहले पर्यावरण को "स्रोत" करने में सक्षम होना चाहिए।बिल्डबॉट चरण के अंदर आप पर्यावरण को "स्रोत" कैसे बना सकते हैं?

. envrionment-set-up-script 
build_command 

निर्माण बॉट master.cfg फ़ाइल मैं निम्नलिखित की कोशिश की है के भीतर::

factory.addStep(ShellCommand(command=["source","environment-set-up-script"]) 
factory.addStep(ShellCommand(command=[".","environment-set-up-script"])) 
factory.addStep(Configure(command=["source","environment-set-up-script"])) 
factory.addStep(Configure(command=[".","environment-set-up-script"])) 

सभी

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

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

उत्तर

4

कुछ प्रयोग करने के बाद मुझे यह प्राप्त करने का एक तरीका मिला है।

  • रन एक बैश उप खोल वातावरण है कि कि खोल के लिए इस्तेमाल किया जाना चाहिए की स्थापना, अर्थात वातावरण चर BASH_ENV फ़ाइल है कि वातावरण में sourced किया जाना चाहिए करने के लिए सेट के साथ बैश फोन: आप की जरूरत है।
  • पर्यावरण
  • कब्जा करने के लिए एक संपत्ति में env आदेश का परिणाम पार्स
  • रूप अगले चरण के भीतर संपत्ति का उपयोग करें (एक SetProperty कदम का प्रयोग करके) बैश में env आदेश चला env पैरामीटर

नोट: कि पर्यावरण एक शब्दकोश है कि एक के रूप में इस्तेमाल किया जा सकता के रूप में पार्स किया जाना चाहिए तब

class EnvStep(ShellCommand): 
    def __init__(self, command='', **kwargs): 
     kwargs['command'] = [ 
      'bash', '-c', 'source environment-set-up-script; %s' % command 
     ] 
     ShellCommand.__init__(self, **kwargs) 

, एक EnvStep कि foo की सुविधा देता है के लिए अपनी command पैरामीटर सेट जोड़ने: n env पैरामीटर

from buildbot.process.factory import BuildFactory 
    from buildbot.steps.shell import ShellCommand, SetProperty 
    from buildbot.process.properties import Property 

    def glob2list(rc, stdout, stderr): 
     ''' Function used as the extrat_fn function for SetProperty class 
      This takes the output from env command and creates a dictionary of 
      the environment, the result of which is stored in a property names 
      env''' 
     if not rc: 
      env_list = [ l.strip() for l in stdout.split('\n') ] 
      env_dict={ l.split('=',1)[0]:l.split('=',1)[1] for l in 
          env_list if len(l.split('=',1))==2} 
      return {'env':env_dict} 

    #This is the equivalent of running source MyWorkdir/my-shell-script then 
    #capturing the environment afterwords. 
    factory.addStep(SetProperty(command="bash -c env", 
       extract_fn=glob2list,  
       workdir='MyWorkdir', 
       env={BASH_ENV':'my-shell-script' })) 

    #Do another step with the environment that was sourced from 
    #MyWorkdir/my-shell-script 
    factory.addStep(ShellCommand(command=["env"], 
       workdir="MyWorkdir", 
       env=Property('env'))) 
+0

एकमात्र मामला जो विफल हो सकता है वह है यदि स्रोत स्क्रिप्ट कुछ प्रक्रिया शुरू करती है जो ए) अपने खोल मरने से बचती नहीं है, और बी) पर्यावरण द्वारा संदर्भित है। –

+0

यहां वर्णित कुछ सरल विकल्पों की तुलना में यह बहुत तीव्र है, लेकिन निश्चित रूप से आपको बहुत लचीलापन देता है। इसे सामान्यीकृत करने और इसे Buildbot पर पैच के रूप में सबमिट करने पर विचार करें? – djmitche

3

आप अपने आदेश के लिए वातावरण सेट अप करने के लिए ShellCommand बिल्ड चरण में env पैरामीटर का उपयोग कर सकते हैं। (http://docs.buildbot.net/0.8.1/Using-ShellCommands.html)

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

मूल रूप से या तो:

  1. काम बाहर के माहौल की जरूरत थी और env में में पारित चर।
  2. बिल्ड दास शुरू करने से पहले कॉन्फ़िगरेशन स्रोत करें।
  3. स्रोत कमांड को लपेटें और आपके बिल्ड कमांड एक शेल स्क्रिप्ट है, और एक एकल निर्माण चरण के रूप में चलाया जाता है।
+0

_env_ पैरामीटर एक विशिष्ट कमांड निष्पादित करते समय पर्यावरण के मानकों के ज्ञात सेट को जोड़ता है।मैं शेल स्क्रिप्ट के माध्यम से बहुत अच्छी तरह से जा सकता हूं जिसे पर्यावरण के लिए सोर्स और कसरत की आवश्यकता होती है। प्रश्न में खोल स्क्रिप मेरा नहीं है बल्कि खुले एम्बेडेड टूल्स का हिस्सा है। इसलिए मेरे नियंत्रण के बाहर स्रोत नियंत्रण में बदलने की संभावना है। इसलिए, सवाल पूछा गया कि पर्यावरण को "स्रोत" कैसे करें और इसे आगे बढ़ाने के लिए इसे लागू करें। –

+0

मैं शायद एक शेल स्क्रिप्ट में सबकुछ लपेटकर, एक ही निर्माण चरण में पूरी तरह से चलने के साथ जाऊंगा। –

7

OpenEmbedded/yocto के साथ काम करते हैं, हम इस के समान एक तरह से समस्या हल हम के साथ सोर्स किए गए पर्यावरण के भीतर foo चलाते हैं। दूसरे शब्दों में, आप

factory.addStep(EnvStep(command='foo')) 

पर कॉल करके चरण का उपयोग करेंगे और सोर्सिंग स्वचालित रूप से होगी।

हमारे पास अन्य कस्टम बिल्डस्टेप्स भी हैं जिनके लिए बिल्ड-एनवी को सोर्स किया जाना आवश्यक है, इसलिए हम उन्हें पर्यावरण के लिए स्वचालित रूप से निपटाए जाने के लिए ShellCommand के बजाय EnvStep को उपclass करने दें।

1

विजुअल स्टूडियो विकास के लिए एक उदाहरण भी उपयोगी है।

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

# A raw text string to get around windows quoting problems in buildbot. 
vscomntools=r""""%VS120COMNTOOLS%\VsDevCmd.bat" %PROCESSOR_ARCHITECTURE% & set""" 

# Determine MSVC Environment using VS Common Tools for build steps. 
f.addStep(SetProperty(
    command=vscomntools, 
    extract_fn=glob2list)) 

विकल्प बैच फ़ाइल, &, और आदेश उद्धृत करने के लिए कोशिश कर रहा द्वारा प्रत्येक आदेश शुरू करने के लिए है।

0
steps.ShellCommand(
      name = "Example", 
      command = ["/bin/bash", "-c", "source <BASH SCRIPT>"], 
      haltOnFailure = True, 
      description = "Example" 
    ), 
+0

कोड पोस्ट न करें; एक स्पष्टीकरण जोड़ें। – reformed

0

मैंने इस समस्या को थोड़ा अलग हल किया। मैं विंडोज कार्यकर्ता पर एक बैच फ़ाइल स्थापित करता हूं, जो लॉन्च करने पर, पर्यावरण सेटिंग बैच फ़ाइल को कॉल करता है, फिर इच्छित आदेश निष्पादित करता है। यह निश्चित रूप से इस तथ्य से कड़ी मेहनत कर रहा है कि बैच फ़ाइलें तर्कों को अग्रेषित करने में भयानक हैं, और इस तथ्य से कि विजुअल स्टूडियो 2017 के VsDevCmd.bat आपके cwd को क्लॉबर्स करते हैं। यह हो जाने पर,

@ECHO OFF 
@REM Calls a single command from the environment set from visual studio vcvars. 
@REM Usage: 
@REM withvcvars-2017.bat <arch> [command] 
@REM 
@REM Run VsDevCmd.bat /help to see available arches 
@REM See below instantiation for more fine grained option setting. 

set ARCH=%1 
shift 

setlocal enabledelayedexpansion 

@rem Replace __ with = in batch files. 
@rem This works around idiotic lack of equals signs in args 
@rem args contains full args string with substitutions in place 
:argloop 
if "%~1" NEQ "" (

    set str=%~1 
    set out=!str:__==! 
    set %~1=!out! 
    set args=!args!!out! 

    SHIFT 
    goto :argloop 
) 

@rem Aside from batch files being too moronic to allow for equals signs in args, 
@rem VsDevCmd.bat idiotically clobbers the current working directory when it's called. 
set CWD=%cd% 

echo Calling VsDevCmd.bat for arch %ARCH% 
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" -arch=%ARCH% -winsdk=8.1 -app_platform=Desktop -no_logo 

@rem Who lets these things out the door? 
cd %CWD% 

@ECHO ON 
%args% 

आप अपने bulidbot मास्टर तर्क में एक समारोह जो इस बैच फ़ाइल संलग्न कर देता है बना सकते हैं: हालांकि, अगर आप कार्यकर्ता पर निम्न फ़ाइल स्थापित करते हैं, आप VS2017 के साथ निर्माण कर सकते हैं

def _withvcvars(year, arch, cmd):  
    base_cmd = ["%swithvcvars-%s.bat" % ('\\path\\to\\batchfile\\', year), arch]  
    return base+cmd 

यह आपको उन आदेशों को चलाने देता है जहां आप msbuild.exe को कॉल करते हैं जो इसके तर्कों में समान संकेतों की अपेक्षा करता है। बस उन्हें डबल अंडरस्कोर के रूप में निर्दिष्ट करें:

withvcvars-2017.bat amd64 msbuild.exe your.sln /p:Configuration__Release /p:Platform__x64 
संबंधित मुद्दे