11

Buildbot 内では、コンパイル手順を実行する前に、環境を「ソース化」できる必要があります。

bash を使用してコマンド ラインからアプリケーションをビルドする場合は、次のようにする必要があります。

. envrionment-set-up-script
build_command

build bot 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"]))

すべて失敗します。これは、コマンドが見つからないためです。これは、bash 組み込みであるため、理にかなっています。

また、工場の次のステップが呼び出されるときに環境が必ずしも使用されるとは限らないため、これは正しいアプローチではないと思います。

4

6 に答える 6

5

いくつかの実験の後、これを達成する方法を見つけました。必要がある:

  • そのシェルに使用する必要がある環境を設定する bash サブシェルを実行します。つまり、環境変数BASH_ENVを環境にソースするファイルに設定して bash を呼び出します。
  • bash でenvコマンドを実行して、環境をキャプチャします。
  • envコマンドの結果をプロパティに解析します ( SetPropertyステップを使用)
  • 以降の手順でプロパティをenvパラメータとして使用する

注:環境は、 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')))
于 2013-07-18T10:36:30.877 に答える
3

このenvパラメーターを ShellCommand ビルド ステップに使用して、コマンドの環境をセットアップできます。( http://docs.buildbot.net/0.8.1/Using-ShellCommands.html )

環境をすべてのビルド コマンドに均等に適用する場合は、ビルド スレーブを開始する前に環境を設定することもできます。

基本的に次のいずれかです。

  1. 必要な環境変数を作成し、env に渡します。
  2. ビルド スレーブを開始する前に、構成をソースします。
  3. ソース コマンドをラップし、ビルド コマンドはシェル スクリプトであり、単一のビルド ステップとして実行します。
于 2013-07-17T10:13:32.423 に答える
2

Visual Studio 開発の例も役に立ちます。

共通のツール スクリプトを使用することで、マシンごとに適切な環境が設定され、同じビルダーで複数のバージョンの VS を使用でき、ネイティブおよびクロスの複数のアーキテクチャがサポートされます。

# 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))

別の方法は、バッチ ファイル、&、およびコマンドを引用して各コマンドを開始することです。

于 2014-05-14T22:20:41.207 に答える
0

私はこの問題を少し違った方法で解決しました。Windows ワーカーにバッチ ファイルをインストールすると、起動時に環境設定バッチ ファイルが呼び出され、目的のコマンドが実行されます。もちろん、これは、バッチ ファイルが引数を転送するのがひどいという事実と、Visual Studio 2017 の VsDevCmd.bat が cwd を破壊するという事実によって、さらに難しくなっています。ただし、ワーカーに次のファイルをインストールすると、VS2017 でビルドできます。

@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 マスター ロジックに作成できます。

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

これにより、引数に等号が必要な msbuild.exe を呼び出すコマンドを実行できます。2 つのアンダースコアとして指定するだけです。

withvcvars-2017.bat amd64 msbuild.exe your.sln /p:Configuration__Release /p:Platform__x64
于 2017-12-22T02:39:22.027 に答える