Azure Container Apps에 GitHub 연동 CI/CD 파이프라인 구축하기

Azure Container Apps에 GitHub 연동 CI/CD 파이프라인 구축하기

GitHub 저장소에 코드를 커밋하면 GitHub Actions 워크플로우가 트리거되어 코드를 빌드하고 Azure Container Apps에 배포하는 것은 일반적인 개발 요구 사항입니다. 이 예제에서는 GitHub와 Azure Bicep을 사용하여 필요한 설계 및 구현을 단계별로 완료하는 방법을 안내합니다.

  • 예제 다운로드: SleepZone.zip

단계별 절차

  1. Azure Portal에 로그인합니다. 홈 화면 왼쪽 상단의 메뉴에서 "리소스 그룹"을 클릭한 후 리소스 그룹 페이지로 이동합니다.

  2. 리소스 그룹 페이지에서 "만들기" 버튼을 클릭하고 페이지의 안내에 따라 "sleep-zone-group"이라는 이름의 리소스 그룹을 생성합니다.

  3. 리소스 그룹 페이지의 "속성" 탭에서 "리소스 ID"를 가져옵니다.

  4. Azure Portal 홈으로 돌아갑니다. 오른쪽 상단의 메뉴에서 "Cloud Shell" 버튼을 클릭하고 안내에 따라 Cloud Shell 창을 엽니다.

  5. Cloud Shell 창에서 Bash로 전환하고 다음 명령을 실행하여 배포에 사용할 "서비스 주체 자격 증명"을 가져옵니다. 이 명령은 "sleep-zone-app-contributor"라는 이름의 애플리케이션 등록을 생성하고 "sleep-zone-group" 리소스 그룹에 대한 "기여자(Contributor)" 역할을 부여합니다.

az ad sp create-for-rbac \
    --name "sleep-zone-app-contributor" \
    --role "Contributor" \
    --scopes "/subscriptions/YOUR_SUBSCRIPTION_ID/resourceGroups/sleep-zone-group" \
    --sdk-auth
  • 서비스 주체 이름: --name "sleep-zone-app-contributor" (사용자 정의 가능, 영어 소문자 및 '-'만 사용 가능)
  • 서비스 주체 역할: --role "Contributor"
  • 서비스 주체 범위: --scopes (이전 단계에서 가져온 리소스 ID로 대체)
  1. GitHub 대시보드에 로그인합니다. 홈 화면 왼쪽 상단의 "New" 버튼을 클릭하고 안내에 따라 "SleepZone"이라는 이름의 리포지토리를 생성합니다.

  2. 리포지토리 페이지에서 오른쪽 상단의 "Setting" 버튼을 클릭한 후 설정 페이지로 이동하고 왼쪽 메뉴에서 "Secrets and variables" 아래의 "Actions" 탭을 선택합니다. "Actions" 탭에서 "New repository secret" 버튼을 클릭하고 안내에 따라 "AZURE_CREDENTIALS"라는 이름의 Actions Secret을 생성합니다. Secret 내용에는 이전에 가져온 "서비스 주체 자격 증명"을 붙여넣습니다.

  3. 로컬 리포지토리 폴더로 SleepZone 리포지토리를 클론합니다. 로컬 리포지토리 폴더에 "src" 폴더를 생성합니다. 명령 프롬프트를 열고 "src" 폴더로 이동한 후 다음 명령을 입력하여 MDP.WebApp 템플릿을 설치하고 "WebApplication1"이라는 이름의 웹 사이트를 생성합니다.

# 웹 사이트 생성
dotnet new install MDP.WebApp
dotnet new MDP.WebApp -n WebApplication1
  1. 로컬 리포지토리 폴더에서 "src/WebApplication1" 폴더로 이동하여 Dockerfile을 추가합니다.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /repo
COPY . .
RUN dotnet publish "src/WebApplication1/WebApplication1.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
  1. 로컬 리포지토리 폴더에 ".github/workflows" 폴더를 생성하고 "azure-build-deployment.yml" 및 "azure-build-deployment.bicep" 파일을 추가합니다.
# azure-build-deployment.yml

name: azure-build-deployment

on:
  push:
    branches:
      - main

