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 및 이전 버전에서 사용할 수 없습니다.

필수 조건

앱 빌드

  1. Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.
  2. 프로젝트에서 파이프라인 페이지로 이동합니다. 그런 다음, 새 파이프라인을 선택합니다.
  3. 코드는 어디에 있나요?에 대해 다음 옵션 중 하나를 선택합니다.
    • GitHub: 로그인을 위해 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다. GitHub에 처음 연결하는 경우 마법사는 DevOps를 GitHub 계정에 연결하는 과정도 안내합니다.
    • Azure Repos Git: 현재 DevOps 프로젝트에서 리포지토리를 즉시 선택할 수 있습니다.
  4. 리포지토리 목록이 표시되면 원하는 샘플 앱 리포지토리를 선택합니다.
  5. Azure Pipelines는 리포지토리를 분석하고 파이프라인 구성에서 잠재적인 템플릿 목록을 제공합니다. 해당 언어에 적절한 함수 앱 템플릿을 선택합니다. 올바른 템플릿이 표시되지 않으면 자세히 표시를 선택합니다.
  6. 저장 후 실행을 선택하고 기본 분기에 직접 커밋을 선택한 다음, 저장 후 실행을 다시 선택합니다.
  7. 새 실행이 시작됩니다. 실행이 끝날 때까지 기다립니다.

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입니다. appTypefunctionAppLinux(으)로 설정하여 Linux를 지정할 수 있습니다.

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에 자동으로 배포할 수 있습니다. 컨테이너에 대한 자세한 내용은 사용자 지정 컨테이너를 사용하여 Linux에서 함수 만들기를 참조하세요.

컨테이너용 Azure 함수 앱 작업으로 배포

컨테이너에 배포하는 가장 간단한 방법은 컨테이너 배포 작업에서 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 이미지를 끌어온 다음 이미지를 배포합니다.

슬롯에 배포

여러 슬롯을 갖도록 함수 앱을 구성할 수 있습니다. 슬롯을 사용하면 고객이 사용할 수 있도록 하기 전에 앱을 안전하게 배포하고 테스트할 수 있습니다.

다음 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의 프로젝트 관리자여야 합니다.

앱 빌드

  1. Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.
  2. 프로젝트에서 파이프라인 페이지로 이동합니다. 그런 다음, 작업을 선택하여 새 파이프라인을 만듭니다.
  3. 먼저 소스 코드의 위치로 GitHub를 선택하여 마법사의 단계를 진행합니다.
  4. 로그인할 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다.
  5. 리포지토리 목록이 표시되면 원하는 샘플 앱 리포지토리를 선택합니다.
  6. Azure Pipelines에서 리포지토리를 분석하고 템플릿을 추천합니다. 저장 후 실행을 선택하고 기본 분기에 직접 커밋을 선택한 다음, 저장 후 실행을 다시 선택합니다.
  7. 새 실행이 시작됩니다. 실행이 끝날 때까지 기다립니다.

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로 연결합니다.

작업의 v2 버전에는 .NET, Python 및 Node에 대한 최신 애플리케이션 스택에 대한 지원이 포함됩니다. 이 작업에는 네트워킹 사전 배포 확인이 포함됩니다. 배포 전 문제가 있으면 배포가 중지됩니다.

Azure Functions에 배포하려면 azure-pipelines.yml 파일 끝에 다음 코드 조각을 추가합니다. 기본값 appType은(는) Windows입니다. appTypefunctionAppLinux(으)로 설정하여 Linux를 지정할 수 있습니다.

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@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    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 Name>'
    #slotName: '<Slot name>'

코드 조각은 YAML 파일의 빌드 단계에서 에이전트의 $(System.ArtifactsDirectory) 폴더에 zip 보관 파일을 생성한다고 가정합니다.

컨테이너 배포

빌드가 성공할 때마다 코드를 사용자 지정 컨테이너로 Azure Functions에 자동으로 배포할 수 있습니다. 컨테이너에 대해 자세히 알아보려면 컨테이너 및 Azure Functions 작업을 참조하세요.

컨테이너용 Azure 함수 앱 작업으로 배포

컨테이너에 배포하는 가장 간단한 방법은 컨테이너 배포 작업에서 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 이미지를 끌어온 다음 이미지를 배포합니다.

슬롯에 배포

여러 슬롯을 갖도록 함수 앱을 구성할 수 있습니다. 슬롯을 사용하면 고객이 사용할 수 있도록 하기 전에 앱을 안전하게 배포하고 테스트할 수 있습니다.

다음 YAML 코드 조각은 스테이징 슬롯에 배포한 다음 프로덕션 슬롯으로 교환하는 방법을 보여줍니다.

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    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의 프로젝트 관리자여야 합니다.

다음 단계