Мое приложение MS Teams (чат-бот) подготавливается, развертывается и отлично работает локально, в testtool и в Azure.
Поэтому я решил, наконец, сделать еще один шаг вперед и настроить CI/CD, поскольку он настроен для всех моих других проектов. Однако я впервые настраиваю CI/CD для проекта Node.js.
Я следую этим инструкциям о том, как настроить конвейер с помощью Azure DevOps, но этап развертывания завершается сбоем при выполнении команды npx teamsapp deploy
со следующей командой:
Starting: Deploy to Azure
==============================================================================
Task : Command line
Description : Run a command line script using Bash on Linux and macOS and cmd.exe on Windows
Version : 2.237.1
Author : Microsoft Corporation
Help : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
==============================================================================
Generating script.
========================== Starting Command Output ===========================
/usr/bin/bash --noprofile --norc /home/vsts/work/_temp/45easss6-ddd-4c39-9b3c-xxx.sh
(✖) Error: coordinator.InvalidProjectError: This command only works for project created by Teams Toolkit.
##[error]Bash exited with code '1'.
Finishing: Deploy to Azure
Мой файл Teamsapp.yml довольно стандартен для приложения Teams Toolkit, поэтому я не уверен, почему сценарий развертывания считает, что проект не создается с помощью Teams Toolkit?
Используемый код конвейера YAML:
trigger:
- dev
pool:
vmImage: ubuntu-latest
variables:
TEAMSAPP_CLI_VERSION: 3.0.0
steps:
- task: NodeTool@0
inputs:
versionSpec: "20"
checkLatest: true
- script: |
npm install @microsoft/teamsapp-cli@$(TEAMSAPP_CLI_VERSION)
displayName: "Install CLI"
- script: |
npx teamsapp auth login azure --username $(AZURE_SERVICE_PRINCIPAL_CLIENT_ID) \
--service-principal true \
--tenant $(AZURE_TENANT_ID) \
--password $(AZURE_SERVICE_PRINCIPAL_CLIENT_SECRET) \
--interactive false
displayName: "Login to Azure by service principal"
- script: |
npx teamsapp deploy \
--ignore-env-file true \
--interactive false
displayName: "Deploy to Azure"
workingDirectory: $(System.DefaultWorkingDirectory)
- script: |
npx teamsapp package
displayName: "Package app"
workingDirectory: $(System.DefaultWorkingDirectory)
- publish: $(System.DefaultWorkingDirectory)/appPackage/build/appPackage.zip
artifact: artifact
Мои командыapp.yml:
# Triggered when 'teamsfx deploy' is executed
deploy:
# Run npm command
- uses: cli/runNpmCommand
name: install dependencies
with:
args: install
- uses: cli/runNpmCommand
name: build app
with:
args: run build --if-present
# Deploy your application to Azure App Service using the zip deploy feature.
# For additional details, refer to https://aka.ms/zip-deploy-to-app-services.
- uses: azureAppService/zipDeploy
with:
# Deploy base folder
artifactFolder: .
# Ignore file location, leave blank will ignore nothing
ignoreFile: .webappignore
# The resource id of the cloud resource to be deployed to.
# This key will be generated by arm/deploy action automatically.
# You can replace it with your existing Azure Resource id
# or add it to your environment variable file.
resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}}
Если вы запустите npx teamsapp deploy
в каталоге вашего локального репозитория, проблема будет воспроизведена?
@AlvinZhao-MSFT Я попробовал запустить npx teamsapp deploy
в каталоге моего проекта (там же, откуда я запускаю все связанные с проектом команды npm
), и вот что я получаю: npm error code E404 npm error 404 Not Found - GET https://registry.npmjs.org/teamsapp - Not found npm error 404 npm error 404 'teamsapp@*' is not in this registry. npm error 404 npm error 404 Note that you can also install from a npm error 404 tarball, folder, http url, or git url.
Я создал простой проект приложения Teams и предоставил ресурсы Azure для развертывания через конвейер. Сравните структуру файла в моем примере ниже и соответствующим образом измените свойство workingDirectory
для вашего сценария npx teamsapp deploy
.
Ошибка означает, что файл «teamsapp.yml» не найден в текущем каталоге, где выполняется команда. Можете ли вы убедиться, что путь ./teamsapp.yml
доступен относительно каталога выполнения команды npx?
Спасибо. Я проверил содержимое $(System.DefaultWorkingDirectory)
с помощью tree $(System.DefaultWorkingDirectory) /f
, и файл .yml можно найти там, где, по моему мнению, он должен быть: /home/vsts/work/1/s/ChatBot/teamsapp.yml
? Я ожидаю, что эта команда легко найдет его, поскольку это стандартная конфигурация?
Вообще говоря, рабочий процесс CI/CD через конвейеры Azure, представленный в этом документе , запускает CLI Teams Toolkit в script
задачах для аутентификации доступа к Azure и развертывания проекта приложения Teams в веб-приложении Azure.
Обратите внимание, что корневой каталог вашего репозитория будет извлечен в $(System.DefaultWorkingDirectory)
на машине агента конвейера; расширен как /home/vsts/work/1/s/
на машине ubuntu-latest
с агентом, размещенной в Microsoft.
Вы не поделились файловой структурой своего репозитория. Вот мой пример репозитория и конвейер YAML для развертывания моего приложения ChatBot Teams.
pool:
vmImage: ubuntu-latest
variables:
TEAMSAPP_CLI_VERSION: 3.0.0
TEAMSFX_ENV: $(Build.SourceBranchName)
BOT_AZURE_APP_SERVICE_RESOURCE_ID: /subscriptions/$(AZURE_SUBSCRIPTION_ID)/resourcegroups/$(AZURE_RESOURCE_GROUP_NAME)/providers/Microsoft.Web/sites/$(AZURE_WEB_APP_NAME)
steps:
- task: NodeTool@0
inputs:
versionSpec: "20"
checkLatest: true
- script: |
npm install @microsoft/teamsapp-cli@$(TEAMSAPP_CLI_VERSION)
displayName: "Install CLI"
- script: |
npx teamsapp auth login azure \
--username $(AZURE_SERVICE_PRINCIPAL_CLIENT_ID) \
--service-principal true --tenant $(AZURE_TENANT_ID) \
--password $(AZURE_SERVICE_PRINCIPAL_CLIENT_SECRET) \
--interactive false
displayName: "Login Azure by service principal"
- script: |
npx teamsapp deploy --ignore-env-file true --interactive false
displayName: "Deploy to Azure"
workingDirectory: $(System.DefaultWorkingDirectory)
- script: |
npx teamsapp package --env $(TEAMSFX_ENV)
displayName: "Package app"
workingDirectory: $(System.DefaultWorkingDirectory)
- publish: $(System.DefaultWorkingDirectory)/appPackage/build/appPackage.$(TEAMSFX_ENV).zip
artifact: artifact
Поскольку конвейеры Azure — это всего лишь инструмент автоматизации, убедитесь, что ваш CLI Teams Toolkit работает, прежде чем интегрировать эти команды в конвейер.
Спасибо, Элвин. Как и в ответ на другой комментарий, я проверил содержимое $(System.DefaultWorkingDirectory)
с помощью tree $(System.DefaultWorkingDirectory) /f
, и файл .yml можно найти там, где, по моему мнению, он должен быть: /home/vsts/work/1/s/ChatBot/teamsapp.yml
? Спасибо!
Спасибо, Элвин. Я изменил строку workingDirectory: $(System.DefaultWorkingDirectory)
на workingDirectory: $(System.DefaultWorkingDirectory)/ChatBot
и это решило проблему.
Пожалуйста, отредактируйте свое сообщение и вставьте сюда код yaml вместо ссылки на Github.