Как правильно использовать сборку и развертывание функций Azure в Azure DevOps с несколькими проектами.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно использовать сборку и развертывание функций Azure в Azure DevOps с несколькими проектами.

Сообщение Anonymous »

Я работаю с Azure и приложением на основе C#. У меня есть 2 службы приложений: веб-приложение и приложение-функция. Мое веб-приложение использует dotnet 9.0, и мое приложение-функция тоже использует dotnet 9.0. Я выбрал триггер таймера с изолированным работником и использовал план, основанный на потреблении. Кроме того, мое веб-приложение имеет 4 слота развертывания: разработка, UAT, промежуточный этап, производство. Приложение «Моя функция» имеет два слота развертывания: разработка, производство.
Я разделил свое веб-приложение на два проекта: веб-приложение и общую библиотеку. Мои миграции, контекст базы данных, модели и функция, на которую можно ссылаться и которая будет выполняться в функции Azure, — все это находится в общей библиотеке. Третий проект — моя функция Azure. Все они хранятся в одном репозитории в Azure DevOps. Когда я запускаю приведенный ниже сценарий конвейера, все работает отлично и проходит. Однако похоже, что конвейер неправильно создает или развертывает функцию Azure.
Когда я загружаю консоль Kudu, я вижу, что заархивированная папка загружается в каталог ~/wwwroot. Однако имя этой заархивированной папки — это заархивированный проект веб-приложения, а не заархивированный проект функции Azure. Как я могу это исправить? Мой azure-pipelines.yml находится ниже.

Код: Выделить всё

trigger:
branches:
include:
- development-cs
- main
- uat

variables:
buildConfiguration: 'Release'
azureSubscription: 'MyAzureServiceConnection'       # Name of your Azure Service Connection
appName: 'MyWebApp'                                 # Name of your Azure Web App
resourceGroupName: 'MyResourceGroup'                # Name of your Resource Group
sqlServerName: 'myserver.database.windows.net'       # Azure SQL Server FQDN
runtimeStack: 'DOTNETCORE|9.0'
ResourceGroupLocation: 'East US'

# Database names
devSqlDatabaseName: 'mydevdatabase'
uatSqlDatabaseName: 'myuatdatabase'
mainSqlDatabaseName: 'mymaindatabase'

# Deployment Slots for Web App
devSlotName: 'development'
uatSlotName: 'uat'
stagingSlotName: 'staging'
productionSlotName: 'production'

stages:
- stage: BuildAndDeploy
displayName: 'Build and Deploy Stage'
jobs:
- job: Build
displayName: 'Build Job'
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
fetchDepth: 0
persistCredentials: true
clean: true

- script: |
echo "Build Sources Directory: $(Build.SourcesDirectory)"
displayName: 'Print Build Sources Directory'

- script: |
echo '{ "sdk": { "version": "9.0.100" } }' > global.json
displayName: 'Create global.json'

- task: UseDotNet@2
displayName: 'Install .NET 9.0.100 SDK in Build Job'
inputs:
packageType: 'sdk'
version: '9.0.100'

- script: |
echo "Installing necessary tools..."
sudo apt-get update
sudo apt-get install -y azure-cli powershell
displayName: 'Install Azure CLI and PowerShell'

- script: |
echo "Installing dotnet-ef tool..."
dotnet tool install --global dotnet-ef --version 9.0.0-preview.6.24327.4
echo '##vso[task.prependpath]$HOME/.dotnet/tools'
displayName: 'Install dotnet-ef Tool in Build Job'

- task: DotNetCoreCLI@2
displayName: 'Restore NuGet Packages'
inputs:
command: 'restore'
projects: '**/*.csproj'

- task: DotNetCoreCLI@2
displayName: 'Build Projects'
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'

# Publish Web App package
- task: DotNetCoreCLI@2
displayName: 'Publish Web App'
inputs:
command: 'publish'
projects: 'MyProject.WebApp/MyProject.WebApp.csproj'
arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/web --no-restore'

# (Optional) Generate EF Core migration SQL script
- script: |
echo "Generating EF Core migration script..."
dotnet ef migrations script --idempotent \
--project "MyProject.Shared/MyProject.Shared.csproj" \
--startup-project "MyProject.WebApp/MyProject.WebApp.csproj"  \
--output $(Build.ArtifactStagingDirectory)/migration.sql
displayName: 'Generate EF Core Migration Script'

- task: PublishBuildArtifacts@1
displayName: 'Publish Build Artifacts'
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'drop'
publishLocation: 'Container'

- job: Deploy
displayName: 'Deploy Job'
dependsOn: Build
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
fetchDepth: 0
persistCredentials: true
clean: true

