Konfigurowanie dostarczania za pomocą usługi Azure Pipelines
Użyj usługi Azure Pipelines do automatycznego wdrażania w usłudze Azure Functions. Usługa Azure Pipelines umożliwia tworzenie, testowanie i wdrażanie za pomocą ciągłej integracji i ciągłego dostarczania (CD) przy użyciu usługi Azure DevOps.
Potoki YAML są definiowane przy użyciu pliku YAML w repozytorium. Krok jest najmniejszym blokiem konstrukcyjnym potoku i może być skryptem lub zadaniem (wstępnie spakowanym skryptem). Dowiedz się więcej o kluczowych pojęciach i składnikach tworzących potok.
Użyjesz AzureFunctionApp
zadania do wdrożenia w usłudze Azure Functions. Istnieją teraz dwie wersje zadania AzureFunctionApp (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2
Obejmuje rozszerzoną obsługę walidacji, która sprawia, że potoki są mniej narażone na niepowodzenie z powodu błędów.
Wybierz wersję zadania w górnej części artykułu. Potoki YAML nie są dostępne dla usługi Azure DevOps 2019 i starszych.
Wymagania wstępne
Organizacja: Azure DevOps. Jeśli nie masz konta, możesz je utworzyć teraz za darmo. Jeśli twój zespół już go ma, upewnij się, że jesteś administratorem projektu usługi Azure DevOps, którego chcesz użyć.
Możliwość uruchamiania potoków na agentach hostowanych przez firmę Microsoft. Możesz kupić zadanie równoległe lub zażądać warstwy Bezpłatna.
Jeśli planujesz używać usługi GitHub zamiast usługi Azure Repos, potrzebujesz również repozytorium GitHub. Jeśli nie masz konta usługi GitHub, możesz go utworzyć bezpłatnie.
Istniejąca aplikacja funkcji na platformie Azure, która ma kod źródłowy w obsługiwanym repozytorium. Jeśli nie masz jeszcze projektu kodu usługi Azure Functions, możesz go utworzyć, wykonując czynności opisane w następującym artykule specyficznym dla języka:
Pamiętaj, aby przekazać projekt kodu lokalnego do repozytorium GitHub lub Azure Repos po opublikowaniu go w aplikacji funkcji.
Kompilowanie aplikacji
- Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.
- W projekcie przejdź do strony Potoki . Następnie wybierz pozycję Nowy potok.
- Wybierz jedną z tych opcji dla pozycji Gdzie jest twój kod?:
- GitHub: Możesz zostać przekierowany do usługi GitHub, aby się zalogować. Jeśli tak, wprowadź poświadczenia usługi GitHub. Gdy to połączenie jest pierwszym połączeniem usługi GitHub, kreator przeprowadzi Cię również przez proces łączenia metodyki DevOps z kontami usługi GitHub.
- Azure Repos Git: możesz natychmiast wybrać repozytorium w bieżącym projekcie DevOps.
- Po wyświetleniu listy repozytoriów wybierz przykładowe repozytorium aplikacji.
- Usługa Azure Pipelines analizuje repozytorium i w temacie Konfigurowanie potoku zawiera listę potencjalnych szablonów. Wybierz odpowiedni szablon aplikacji funkcji dla danego języka. Jeśli nie widzisz poprawnego szablonu, wybierz pozycję Pokaż więcej.
- Wybierz pozycję Zapisz i uruchom, a następnie wybierz pozycję Zatwierdź bezpośrednio w gałęzi głównej, a następnie wybierz pozycję Zapisz i uruchom ponownie.
- Uruchomiono nowy przebieg. Poczekaj na zakończenie przebiegu.
Przykładowe potoki kompilacji YAML
Następujące potoki specyficzne dla języka mogą służyć do tworzenia aplikacji.
Poniższy przykład umożliwia utworzenie pliku YAML w celu utworzenia aplikacji platformy .NET.
Jeśli podczas kompilowania aplikacji występują błędy, sprawdź, czy używana wersja platformy .NET jest zgodna z wersją usługi Azure Functions. Aby uzyskać więcej informacji, zobacz Omówienie wersji środowiska uruchomieniowego usługi Azure Functions.
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
Wdrażanie aplikacji
Wdrożysz za pomocą zadania Wdrażanie aplikacji funkcji platformy Azure. To zadanie wymaga połączenia z usługą platformy Azure jako danych wejściowych. Połączenie z usługą platformy Azure przechowuje poświadczenia do nawiązania połączenia z usługi Azure Pipelines z platformą Azure.
Aby wdrożyć w usłudze Azure Functions, dodaj następujący fragment kodu na końcu azure-pipelines.yml
pliku. Wartość domyślna appType
to Windows. Możesz określić system Linux, ustawiając wartość na appType
functionAppLinux
. Wdrażanie w aplikacji Flex Consumption nie jest obsługiwane w @v1 zadaniu AzureFunctionApp.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: AzureFunctionApp@1 # Add this at the end of your file
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux # default is functionApp
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<Resource Group Name>'
#slotName: '<Slot name>'
W fragmencie kodu założono, że kroki kompilacji w pliku YAML tworzą archiwum zip w $(System.ArtifactsDirectory)
folderze na agencie.
Wdrażanie kontenera
Kod można wdrożyć automatycznie jako aplikację funkcji konteneryzowanej po każdej pomyślnej kompilacji. Aby dowiedzieć się więcej na temat kontenerów, zobacz Praca z kontenerami i usługą Azure Functions.
Najprostszym sposobem wdrożenia w kontenerze jest użycie zadania Azure Function App on Container Deploy.
Aby wdrożyć, dodaj następujący fragment kodu na końcu pliku YAML:
trigger:
- main
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: <Docker registry service connection>
imageRepository: <Name of your image repository>
containerRegistry: <Name of the Azure container registry>
dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
tag: '$(Build.BuildId)'
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: AzureFunctionAppContainer@1 # Add this at the end of your file
inputs:
azureSubscription: '<Azure service connection>'
appName: '<Name of the function app>'
imageName: $(containerRegistry)/$(imageRepository):$(tag)
Fragment kodu wypycha obraz platformy Docker do usługi Azure Container Registry. Zadanie Azure Function App on Container Deploy pobiera odpowiedni obraz platformy Docker odpowiadający BuildId
określonemu repozytorium, a następnie wdraża obraz.
Aby zapoznać się z kompletnym przykładem kompleksowego potoku, w tym utworzenia kontenera i publikowania w rejestrze kontenerów, zobacz ten przykład wdrożenia kontenera usługi Azure Pipelines.
Wdrażanie w miejscu
Aplikację funkcji można skonfigurować tak, aby miała wiele miejsc. Miejsca umożliwiają bezpieczne wdrażanie aplikacji i testowanie jej przed udostępnieniem jej klientom.
Poniższy fragment kodu YAML przedstawia sposób wdrażania w miejscu przejściowym, a następnie zamiany na miejsce produkcyjne:
- task: AzureFunctionApp@1
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux
appName: <Name of the Function app>
package: $(System.ArtifactsDirectory)/**/*.zip
deployToSlotOrASE: true
resourceGroupName: <Name of the resource group>
slotName: staging
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <Azure service connection>
WebAppName: <name of the Function app>
ResourceGroupName: <name of resource group>
SourceSlot: staging
SwapWithProduction: true
Tworzenie potoku za pomocą interfejsu wiersza polecenia platformy Azure
Aby utworzyć potok kompilacji na platformie Azure, użyj az functionapp devops-pipeline create
polecenia . Potok kompilacji jest tworzony w celu skompilowania i wydania wszelkich zmian kodu wprowadzonych w repozytorium. Polecenie generuje nowy plik YAML, który definiuje potok kompilacji i wydania, a następnie zatwierdza go w repozytorium. Wymagania wstępne dotyczące tego polecenia zależą od lokalizacji kodu.
Jeśli twój kod znajduje się w usłudze GitHub:
Musisz mieć uprawnienia do zapisu dla subskrypcji.
Musisz być administratorem projektu w usłudze Azure DevOps.
Musisz mieć uprawnienia do tworzenia osobistego tokenu dostępu w usłudze GitHub, który ma wystarczające uprawnienia. Aby uzyskać więcej informacji, zobacz Wymagania dotyczące uprawnień pat w usłudze GitHub.
Musisz mieć uprawnienia do zatwierdzania gałęzi głównej w repozytorium GitHub, aby można było zatwierdzić automatycznie wygenerowany plik YAML.
Jeśli kod znajduje się w usłudze Azure Repos:
Musisz mieć uprawnienia do zapisu dla subskrypcji.
Musisz być administratorem projektu w usłudze Azure DevOps.
Kompilowanie aplikacji
- Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.
- W projekcie przejdź do strony Potoki . Następnie wybierz akcję, aby utworzyć nowy potok.
- Zapoznaj się z krokami kreatora, wybierając najpierw usługę GitHub jako lokalizację kodu źródłowego.
- Być może nastąpi przekierowanie do usługi GitHub w celu zalogowania się. Jeśli tak, wprowadź poświadczenia usługi GitHub.
- Po wyświetleniu listy repozytoriów wybierz przykładowe repozytorium aplikacji.
- Usługa Azure Pipelines przeanalizuje repozytorium i zaleci szablon. Wybierz pozycję Zapisz i uruchom, a następnie wybierz pozycję Zatwierdź bezpośrednio w gałęzi głównej, a następnie wybierz pozycję Zapisz i uruchom ponownie.
- Uruchomiono nowy przebieg. Poczekaj na zakończenie przebiegu.
Przykładowe potoki kompilacji YAML
Następujące potoki specyficzne dla języka mogą służyć do tworzenia aplikacji.
Możesz użyć następującego przykładu, aby utworzyć plik YAML w celu utworzenia aplikacji platformy .NET:
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
Wdrażanie aplikacji
Wdrożysz za pomocą zadania Azure Function App Deploy w wersji 2 . To zadanie wymaga połączenia z usługą platformy Azure jako danych wejściowych. Połączenie z usługą platformy Azure przechowuje poświadczenia do nawiązania połączenia z usługi Azure Pipelines z platformą Azure. Należy utworzyć połączenie korzystające z federacji tożsamości obciążenia.
Wersja 2 zadania obejmuje obsługę nowszych stosów aplikacji dla platform .NET, Python i Node. Zadanie obejmuje kontrole wstępnego wdrażania sieci. Jeśli występują problemy z wdrożeniem wstępnym, wdrożenie zostaje zatrzymane.
Aby wdrożyć w usłudze Azure Functions, dodaj następujący fragment kodu na końcu azure-pipelines.yml
pliku. Wartość domyślna appType
to Windows. Możesz określić system Linux, ustawiając wartość na appType
functionAppLinux
. Wdrożenie w aplikacji Flex Consumption wymaga ustawienia zarówno , jak appType: functionAppLinux
i isFlexConsumption: true
.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <SUBSCRIPTION_NAME>
appName: <APP_NAME>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<RESOURCE_GROUP>'
#slotName: '<SLOT_NAME>'