Azure Container Apps에 GitHub 연동 CI/CD 파이프라인 구축하기
GitHub 저장소에 코드를 커밋하면 GitHub Actions 워크플로우가 트리거되어 코드를 빌드하고 Azure Container Apps에 배포하는 것은 일반적인 개발 요구 사항입니다. 이 예제에서는 GitHub와 Azure Bicep을 사용하여 필요한 설계 및 구현을 단계별로 완료하는 방법을 안내합니다.
- 예제 다운로드: SleepZone.zip
단계별 절차
-
Azure Portal에 로그인합니다. 홈 화면 왼쪽 상단의 메뉴에서 "리소스 그룹"을 클릭한 후 리소스 그룹 페이지로 이동합니다.
-
리소스 그룹 페이지에서 "만들기" 버튼을 클릭하고 페이지의 안내에 따라 "sleep-zone-group"이라는 이름의 리소스 그룹을 생성합니다.
-
리소스 그룹 페이지의 "속성" 탭에서 "리소스 ID"를 가져옵니다.
-
Azure Portal 홈으로 돌아갑니다. 오른쪽 상단의 메뉴에서 "Cloud Shell" 버튼을 클릭하고 안내에 따라 Cloud Shell 창을 엽니다.
-
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로 대체)
-
GitHub 대시보드에 로그인합니다. 홈 화면 왼쪽 상단의 "New" 버튼을 클릭하고 안내에 따라 "SleepZone"이라는 이름의 리포지토리를 생성합니다.
-
리포지토리 페이지에서 오른쪽 상단의 "Setting" 버튼을 클릭한 후 설정 페이지로 이동하고 왼쪽 메뉴에서 "Secrets and variables" 아래의 "Actions" 탭을 선택합니다. "Actions" 탭에서 "New repository secret" 버튼을 클릭하고 안내에 따라 "AZURE_CREDENTIALS"라는 이름의 Actions Secret을 생성합니다. Secret 내용에는 이전에 가져온 "서비스 주체 자격 증명"을 붙여넣습니다.
-
로컬 리포지토리 폴더로 SleepZone 리포지토리를 클론합니다. 로컬 리포지토리 폴더에 "src" 폴더를 생성합니다. 명령 프롬프트를 열고 "src" 폴더로 이동한 후 다음 명령을 입력하여 MDP.WebApp 템플릿을 설치하고 "WebApplication1"이라는 이름의 웹 사이트를 생성합니다.
# 웹 사이트 생성
dotnet new install MDP.WebApp
dotnet new MDP.WebApp -n WebApplication1
- 로컬 리포지토리 폴더에서 "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"]
- 로컬 리포지토리 폴더에 ".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
}
}
-
로컬 리포지토리의 변경 사항을 원격 GitHub 호스트에 커밋하고 푸시한 후 GitHub 대시보드로 돌아가 SleepZone 리포지토리 페이지로 이동합니다. "Actions" 탭에서 GitHub Actions 워크플로우가 트리거되어 성공적으로 배포되었음을 확인할 수 있습니다 (약 5분 소요).
-
Azure Portal 홈으로 돌아갑니다. 왼쪽 상단의 메뉴에서 "컨테이너 앱"을 클릭한 후 컨테이너 앱 페이지로 이동하면 방금 생성한 "sleep-zone-app" 컨테이너 앱을 볼 수 있습니다.
-
"sleep-zone-app" 컨테이너 앱의 개요 페이지에서 "애플리케이션 URL" 링크를 클릭하면 브라우저 창이 열리고 WebApplication1 코드에서 제공하는 "Hello World" 메시지가 표시됩니다.
-
위의 단계를 완료하면 코드를 GitHub에 푸시할 때마다 GitHub Actions 워크플로우가 트리거되어 코드를 빌드하고 Azure Container Apps에 배포합니다.