- download: current
artifact: drop

- task: UseDotNet@2
displayName: 'Install .NET 9.0.100 SDK in Deploy Job'
inputs:
packageType: 'sdk'
version: '9.0.100'

- script: |
echo "Installing Azure CLI..."
sudo apt-get update
sudo apt-get install -y azure-cli
displayName: 'Install Azure CLI'

- script: |
echo "Installing dotnet-ef tool..."
dotnet tool install --global dotnet-ef --version 9.0.0-preview.6.24327.4
echo '##vso[task.prependpath]$HOME/.dotnet/tools'
displayName: 'Install dotnet-ef Tool in Deploy Job'

- script: |
echo "Verifying dotnet-ef installation..."
dotnet ef --version
displayName: 'Verify dotnet-ef Installation in Deploy Job'

- script: |
echo "Testing connectivity to SQL Server..."
sudo apt-get install -y netcat
nc -zv $(sqlServerName) 1433
displayName: 'Test SQL Server Connectivity'

# Set Web App slot and SQL database name based on branch
- script: |
branchName=$(Build.SourceBranchName)
if [ "$branchName" == "main" ]; then
echo "##vso[task.setvariable variable=slotName]$(stagingSlotName)"
echo "##vso[task.setvariable variable=sqlDatabaseName]$(mainSqlDatabaseName)"
elif [ "$branchName" == "uat" ]; then
echo "##vso[task.setvariable variable=slotName]$(uatSlotName)"
echo "##vso[task.setvariable variable=sqlDatabaseName]$(uatSqlDatabaseName)"
elif [ "$branchName" == "development-cs" ]; then
echo "##vso[task.setvariable variable=slotName]$(devSlotName)"
echo "##vso[task.setvariable variable=sqlDatabaseName]$(devSqlDatabaseName)"
else
echo "##vso[task.setvariable variable=slotName]$(devSlotName)"
echo "##vso[task.setvariable variable=sqlDatabaseName]$(devSqlDatabaseName)"
fi
echo "Branch: $branchName"
echo "Web App Slot Name: $(slotName)"
echo "SQL Server Name: $(sqlServerName)"
echo "SQL Database Name: $(sqlDatabaseName)"
displayName: 'Set Web App Slot and DB Based on Branch'

# Apply EF Core migrations (only for main and uat branches)
- script: |
echo "Applying EF Core Migrations using Service Principal..."
dotnet ef database update \
--project "MyProject.Shared/MyProject.Shared.csproj" \
--startup-project "MyProject.WebApp/MyProject.WebApp.csproj"  \
--connection "Server=tcp:$(sqlServerName),1433;Database=$(sqlDatabaseName);Authentication=Active Directory Service Principal;User ID=$(sqlClientId);Password=$(sqlClientSecret);Encrypt=True;TrustServerCertificate=False;MultipleActiveResultSets=True;Connection Timeout=30;"
displayName: 'Apply EF Core Migrations'
condition: or(eq(variables['Build.SourceBranchName'], 'main'), eq(variables['Build.SourceBranchName'], 'uat'))

- task: AzureWebApp@1
displayName: 'Deploy to Azure Web App'
inputs:
azureSubscription: '$(azureSubscription)'
appName: '$(appName)'
package: '$(Pipeline.Workspace)/drop/web/**/*.zip'
appType: 'webApp'
slotName: '$(slotName)'

- task: AzureCLI@2
displayName: 'Update Web App Settings'
inputs:
azureSubscription: '$(azureSubscription)'
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
echo "Updating Web App settings..."
az webapp config appsettings set \
--name "$(appName)" \
--resource-group "$(resourceGroupName)" \
--slot "$(slotName)" \
--settings ConnectionStrings__DefaultConnection="Server=tcp:$(sqlServerName),1433;Initial Catalog=$(sqlDatabaseName);Authentication=Active Directory Managed Identity;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" \
AzureAd__Instance="https://login.microsoftonline.com/" \
AzureAd__Domain="mydomain.com" \
AzureAd__TenantId="$(tenantId)" \
AzureAd__ClientId="$(clientId)" \
AzureAd__ClientSecret="$(clientSecret)"

Я попробовал приведенный выше сценарий. Кроме того, я попытался использовать функцию публикации в сообществе VS, и она сработала отлично. Никаких проблем вообще. Похоже, что проблемы возникают только при попытке использовать CI/CD с DevOps.
Изменить: я также заметил, что веб-приложение будет публиковаться в функции Azure. служба приложений, и моя служба приложений веб-приложений больше не будет публиковаться и отображать страницу с сообщением о том, что она готова к развертыванию.

Подробнее здесь: https://stackoverflow.com/questions/793 ... th-multipl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»