다음을 통해 공유


GitHub Actions를 사용하여 Azure App Service에 배포

GitHub Actions를 사용하여 워크플로를 자동화하고 GitHub에서 Azure App Service에 배포합니다.

필수 조건

앱을 만들 때 GitHub Actions 배포 설정

GitHub Actions 배포는 기본 웹앱 만들기 프로세스에 통합됩니다. 배포 탭에서연속 배포사용하도록 설정하고 선택한 조직, 리포지토리 및 분기를 구성합니다.

App Service 배포 탭에서 GitHub Actions 배포를 사용하도록 설정하는 방법을 보여 주는 스크린샷

연속 배포를 사용하도록 설정하면 웹앱 만들기 프로세스는 기본 인증 선택에 따라 인증 방법을 자동으로 선택하고 그에 따라 앱 및 GitHub 리포지토리를 구성합니다.

기본 인증 선택 인증 방법
사용 안 함 사용자 할당 ID(OpenID Connect)(권장)
사용 인증 유형

참고

앱을 만들 때 Azure 계정에 특정 권한이 없다는 오류가 표시될 수 있습니다. 사용자 할당 ID를 만들고 구성하는 데 필요한 권한이 계정에 필요할 수 있습니다. 대안은 다음 섹션을 참조하세요.

배포 센터에서 GitHub Actions 배포 설정

기존 앱의 경우 App Service의 배포 센터를 사용하여 GitHub Actions를 빠르게 시작할 수 있습니다. 이 턴키 메서드는 애플리케이션 스택을 기반으로 GitHub Actions 워크플로 파일을 생성하고 GitHub 리포지토리에 커밋합니다.

배포 센터를 사용하면 사용자 할당 ID를 사용하여 보다 안전한 OpenID Connect 인증을 쉽게 구성할 수 있습니다. 자세한 내용은 사용자 할당 ID 옵션을 참조하세요.

Azure 계정에 필요한 권한이 있는 경우 사용자 할당 ID를 만들 수 있습니다. 그렇지 않으면 ID 드롭다운 메뉴에서 기존 사용자 할당 관리 ID를 선택할 수 있습니다. Azure 관리자와 협력하여 웹 사이트 참가자 역할을 사용하여 사용자 할당 관리 ID를 만들 수 있습니다.

자세한 내용은 Azure App Service에 지속적인 배포를 참조하세요.

GitHub Actions 워크플로 수동 설정

배포 센터를 사용하지 않고 워크플로를 배포할 수 있습니다. 다음 세 단계를 수행합니다.

  1. 배포 자격 증명을 생성합니다.
  2. GitHub 비밀을 구성합니다.
  3. GitHub 리포지토리에 워크플로 파일을 추가합니다.

배포 자격 증명 생성

OpenID Connect를 사용하여 GitHub Actions용 Azure App Service로 인증하는 것이 좋습니다. 이 인증 방법은 수명이 짧은 토큰을 사용합니다. GitHub Actions로 OpenID Connect를 설정하는 것은 더 복잡하지만 강화된 보안을 제공합니다.

사용자 할당 관리 ID, 서비스 주체 또는 게시 프로필을 사용하여 인증할 수도 있습니다.

