NAnt/NAntContrib 'VB6' не удалось запустить при удаленной сборке
Фон
Я собираю систему непрерывной интеграции на работе на двух виртуальных машинах, работающих на моем локальном рабочем столе. Виртуальная машина №1 (Toolbox) работает под управлением CruiseControl.Net, Subversion, BugTracker.Net и SQL Server Express. Виртуальная машина № 2 (BuildMaster) работает с NAnt с помощью NAntContrib, и на ней установлены VB 6.0 и 1.0/1.1/2.0/3.5 .Net Framework SDK. Цель состоит в том, чтобы жестко контролировать то, что установлено на BuildMaster, и быть намного более свободным на рабочих станциях Toolbox и разработчика.
вопрос
У меня был проект CCNet на Toolbox, который успешно скомпилировал тестовое приложение VB 6.0 на BuildMaster, но сборка начала давать сбой на прошлой неделе. Единственное, что я помню, это установил BugTracker.Net и SQL Server Express на Toolbox.
симптомы
Сборка завершается неудачно и возвращает исключение:
<![CDATA[Starting 'vb6 ( /make "\\buildmaster\Working\TestApp\TestApp.vbp" /outdir "\\buildmaster\Working\TestApp\build" /out "\\buildmaster\Working\TestApp\TestApp.build.err")' in '\\buildmaster\Working\TestApp']]></message><duration>711.02240000000006</duration></task><duration>761.09440000000006</duration></target><failure><builderror><type>NAnt.Core.BuildException</type><message><![CDATA['vb6' failed to start.]]></message><location><filename>\\buildmaster\Working\TestApp\TestApp.build</filename><linenumber>39</linenumber><columnnumber>4</columnnumber></location><stacktrace><![CDATA[ at NAnt.Core.Tasks.ExternalProgramBase.StartProcess() in c:\Nant\src\NAnt.Core\Tasks\ExternalProgramBase.cs:line 501
at NAnt.Core.Tasks.ExternalProgramBase.ExecuteTask() in c:\Nant\src\NAnt.Core\Tasks\ExternalProgramBase.cs:line 386
at NAnt.Contrib.Tasks.Vb6Task.ExecuteTask() in c:\Nant\contrib\src\Tasks\Vb6Task.cs:line 220
at NAnt.Core.Task.Execute() in c:\Nant\src\NAnt.Core\Task.cs:line 186
at NAnt.Core.Target.Execute() in c:\Nant\src\NAnt.Core\Target.cs:line 247
at NAnt.Core.Project.Execute(String targetName, Boolean forceDependencies) in c:\Nant\src\NAnt.Core\Project.cs:line 910
at NAnt.Core.Project.Execute() in c:\Nant\src\NAnt.Core\Project.cs:line 862
at NAnt.Core.Project.Run() in c:\Nant\src\NAnt.Core\Project.cs:line 947]]></stacktrace><internalerror><type>System.ComponentModel.Win32Exception</type><message><![CDATA[The system cannot find the file specified]]></message><stacktrace><![CDATA[ at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at NAnt.Core.Tasks.ExternalProgramBase.StartProcess() in c:\Nant\src\NAnt.Core\Tasks\ExternalProgramBase.cs:line 498]]></stacktrace></internalerror></builderror></failure><duration>1211.7424</duration></buildresults>
Очевидно, что основное исключение - [CDATA['vb6' не удалось запустить.]]. Моя проблема в том, что когда я запускаю сборку Nant непосредственно в BuildMaster, она каждый раз успешно завершает сборку.
Для полноты картины вот мой скрипт сборки NAnt:
<?xml version="1.0" ?>
<project name="TestApp" default="build">
<!-- set build.date property to current date in format yyyy-MM-dd -->
<tstamp property="build.date" pattern="yyyy-MM-dd" />
<!-- global project settings -->
<property name="project.name" value="TestApp" />
<property name="project.version" value="1.00" unless="${property::exists('project.version')}" />
<property name="project.release.type" value="release" unless="${property::exists('project.release.type')}" /> <!-- nightly / dev / alpha / beta# / rc# / release -->
<property name="build.warnaserror" value="false" />
<!-- default configuration -->
<property name="project.client" value="" />
<property name="build.defines" value="" />
<property name="build.number" value="${math::abs(math::floor(timespan::get-total-days(datetime::now() - datetime::parse('01/01/2000'))))}" />
<!-- platform specific properties. These are the defaults -->
<property name="current.build.defines" value="${build.defines}" />
<!-- Build Tasks -->
<target name="init" description="Initializes build properties">
<property name="build.dir" value="${project::get-base-directory()}\build" />
<echo message="Build Directory is ${build.dir}" />
</target>
<target name="clean" depends="init" description="Deletes current build configuration">
<echo message="Clearing out files before recompiling..." />
<delete verbose="true">
<fileset basedir="${build.dir}">
<include name="TestApp*.exe" />
</fileset>
</delete>
</target>
<target name="build" depends="clean" description="Perform a build of the base TestApp product">
<mkdir dir="${build.dir}" unless="${directory::exists(build.dir)}" />
<!-- Actually compile VB6 project into executable -->
<vb6 project="TestApp.vbp" outdir="${build.dir}" errorfile="TestApp.build.err" verbose="true" />
</target>
</project>
Ваша помощь очень ценится!
1 ответ
Возможно, я неверно истолковал ваш вопрос, поэтому, пожалуйста, держитесь за меня. Задача nant в CCNet работает на локальной машине (машине, на которой работает CCNet).
Если ToolBox использует CCNet, но BuildMaster запускает все инструменты (например, VB6 и т. Д.), Я совершенно уверен, что нет способа сделать то, что делается. Как правило, CCNet должен быть запущен на компьютере, который выполняет сборку. Следовательно, тот факт, что VB6 не может быть найден, объясняется тем, что VB6 не установлен в ToolBox.
Однако в CCNet есть способ мониторинга / управления несколькими серверами сборки с одного. Таким образом, в вашем случае вы можете настроить ToolBox для управления сборками BuildMaster, но CCNet должен быть установлен на обоих. Для ссылки на что-то подобное вы можете проверить разделение сборки на сайте CCNet.