Azure cmake не может найти ниндзя

Чтобы помочь изучить сборки конвейера Azure, я пытаюсь перенести действие GitHub в Azure Windows-2022 yml. Я прошел через это, и сейчас у меня есть несколько сборок Linux, работающих в Azure. Это для Windows, и как только я начну работать, я смогу попробовать сборки macOS.

Ошибка первая:

CMake Error: CMake was unable to find a build program corresponding to "Ninja". 
CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.

Файл azure-pipeline.yml:

- job: mingw
  pool:
    vmImage: windows-2022
  # bash?
  steps:
  - checkout: self
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.8'
      addToPath: true
  - bash: |
      curl -LO https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip
      mkdir -p C:/ninja
      unzip -q ninja-win.zip -d C:/ninja
      export PATH = "/c/ninja:$PATH"
      which ninja
      ls -la /c/ninja
    displayName: 'Install Ninja'

  - bash: |
      C:/msys64/usr/bin/pacman -Sy --noconfirm --needed mingw-w64-x86_64-uasm
      export GITHUB_PATH = "/c/msys64/mingw64/bin:$GITHUB_PATH"
      export PATH = "/c/msys64/mingw64/bin:$PATH"
      C:/msys64/mingw64/bin/uasm -?
    displayName: Install UASM
  - bash: |
      cmake -S. -B build \
      -D UPDATE_DEPS=ON \
      -D CMAKE_BUILD_TYPE=Release \
      -D BUILD_WERROR=ON \
      -DCMAKE_MAKE_PROGRAM=/c/ninja/ninja \
      -G Ninja
    displayName: 'Configure CMake'
  - bash: cmake --build build
    displayName: CMake build Build
  - bash: cmake --install build --prefix /tmp
    displayName: CMake Install Build

Вывод из:

which ninja
ls -la /c/ninja

Является:

/c/ninja/ninja
total 540
drwxr-xr-x 1 VssAdministrator 197121      0 Apr 18 02:15 .
drwxr-xr-x 1 VssAdministrator 197121      0 Apr 18 02:15 ..
-rwxr-xr-x 1 VssAdministrator 197121 538112 Nov 28  2020 ninja.exe

Итак, мы знаем, что ниндзя существует.

Когда аналогичный конвейер запускается в GitHub Actions, все просто работает, но мне бы очень хотелось, чтобы это работало в Azure. Это эквивалент действий GitHub, который работает:

    mingw:
      runs-on: windows-2022
      defaults:
        run:
          shell: bash
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-python@v5
          with:
            python-version: '3.8'
        - uses: lukka/get-cmake@latest
        - name: Setup uasm
          run: |
            C:/msys64/usr/bin/pacman -Sy --noconfirm --needed mingw-w64-x86_64-uasm
            printf '%s\n' 'C:/msys64/mingw64/bin' >> $GITHUB_PATH
        - name: UASM Check
          run: uasm -?
        - run: |
            cmake -S. -B build \
            -D UPDATE_DEPS=ON \
            -D CMAKE_BUILD_TYPE=Release \
            -D BUILD_WERROR=ON \
            -G Ninja
        - run: cmake --build build
        - run: cmake --install build --prefix /tmp

Я попробовал эту строку -DCMAKE_MAKE_PROGRAM=/c/ninja/ninja \ использовать:

-DCMAKE_MAKE_PROGRAM=/c/ninja/ninja.exe \

и я попробовал добавить его перед cmake, например:

export CMAKE_MAKE_PROGRAM=/c/ninja/ninja

а также перемещение -DCMAKE_MAKE_PROGRAM в разные места в порядке выполнения команды cmake.

Пока ничего не помогло. У меня нет локального агента Windows, поэтому я не могу играть с ним локально, что делает отладку очень сложной и медленной. Потратил несколько часов, перепробовав все, что смог найти в Интернете, но ничего не получилось. Я думаю, что решение, вероятно, заключается в чем-то крошечном, о чем я не знал в cmake.

В ваших действиях GitHub не видно никаких действий по установке ниндзя.

Bright Ran-MSFT 18.04.2024 10:36

Кто-то из нашей группы написал оригинальный yaml GitHub Actions, и он хорошо работает с изображениями окон GitHub, как показано. Я предполагаю, что Ninja по умолчанию установлен на изображениях GitHub? Для сборок Linux мы используем lukka/get-cmake@latest, в который, как мне кажется, включен Ninja.

Out of Control 18.04.2024 16:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конвейере Azure каждая задача Bash имеет отдельный сеанс для запуска команд или сценариев, установленных для этой задачи. И сессия закроется, когда задача будет выполнена.

Переменные среды, установленные/обновленные командой «export», кажутся доступными только в сеансе текущей задачи, а не для сеанса последующих задач.

Чтобы переменные среды были доступны для последующих задач, вы можете использовать команду регистрации «SetVariable», чтобы установить/обновить их. См. пример ниже в качестве ссылки.

    steps:
    . . .

    - task: Bash@3
      displayName: 'Install Ninja'
      inputs:
        targetType: inline
        script: |
          installDir = "C:/ninja"
          curl -LO https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip
          mkdir -p $installDir
          unzip -q ninja-win.zip -d $installDir
          echo "##vso[task.setvariable variable=PATH]$installDir;$(PATH)"
          echo "##vso[task.setvariable variable=CMAKE_MAKE_PROGRAM]$installDir/ninja.exe"

Это кажется запутанным, и это заставляет меня задуматься, не подхожу ли я к этому совершенно неправильно? Собираюсь попробовать ваше предложение, и если оно отлично сработает. Поскольку я только учусь, я надеюсь, что есть более простой способ создания сборок на Windows. Тем более, что это один из 6 билдов в yaml, некоторые с матрицей билдов.

Out of Control 18.04.2024 16:48

@OutofControl, окей. Попробуйте это сделать.

Bright Ran-MSFT 18.04.2024 16:53

Да, это сработало, и эта работа завершена успешно! Документов очень много, и я никогда не умел читать от А до Я, но я вижу в этом выгоду :) Спасибо, что помогли. Для тех, кто это видит: Learn.microsoft.com/en-us/azure/devops/pipelines/process/…

Out of Control 18.04.2024 17:10

Другие вопросы по теме

Похожие вопросы

Невозможно загрузить библиотеку OpenCV в Java при многократном выполнении JAR (Windows)
Может ли опция папки Windows «Сжать содержимое для экономии дискового пространства» привести к неустойчивому поведению PostgreSQL?
Как извлечь файлы с двоеточием в имени с помощью Python в Windows?
Почему мой сервер Neo4j теперь работает в 10 раз медленнее с момента перехода на WSL, а затем обратно на Windows?
Rust — Соответствующие строки
Пользовательская заставка C#, захватывающая рабочий стол, возвращает сплошной цвет
C++ Запуск от имени администратора при входе пользователя в контекст пользователя
Ошибка 500.30 после изменения целевой платформы с x64 на x86 в проекте API веб-сервера в Visual Studio 2022
Получение ICoreWebView2_7 в Tauri для печати PDF-файла
Ошибка анализатора ржавчины: не удалось загрузить связанный проект: корень проекта должен указывать на Cargo.toml илиrust-project.json (корневой каталог имеет формат пути Windows)