env:
  RESOURCE_GROUP_NAME: sleep-zone-group
  CONTAINER_APPS_NAME: sleep-zone-app
  DOCKER_FILE_PATH: ./src/WebApplication1/Dockerfile

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Login Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Checkout GitHub Repository
        uses: actions/checkout@v4

      - name: Deploy AzureContainerRegistry by MDP
        uses: MDPOps/azure-container-registry-deploy@v1
        with:
          resourceGroupName: ${{ env.RESOURCE_GROUP_NAME }}
          dockerFilePath: ${{ env.DOCKER_FILE_PATH }}
          dockerImageName: ${{ env.CONTAINER_APPS_NAME }}
        id: azure-container-registry-deploy

      - name: Deploy AzureResourceManager by MDP
        uses: MDPOps/azure-resource-manager-deploy@v1
        with:
          resourceGroupName: ${{ env.RESOURCE_GROUP_NAME }}
          parameters: >-
            containerAppName=${{ env.CONTAINER_APPS_NAME }}
            containerRegistryName=${{ steps.azure-container-registry-deploy.outputs.containerRegistryName }}
            containerRegistryCredentials=${{ toJson(steps.azure-container-registry-deploy.outputs.containerRegistryCredentials) }}
        id: azure-resource-manager-deploy
  • Git 브랜치 이름: main (리포지토리의 브랜치가 master 또는 main인지 확인해야 합니다.)
  • 리소스 그룹 이름: RESOURCE_GROUP_NAME: sleep-zone-group (Azure 리소스 그룹 이름)
  • 컨테이너 앱 이름: CONTAINER_APPS_NAME: sleep-zone-app (사용자 정의 가능, 영어 소문자 및 '-'만 사용 가능)
  • Dockerfile 경로: DOCKER_FILE_PATH: ./src/WebApplication1/Dockerfile (경로는 대소문자를 구분하며 리포지토리 폴더를 기준으로 합니다.)
// azure-build-deployment.bicep

// Inputs
@description('ContainerApp Name')
param containerAppName string

@description('ContainerRegistry Name')
param containerRegistryName string

@description('ContainerRegistry Credentials')
@secure()
param containerRegistryCredentials object

// LogAnalyticsWorkspace
module logAnalyticsWorkspace 'modules/logAnalyticsWorkspace.bicep' = {
  name: 'logAnalyticsWorkspace'
  params: {
    // Add necessary parameters for logAnalyticsWorkspace.bicep
  }
}

// ContainerAppsEnvironment
module containerAppsEnvironment 'modules/containerAppsEnvironment.bicep' = {
  name: 'containerAppsEnvironment'
  params: {
    logAnalyticsWorkspaceName: logAnalyticsWorkspace.outputs.name
    // Add other necessary parameters for containerAppsEnvironment.bicep
  }
}

// ContainerApp
module containerApp 'modules/containerApp.bicep' = {
  name: 'containerApp'
  params: {
    containerAppName: containerAppName
    containerAppsEnvironmentName: containerAppsEnvironment.outputs.name
    containerRegistryName: containerRegistryName
    containerRegistryCredentials: containerRegistryCredentials
    // Add other necessary parameters for containerApp.bicep
  }
}
  1. 로컬 리포지토리의 변경 사항을 원격 GitHub 호스트에 커밋하고 푸시한 후 GitHub 대시보드로 돌아가 SleepZone 리포지토리 페이지로 이동합니다. "Actions" 탭에서 GitHub Actions 워크플로우가 트리거되어 성공적으로 배포되었음을 확인할 수 있습니다 (약 5분 소요).

  2. Azure Portal 홈으로 돌아갑니다. 왼쪽 상단의 메뉴에서 "컨테이너 앱"을 클릭한 후 컨테이너 앱 페이지로 이동하면 방금 생성한 "sleep-zone-app" 컨테이너 앱을 볼 수 있습니다.

  3. "sleep-zone-app" 컨테이너 앱의 개요 페이지에서 "애플리케이션 URL" 링크를 클릭하면 브라우저 창이 열리고 WebApplication1 코드에서 제공하는 "Hello World" 메시지가 표시됩니다.

  4. 위의 단계를 완료하면 코드를 GitHub에 푸시할 때마다 GitHub Actions 워크플로우가 트리거되어 코드를 빌드하고 Azure Container Apps에 배포합니다.

태그: Azure Bicep GitHub Actions Container Apps CI/CD

8월 24일 17:29에 게시됨