다음 절차에서는 Azure CLI 문을 사용하여 Microsoft Entra 애플리케이션, 서비스 주체 및 페더레이션 자격 증명을 만드는 단계를 설명합니다. Azure Portal에서 Microsoft Entra 애플리케이션, 서비스 주체 및 페더레이션 자격 증명을 만드는 방법을 알아보려면 GitHub 및 Azure 연결을 참조하세요.

  1. 기존 애플리케이션이 없는 경우 리소스에 액세스할 수 있는 새 Microsoft Entra 애플리케이션 및 서비스 주체를 등록합니다. Microsoft Entra 애플리케이션을 만듭니다.

    az ad app create --display-name myApp
    

    이 명령은 appIdclient-id인 JSON 출력을 반환합니다. 이 값을 저장하여, 나중에 AZURE_CLIENT_ID GitHub 비밀로 사용합니다.

    Graph API를 사용하여 페더레이션된 자격 증명을 만들 때 objectId 값을 사용하고, 해당 값을 APPLICATION-OBJECT-ID으로 참조할 때 이 값을 사용합니다.

  2. 서비스 주체를 생성합니다. JSON 결과에서 appId를 사용하여 $appID를 바꾼다.

    이 명령은 다음 단계에서 사용할 다른 objectId JSON 출력을 생성합니다. 새 objectIdassignee-object-id입니다.

    appOwnerTenantId을 나중에 AZURE_TENANT_ID에 사용할 GitHub 시크릿으로 복사합니다.

    az ad sp create --id $appId
    
  3. 구독 및 개체별 새 역할 할당을 만듭니다. 기본적으로 역할 할당은 기본 구독에 연결됩니다. $subscriptionId를 구독 ID로 바꾸고, $resourceGroupName을 리소스 그룹 이름으로, $webappName을 웹앱 이름으로, $assigneeObjectId를 생성된 id로 바꿉니다. Azure CLI를 사용하여 Azure 구독을 관리하는 방법을 알아보세요.

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$webappName --assignee-principal-type ServicePrincipal
    
  4. 다음 명령을 실행하여 Microsoft Entra 앱 에 대한 새 페더레이션 ID 자격 증명을 만듭니 다.

    • APPLICATION-OBJECT-ID을(를) Active Directory 애플리케이션을 만들 때 생성한 appId으로 바꾸십시오.

    • CREDENTIAL-NAME의 값을 나중에 참조하도록 설정합니다.

    • subject를 설정합니다. GitHub는 워크플로에 따라 해당 값을 정의합니다.

      • GitHub Actions 환경의 작업의 경우 다음을 사용합니다. repo:< Organization/Repository >:environment:< Name >
      • 환경에 연결되지 않은 작업의 경우 워크플로 repo:< Organization/Repository >:ref:< ref path>를 트리거하는 데 사용되는 ref 경로를 기반으로 분기/태그에 대한 ref 경로를 포함합니다. 예를 들어 repo:n-username/ node_express:ref:refs/heads/my-branch 또는 repo:n-username/ node_express:ref:refs/tags/my-tag입니다.
      • 끌어오기 요청 이벤트에 의해 트리거되는 워크플로의 경우 다음 repo:< Organization/Repository >:pull_request을 사용합니다.
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:organization/repository:ref:refs/heads/main",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }     
    

GitHub 비밀 구성

작업에 애플리케이션의 클라이언트 ID, 테넌트 ID구독 IDAzure/login 제공해야 합니다. 이러한 값은 워크플로에서 직접 제공하거나 GitHub 비밀에 저장하고 워크플로에서 참조할 수 있습니다. 값을 GitHub 비밀로 저장하는 것이 더 안전한 옵션입니다.

  1. GitHub 리포지토리를 열고 설정>>로 이동합니다.

  2. AZURE_CLIENT_ID, AZURE_TENANT_IDAZURE_SUBSCRIPTION_ID에 대한 비밀을 만듭니다. GitHub 비밀에 Active Directory 애플리케이션의 다음 값을 사용합니다.

    GitHub 비밀 Active Directory 애플리케이션
    AZURE_CLIENT_ID 애플리케이션(클라이언트) ID
    AZURE_TENANT_ID 디렉터리(테넌트) ID
    AZURE_SUBSCRIPTION_ID 구독 ID
  3. 비밀 추가를 선택하여 각 비밀을 저장합니다.

GitHub 리포지토리에 워크플로 파일 추가

GitHub 리포지토리의 /.github/workflows/ 경로에 있는 YAML(.yml) 파일은 워크플로를 정의합니다. 이 정의는 워크플로를 구성하는 다양한 단계와 매개 변수를 포함합니다.

최소한 워크플로 파일에는 다음과 같은 고유한 단계가 있습니다.

  1. 만든 GitHub 비밀을 사용하여 App Service에 인증합니다.
  2. 웹앱을 빌드합니다.
  3. 웹앱을 배포합니다.

App Service 앱에 코드를 배포하려면 작업을 사용합니다 azure/webapps-deploy@v3 . 이 작업을 수행하려면 app-name에 웹앱의 이름과, 언어 스택에 따라 package에 배포할 *.zip, *.war, *.jar 또는 폴더의 경로가 필요합니다. 작업에 사용할 azure/webapps-deploy@v3 수 있는 입력의 전체 목록은 action.yml 참조하세요.

