CCNET имеет неправильный путь к программным файлам во время выполнения - PullRequest
0 голосов
/ 28 октября 2019

Я использую 1.8.5 CruiseControl.Net и настраиваю наши сценарии сборки для использования в системах x86 и x64. В этом сценарии я определяю значение пути для файла msbuild.exe следующим образом:

<cb:define MSBUILD_PATH="$(PROGRAMFILESFOLDER)\MSBuild\$(VS_MSBUILD_VERSION)\Bin"/>

Когда я использую приложение CCValidator.exe для оценки моей конфигурации, значения пути являются правильными:

<tasks>
      <msbuild>
        <buildArgs>/p:Configuration=Release /v:quiet</buildArgs>
        <description>Clean Developer Updater</description>
        <dynamicValues />
        <environment />
        <executable>C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe</executable>
        <logger>"C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll"</logger>
        <loggerParameters />
        <priority>Normal</priority>
        <projectFile>c:\Build\AmazingCharts\working\building\DeveloperUpdater\DeveloperUpdater.sln</projectFile>
        <targets>Clean</targets>
        <timeout>200</timeout>
        <workingDirectory>c:\Build\AmazingCharts\working\building\DeveloperUpdater</workingDirectory>
      </msbuild>
</tasks>

Когда я запускаю свой проект и эта задача выполняется, он использует 64-битный каталог Program Files, и задача и проект не выполняются, потому что файл не найден.

System.IO.IOException: Unable to execute file [C:\Program Files\MSBuild\14.0\Bin\msbuild.exe].  
The file may not exist or may not be executable. (The system cannot find the file specified) ---> 
System.ComponentModel.Win32Exception: The system cannot find the file specified`

Ниже приведен код для определения значения для PROGRAMFILES, и я подозреваю, что проблема в этом разделе.

<cb:define BUILD_PLATFORM="${ProgramFiles(x86)}"/>
<cb:if expr="'$(BUILD_PLATFORM)'!=''">
    <cb:define CURRENT_ENVIRONMENT="x86"/>
    <cb:define PROGRAMFILESFOLDER="$(ProgramFiles)"/>
    <cb:define NETFRAMEWORK="$(WINDOWS_DIR)\Microsoft.NET\Framework\$(FRAMEWORK_VERSION)"/>
</cb:if>
<cb:else>
    <cb:define CURRENT_ENVIRONMENT="x64"/>
    <cb:define PROGRAMFILESFOLDER="${ProgramFiles(x86)}"/>
    <cb:define PROGRAMFILESX64FOLDER="$(ProgramFiles)"/>
    <cb:define NETFRAMEWORK="$(WINDOWS_DIR)\Microsoft.NET\Framework64\$(FRAMEWORK_VERSION)"/>
</cb:else>

Я проверил значение среды для ProgramFiles (x86), и оно возвращает правильное значение. Кто-нибудь может увидеть, что мне не хватает? Спасибо.

РЕДАКТИРОВАТЬ: Я заметил несколько вещей:

<cb:define BUILD_PLATFORM=" ...> синтаксис неправильный. Это должно быть <cb:define BUILD_PLATFORM="$(ProgramFiles(x86))". Когда я делаю это изменение, проверка не проходит, и я не могу запустить службу ccnet. Ошибка: Preprocessing failed loading the XML: Reference to unknown symbol 'programfiles (x86'. Я попытался изменить синтаксис, чтобы использовать значения XML и HTML, а также открывать и закрывать скобки.

1 Ответ

0 голосов
/ 28 октября 2019

Я наконец-то решил это.

  • CCNET не может обрабатывать переменные среды, имя которых содержит закрывающую скобку. Если я создаю переменную с именем PROGRAMFILES_X86 и устанавливаю ее значение, то это работает. Это было мое решение, поэтому каждая сборочная машина будет требовать эту переменную среды.
  • У меня также была логическая ошибка. Условие должно быть ==, а не != при тестировании, если это система x86 или x64.
...