Azure Pipelines를 사용한 지속적인 업데이트
Azure Pipelines을 사용하여 Azure Functions에 자동으로 배포합니다. Azure Pipelines를 사용하면 Azure DevOps를 사용하여 CI(연속 통합) 및 CD(지속적인 업데이트)로 빌드, 테스트 및 배포할 수 있습니다.
YAML 파이프라인은 리포지토리의 YAML 파일을 사용하여 정의됩니다. 단계는 파이프라인의 가장 작은 구성 요소이며 스크립트 또는 작업(미리 패키지된 스크립트)일 수 있습니다. 파이프라인을 구성하는 주요 개념 및 구성 요소에 대해 알아봅니다.
AzureFunctionApp
작업을 사용하여 Azure Functions에 배포합니다. 이제 두 가지 버전의 AzureFunctionApp 작업(AzureFunctionApp@1, AzureFunctionApp@2)이 있습니다. AzureFunctionApp@2
에는 오류로 인해 파이프라인이 실패할 가능성을 낮추는 향상된 유효성 검사 지원이 포함됩니다.
문서 맨 위에 있는 작업 버전을 선택합니다. YAML 파이프라인은 Azure DevOps 2019 및 이전 버전에서 사용할 수 없습니다.
참고 항목
AzureFunctionApp@2 권장됩니다. Flex 소비 계획에서 앱에 배포하는 것은 버전 2에서만 지원됩니다.
필수 조건
Azure DevOps 조직. GitHub 계정이 없는 경우 무료로 만들 수 있습니다. 팀에 이미 있는 경우 사용하려는 Azure DevOps 프로젝트의 관리자인지 확인합니다.
Microsoft 호스팅 에이전트에서 파이프라인을 실행하는 기능. 병렬 작업을 구매하거나 무료 계층을 요청할 수 있습니다.
Azure Repos 대신 GitHub를 사용하려는 경우 GitHub 리포지토리도 필요합니다. GitHub 계정이 없으면 무료 계정을 만들 수 있습니다.
지원되는 리포지토리에 소스 코드가 있는 Azure의 기존 함수 앱입니다. 아직 Azure Functions 코드 프로젝트가 없는 경우 다음 언어별 문서를 완료하여 만들 수 있습니다.
로컬 코드 프로젝트를 함수 앱에 게시한 후 GitHub 또는 Azure Repos 리포지토리에 업로드해야 합니다.
앱 빌드
- Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.
- 프로젝트에서 파이프라인 페이지로 이동합니다. 그런 다음, 새 파이프라인을 선택합니다.
- 코드는 어디에 있나요?에 대해 다음 옵션 중 하나를 선택합니다.
- GitHub: 로그인을 위해 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다. 이 GitHub 연결이 처음인 경우에는 마법사가 DevOps를 GitHub 계정에 연결하는 프로세스도 안내합니다.
- Azure Repos Git: 현재 DevOps 프로젝트에서 리포지토리를 즉시 선택할 수 있습니다.
- 리포지토리 목록이 표시되면 원하는 샘플 앱 리포지토리를 선택합니다.
- Azure Pipelines는 리포지토리를 분석하고 파이프라인 구성에서 잠재적인 템플릿 목록을 제공합니다. 해당 언어에 적절한 함수 앱 템플릿을 선택합니다. 올바른 템플릿이 표시되지 않으면 자세히 표시를 선택합니다.
- 저장 후 실행을 선택하고 기본 분기에 직접 커밋을 선택한 다음, 저장 후 실행을 다시 선택합니다.
- 새 실행이 시작됩니다. 실행이 끝날 때까지 기다립니다.
YAML 빌드 파이프라인 예제
다음 언어별 파이프라인을 사용하여 앱을 빌드할 수 있습니다.
다음 샘플을 사용하여 NET 앱을 빌드하는 YAML 파일을 생성할 수 있습니다:
앱을 빌드할 때 오류가 표시되면 사용하는 .NET 버전이 Azure Functions 버전과 일치하는지 확인합니다. 자세한 내용은 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'
앱 배포
Azure 함수 앱 배포 작업을 사용하여 배포합니다. 이 작업에는 입력으로 Azure 서비스 연결이 필요합니다. Azure 서비스 연결은 자격 증명을 저장하여 Azure Pipelines에서 Azure로 연결합니다.
Azure Functions에 배포하려면 azure-pipelines.yml
파일 끝에 다음 코드 조각을 추가합니다. 기본값 appType
은(는) Windows입니다. appType
를 functionAppLinux
(으)로 설정하여 Linux를 지정할 수 있습니다. Flex Consumption 앱에 배포하는 작업은 AzureFunctionApp 작업에서 @v1 지원되지 않습니다.
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>'
코드 조각은 YAML 파일의 빌드 단계에서 에이전트의 $(System.ArtifactsDirectory)
폴더에 zip 보관 파일을 생성한다고 가정합니다.
컨테이너 배포
빌드가 성공할 때마다 코드를 컨테이너화된 함수 앱으로 자동으로 배포할 수 있습니다. 컨테이너에 대해 자세히 알아보려면 컨테이너 및 Azure Functions 작업을 참조하세요.
컨테이너에 배포하는 가장 간단한 방법은 컨테이너 배포 작업에서 Azure 함수 앱을 사용하는 것입니다.
배포하려면 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)
코드 조각은 Docker 이미지를 Azure Container Registry에 푸시합니다. 컨테이너 배포 작업의 Azure 함수 앱은 지정된 리포지토리에서 BuildId
에 해당되는 적절한 Docker 이미지를 끌어온 다음 이미지를 배포합니다.
컨테이너 빌드 및 컨테이너 레지스트리에 게시를 비롯한 전체 엔드투엔드 파이프라인의 예는 이 Azure Pipelines 컨테이너 배포 예를 참조하세요.
슬롯에 배포
여러 슬롯을 갖도록 함수 앱을 구성할 수 있습니다. 슬롯을 사용하면 고객이 사용할 수 있도록 하기 전에 앱을 안전하게 배포하고 테스트할 수 있습니다.
다음 YAML 코드 조각은 스테이징 슬롯에 배포한 다음 프로덕션 슬롯으로 교환하는 방법을 보여줍니다.
- 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
Azure CLI를 사용하여 파이프라인 만들기
Azure에서 빌드 파이프라인을 생성하려면 az functionapp devops-pipeline create
명령을 사용하세요. 빌드 파이프라인은 리포지토리에서 만들어진 모든 코드 변경을 빌드하고 릴리스하기 위해 생성됩니다. 명령어는 빌드 및 릴리스 파이프라인을 정의하는 새 YAML 파일을 생성한 다음 이를 사용자의 리포지토리에 커밋합니다. 이 명령의 사전 요구 사항은 코드의 위치에 따라 달라집니다.
코드가 GitHub에 있는 경우:
구독에 대한 쓰기 사용 권한이 있어야 합니다.
Azure DevOps의 프로젝트 관리자여야 합니다.
충분한 권한이 있는 GitHub 개인용 액세스 토큰(PAT)를 생성할 수 있는 사용 권한이 있어야 합니다. 자세한 내용은 GitHub PAT 사용 권한 요구 사항을 참조하세요.
자동 생성된 YAML 파일을 커밋하려면 GitHub 리포지토리의 기본 분기에 커밋할 수 있는 권한이 있어야 합니다.
코드가 Azure Repos에 있는 경우:
구독에 대한 쓰기 사용 권한이 있어야 합니다.
Azure DevOps의 프로젝트 관리자여야 합니다.
앱 빌드
- Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.
- 프로젝트에서 파이프라인 페이지로 이동합니다. 그런 다음, 작업을 선택하여 새 파이프라인을 만듭니다.
- 먼저 소스 코드의 위치로 GitHub를 선택하여 마법사의 단계를 진행합니다.
- 로그인할 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다.
- 리포지토리 목록이 표시되면 원하는 샘플 앱 리포지토리를 선택합니다.
- Azure Pipelines에서 리포지토리를 분석하고 템플릿을 추천합니다. 저장 후 실행을 선택하고 기본 분기에 직접 커밋을 선택한 다음, 저장 후 실행을 다시 선택합니다.
- 새 실행이 시작됩니다. 실행이 끝날 때까지 기다립니다.
YAML 빌드 파이프라인 예제
다음 언어별 파이프라인을 사용하여 앱을 빌드할 수 있습니다.
다음 샘플을 사용하여 NET 앱을 빌드하는 YAML 파일을 생성할 수 있습니다:
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'
앱 배포
Azure 함수 앱 배포 v2 작업을 사용하여 배포합니다. 이 작업에는 입력으로 Azure 서비스 연결이 필요합니다. Azure 서비스 연결은 자격 증명을 저장하여 Azure Pipelines에서 Azure로 연결합니다. 워크로드 ID 페더레이션을 사용하는 연결을 만들어야 합니다.
작업의 v2 버전에는 .NET, Python 및 Node에 대한 최신 애플리케이션 스택에 대한 지원이 포함됩니다. 이 작업에는 네트워킹 사전 배포 확인이 포함됩니다. 배포 전 문제가 있으면 배포가 중지됩니다.
Azure Functions에 배포하려면 azure-pipelines.yml
파일 끝에 다음 코드 조각을 추가합니다. 기본값 appType
은(는) Windows입니다. appType
를 functionAppLinux
(으)로 설정하여 Linux를 지정할 수 있습니다. Flex Consumption 앱에 배포하려면 둘 다 appType: functionAppLinux
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>'
다음 단계
- Azure Functions 개요를 검토하세요.
- Azure DevOps 개요를 검토하세요.