다음 예제에서는 지원되는 다양한 언어로 웹앱을 빌드하는 워크플로의 일부를 확인할 수 있습니다.

구성한 관리 ID를 사용하여 OpenID Connect로 배포하려면 azure/login@v2 작업을 client-id, tenant-id, 및 subscription-id 키와 함께 사용합니다. 이전에 만든 GitHub 비밀을 참조합니다.

name: .NET Core

on: [push]

permissions:
      id-token: write
      contents: read

env:
  AZURE_WEBAPP_NAME: my-app    # Set this to your application's name
  AZURE_WEBAPP_PACKAGE_PATH: '.'      # Set this to the path to your web app project, defaults to the repository root
  DOTNET_VERSION: '6.0.x'           # Set this to the dot net version to use

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Check out the repo
      - uses: actions/checkout@main
      - uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      
      # Setup .NET Core SDK
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }} 
      
      # Run dotnet build and publish
      - name: dotnet build and publish
        run: |
          dotnet restore
          dotnet build --configuration Release
          dotnet publish -c Release --property:PublishDir='${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp' 
          
      # Deploy to Azure Web apps
      - name: 'Run Azure webapp deploy action using publish profile credentials'
        uses: azure/webapps-deploy@v3
        with: 
          app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
          package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp'
      
      - name: logout
        run: |
          az logout

자주 묻는 질문

Maven 플러그 인을 통해 WAR 파일을 배포하려면 어떻게 해야 하나요?

Maven 플러그 인을 사용하여 Java Tomcat 프로젝트를 구성한 경우 이 플러그 인을 통해 Azure App Service에 배포할 수도 있습니다. Azure CLI GitHub 작업을 사용하는 경우 Azure 자격 증명을 사용합니다.

    - name: Azure CLI script file
      uses: azure/cli@v2
      with:
        inlineScript: |
          mvn package azure-webapp:deploy

Maven 플러그 인을 사용하고 구성하는 방법에 대한 자세한 내용은 Azure App Service용 Maven 플러그 인 wiki를 참조하세요.

Azure CLI를 통해 WAR 파일을 배포하려면 어떻게 해야 하나요?

Azure CLI를 사용하여 App Service에 배포하려는 경우 Azure CLI에 대한 GitHub 작업을 사용할 수 있습니다.

- name: Azure CLI script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path '${{ github.workspace }}/target/yourpackage.war' --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }}  --async true --type war

Azure CLI에 대한 GitHub 작업을 사용하고 구성하는 방법에 대한 자세한 내용은 Azure CLI GitHub 작업을 참조하세요.

명령 사용 az webapp deploy 방법 및 매개 변수 세부 정보를 포함하여 명령에 대한 자세한 내용은 설명서를 참조az webapp deploy하세요.

시작 파일을 어떻게 배포하나요?

Azure CLI에 대한 GitHub Action을 사용합니다. 예시:

- name: Deploy startup script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path ${{ github.workspace }}/src/main/azure/createPasswordlessDataSource.sh --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }} --type startup --track-status false

컨테이너에 배포하려면 어떻게 해야 하나요?

Azure 웹 배포 작업을 사용하면 GitHub Actions를 사용하여 App Service에 사용자 지정 컨테이너를 배포하는 워크플로를 자동화할 수 있습니다. 자세한 내용은 컨테이너에 배포를 참조하세요.

배포 후 Tomcat 구성을 어떻게 업데이트하나요?

배포 후 웹앱 설정을 업데이트하려면 App Service 설정 작업을 사용할 수 있습니다.

    - uses: azure/appservice-settings@v1
      with:
        app-name: 'my-app'
        slot-name: 'staging'  # Optional and needed only if the settings have to be configured on the specific deployment slot
        app-settings-json: '[{ "name": "CATALINA_OPTS", "value": "-Dfoo=bar" }]' 
        connection-strings-json: '${{ secrets.CONNECTION_STRINGS }}'
        general-settings-json: '{"alwaysOn": "false", "webSocketsEnabled": "true"}' #'General configuration settings as Key Value pairs'
      id: settings

이 작업을 사용하고 구성하는 방법에 대한 자세한 내용은 App Service 설정 리포지토리를 참조하세요.

Azure GitHub Actions 및 워크플로에서 다음 참조를 확인하세요.