Расширение настраиваемой задачи сборки Azure DevOps не может найти PowerShell VstsTaskSdk.psd1, если целевой файл записи не находится в корневом каталоге. - PullRequest
3 голосов
/ 23 октября 2019

Я создал расширение задачи Wait Azure DevOps для сборки / выпуска некоторое время назад, и недавно он начал сообщать следующее предупреждение при запуске:

[warning] Task 'Wait '(1.2.3) использует устаревший обработчик выполнения задач. Задача должна использовать поддерживаемую библиотеку задач: https://aka.ms/tasklib

Итак, перейдя по этой ссылке на Azure Pipelines Task SDK GitHub repo , а затем развернув в Consumingссылка PowerShell API SDK похоже, мне нужно обновить свое расширение от старого обработчика выполнения PowerShell до нового обработчика выполнения PowerShell3 в моем файле task.json, поэтому я внес это изменение, и код теперь выглядитнапример:

  "execution": {
    "PowerShell3": {
      "target": "$(currentDirectory)/Code/Wait.ps1",
      "workingDirectory": "$(currentDirectory)"
    }
  }

Следуя инструкциям на странице, я сделал Save-Module -Name VstsTaskSdk -Path .\, чтобы загрузить модуль SDK и зафиксировал его в каталоге ps_modules\VstsTaskSdk в корне задачи моего расширения.

Однако после сборки и запуска расширения на агенте MS Hosted он выдает ошибку:

[error] Файл не найден: 'D: \ a_tasks \ Wait_f3e9b3d7-a528-5245-91c7-453406bcb038 \ 1.2.17 \ Code \ ps_modules \ VstsTaskSdk \ VstsTaskSdk.psd1 '

Azure DevOps task output

Я заметил, что это выглядитдля каталога ps_modules в каталоге Code, поэтому я попыталсяпоместив его туда в моем репозитории git, но это все равно приводит к той же ошибке.

Я нашел этот очень похожий вопрос StackOverflow , но решение для них состояло в том, чтобы удалить каталог версии из ихИерархия ps_modules\[version]\VstsTaskSdk, которой у меня уже нет.

Я также нашел этот пост, проходящий через процесс , и, похоже, я все сделал правильно, но явсе равно получаю ошибку.

Вот как выглядит моя файловая иерархия:

|-- Wait\ <task root>
  |-- Code\
    |-- Convert-Unit.Tests.ps1
    |-- Convert-Unit.psm1
    |-- Wait.ps1
  |-- ps_modules\
    |-- VstsTaskSdk\
      |-- [All the module files, including VstsTaskSdk.psd1]
  |-- icon.png
  |-- task.json

Я думал, что проблема может заключаться в том, что я держу свои задачи "код бизнес-логики" отдельно от "код инфраструктуры задач ", поместив его в каталог Code;то есть мой файл task.json и файл целевой точки входа Wait.ps1 не находятся в одном каталоге. Исходя из этого предположения, я удалил каталог Code и сбросил все файлы в корневом каталоге, и ошибка исчезла (сейчас я получаю разные ошибки, но похоже, что эта проблема уже решена).

Есть какие-нибудь мысли о том, что я могу сделать, чтобы при переносе на новый обработчик выполнения PowerShell мой «код бизнес-логики» был отделен от «кода инфраструктуры задач»? Я не уверен, как он определяет, где он должен искать каталог ps_modules.

Код также полностью с открытым исходным кодом, поэтому не стесняйтесь посмотреть репозиторий .

Обновление

Хотя мне не удалось решить проблему с тем, как разместить файлы сценариев PowerShell task.json и целевой точки входа в отдельных каталогах, я смог внести изменения, чтобы всекод инфраструктуры расширения находится в корневом каталоге, а код «бизнес-логики» - в каталоге Code.

Как вы можете видеть в репозитории , я решил создать task.ps1 файл в корневом каталоге задач и использовать его в качестве целевой точки входа для задачи. Обновление обработчика выполнения PowerShell3 также означало необходимость обновления способа получения входных данных задачи, поэтому я использую файл task.ps1 для получения входных данных, а затем просто вызываю сценарий Code\Wait.ps1. Это позволяет мне сохранять мой код красивым и изолированным, поэтому, если Azure DevOps решит снова изменить ситуацию с помощью нового обработчика выполнения, мне не нужно трогать какой-либо код в каталоге Code, просто task.ps1файл.

1 Ответ

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

На самом деле, я думаю, что решение, которое вы пытались, поместить сценарий ввода расширения (task.ps1) на тот же уровень, что и в упакованной папке SDK, является лучшим выбором для вас до сих пор.

КакПри обычном процессе компиляции он находит папку, в которой .dll файлы автоматически сохраняются с того же уровня папки , когда вы запускаете сценарий ввода. Для Azure Devops эта папка по умолчанию, в которой хранились файлы .dll, - ps_modules. Это действие по умолчанию, которое разработано.

Это причина, по которой вы получаете сообщение о том, что сервер ищет .dll в папке с кодом. Кроме того, именно поэтому мы рекомендуем разработчику упаковать задачу с SDK , как показано ниже:

enter image description here


ОтдельноSDK и файлы сценариев полностью в двух папках не являются невозможными, просто если вы выберете этот макет, это может сделать структуру файла очень чистой, но это значительно увеличит стоимость кода (используйте $ PSScriptRoot для переопределения всего сценария загрузки SDK), так кака также стоимость обслуживания позже.

Создание и размещение сценария ввода на одном уровне папки с папкой SDK (ps_modules), а затем вызов функции из соответствующих файлов сценариев, которые все хранятся в одной папке, - лучший способ сохранить файлыструктура очищает и поддерживает поддерживаемость кода, также это не увеличит дополнительное потребление кода, что приведет к увеличению избыточности кода.

...