다음을 통해 공유


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

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

필수 조건

앱을 만들 때 GitHub Actions 배포 설정

GitHub Actions 배포는 기본 앱 만들기 마법사에 통합됩니다. 연속 배포을 설정하여 배포 탭에서 사용하도록 설정하고 원하는 조직, 리포지토리 및 분기를 구성하기만 하면 됩니다.

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

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

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

참고 항목

앱을 만들 때 Azure 계정에 특정 권한이 없다는 오류가 표시되면 사용자 할당 ID를 만들고 구성하는 데 필요한 권한이 없을 수 있습니다. 대안은 배포 센터에서 GitHub Actions 배포 설정을 참조하세요.

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

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

또한 배포 센터를 사용하면 사용자 할당 ID 옵션을 통해 보다 안전한 OpenID Connect 인증을 쉽게 구성할 수 있습니다.

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

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

수동으로 GitHub Actions 워크플로 설정

배포 센터를 사용하지 않고도 워크플로를 배포할 수도 있습니다. 이 경우 다음 3단계를 수행해야 합니다.

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

1. 배포 자격 증명 생성

GitHub Actions용 Azure App Services로 인증하는 데 권장되는 방법은 OpenID Connect를 사용하는 것입니다. 단기 토큰을 사용하는 인증 방법입니다. GitHub Actions로 OpenID Connect를 설정하는 것은 더 복잡하지만 강화된 보안을 제공합니다.

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

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

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

    az ad app create --display-name myApp
    

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

    Graph API로 페더레이션 자격 증명을 생성할 때 objectId 값을 사용하고 이를 APPLICATION-OBJECT-ID로 참조합니다.

  2. 서비스 주체를 생성합니다. $appID를 JSON 출력의 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. 다음 명령을 실행하여 Active Directory 애플리케이션에 대한 새 페더레이션 ID 자격 증명을 만듭니다.

    • APPLICATION-OBJECT-ID를 Active Directory 애플리케이션의 appId(앱 만들 때 만들어짐)로 바꿉니다.
    • CREDENTIAL-NAME의 값을 나중에 참조하도록 설정합니다.
    • subject를 설정합니다. 해당 값은 워크플로에 따라 GitHub에 의해 정의됩니다.
      • GitHub Actions 환경의 작업: repo:< Organization/Repository >:environment:< Name >
      • 환경에 연결되지 않은 작업의 경우 워크플로를 트리거하는 데 사용되는 참조 경로를 기반으로 분기/태그에 대한 참조 경로(repo:< Organization/Repository >:ref:< ref path>)를 포함합니다. 예를 들어 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"
        ]
    }     
    

2. GitHub 비밀 구성

Azure/login 작업에 애플리케이션의 클라이언트 ID, 테넌트 ID구독 ID를 제공해야 합니다. 이러한 값은 워크플로에서 직접 제공하거나 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. 비밀 추가를 선택하여 각 비밀을 저장합니다.

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로 배포하려면 client-id, tenant-idsubscription-id 키와 함께 azure/login@v1 작업을 사용하고 이전에 만든 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:
      # Checkout the repo
      - uses: actions/checkout@main
      - uses: azure/login@v1
        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를 참조하세요.

Az 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

CLI용 GitHub 작업과 이를 사용 및 구성하는 방법에 대한 자세한 내용은 Azure CLI GitHub 작업에서 확인할 수 있습니다. az webapp deploy 명령, 사용 방법 및 매개 변수 세부 정보에 대한 자세한 내용은 az webapp deploy 설명서에서 확인할 수 있습니다.

시작 파일을 배포할 어떻게 할까요? 있나요?

CLI용 GitHub 작업을 사용합니다. 예시:

- 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에 사용자 지정 컨테이너를 배포하는 워크플로를 자동화할 수 있습니다. GitHub Actions를 사용하여 배포하는 단계에 대한 자세한 내용은 컨테이너에 배포를 참조하세요.

배포 후 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 및 워크플로에 대한 참조를 확인합니다.