|
| 1 | +# 워크플로우의 이름 지정 |
| 2 | +name: Deploy to Azure Container Apps |
| 3 | + |
| 4 | +# main 브랜치에 코드가 푸시될 때 자동 실행 |
| 5 | +on: |
| 6 | + push: |
| 7 | + branches: |
| 8 | + - main |
| 9 | + |
| 10 | +# GitHub Actions 실행 권한 설정 (Azure OIDC 인증 & 코드 읽기) |
| 11 | +permissions: |
| 12 | + id-token: write |
| 13 | + contents: read |
| 14 | + |
| 15 | +jobs: |
| 16 | + build-and-deploy: |
| 17 | + # GitHub Actions 실행 환경을 Ubuntu 최신 버전으로 설정 |
| 18 | + runs-on: ubuntu-latest |
| 19 | + |
| 20 | + steps: |
| 21 | + # 1️⃣ GitHub 레포지토리 코드 가져오기 |
| 22 | + - name: Checkout Repository |
| 23 | + uses: actions/checkout@v4 |
| 24 | + |
| 25 | + # 2️⃣ Azure 로그인 (GitHub Actions에서 OIDC를 통해 보안 인증) |
| 26 | + - name: Azure Login using Credentials |
| 27 | + uses: azure/login@v1 |
| 28 | + with: |
| 29 | + creds: ${{ secrets.AZURE_CREDENTIALS }} |
| 30 | + |
| 31 | + # 3️⃣ Docker 이미지 빌드 & ACR(Azure Container Registry)로 푸시 |
| 32 | + # Git SHA를 기반으로 고유한 태그 생성 |
| 33 | + # Azure에서 직접 Docker 이미지를 빌드하고 ACR에 Push |
| 34 | + - name: Build and Push Docker Image to ACR |
| 35 | + run: | |
| 36 | + az acr login --name ${{ secrets.REGISTRY_NAME }} |
| 37 | +
|
| 38 | + IMAGE_TAG="${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:${{ github.sha }}" |
| 39 | + LATEST_TAG="${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:latest" |
| 40 | +
|
| 41 | + az acr build --registry ${{ secrets.REGISTRY_NAME }} \ |
| 42 | + --image $IMAGE_TAG \ |
| 43 | + --image $LATEST_TAG \ |
| 44 | + . |
| 45 | +
|
| 46 | + # 4️⃣ Azure Container Apps 환경이 존재하는지 확인 & 없으면 생성 |
| 47 | + - name: Ensure Container Apps Environment Exists |
| 48 | + run: | |
| 49 | + ENV_EXISTS=$(az containerapp env show --name ${{ secrets.CONTAINER_APP_ENV }} --resource-group ${{ secrets.RESOURCE_GROUP }} --query "name" --output tsv || echo "notfound") |
| 50 | +
|
| 51 | + if [ "$ENV_EXISTS" = "notfound" ]; then |
| 52 | + echo "Container Apps Environment not found. Creating..." |
| 53 | + az containerapp env create \ |
| 54 | + --name ${{ secrets.CONTAINER_APP_ENV }} \ |
| 55 | + --resource-group ${{ secrets.RESOURCE_GROUP }} \ |
| 56 | + --location ${{ secrets.LOCATION }} |
| 57 | + else |
| 58 | + echo "Container Apps Environment exists." |
| 59 | + fi |
| 60 | +
|
| 61 | + # 5️⃣ Azure Container Apps 배포 (앱이 없으면 생성, 있으면 업데이트) |
| 62 | + - name: Deploy to Azure Container Apps (Create or Update) |
| 63 | + run: | |
| 64 | + IMAGE_TAG=${{ secrets.REGISTRY_NAME }}.azurecr.io/${{ secrets.IMAGE_NAME }}:latest |
| 65 | +
|
| 66 | + APP_EXISTS=$(az containerapp show --name ${{ secrets.CONTAINER_APP }} --resource-group ${{ secrets.RESOURCE_GROUP }} --query "name" --output tsv || echo "notfound") |
| 67 | +
|
| 68 | + if [ "$APP_EXISTS" = "notfound" ]; then |
| 69 | + echo "Container App not found. Creating..." |
| 70 | + az containerapp create \ |
| 71 | + --name ${{ secrets.CONTAINER_APP }} \ |
| 72 | + --resource-group ${{ secrets.RESOURCE_GROUP }} \ |
| 73 | + --environment ${{ secrets.CONTAINER_APP_ENV }} \ |
| 74 | + --image $IMAGE_TAG \ |
| 75 | + --target-port 800 \ |
| 76 | + --ingress external \ |
| 77 | + --registry-server ${{ secrets.REGISTRY_NAME }}.azurecr.io \ |
| 78 | + --registry-username $(az acr credential show --name ${{ secrets.REGISTRY_NAME }} --query "username" --output tsv) \ |
| 79 | + --registry-password $(az acr credential show --name ${{ secrets.REGISTRY_NAME }} --query "passwords[0].value" --output tsv) \ |
| 80 | + --env-vars ENV_MODE=${{ secrets.ENV_MODE }} API_KEY=${{ secrets.API_KEY }} |
| 81 | + else |
| 82 | + # 앱이 있으면 최신 Docker 이미지로 업데이트 |
| 83 | + echo "Container App found. Updating..." |
| 84 | + az containerapp update \ |
| 85 | + --name ${{ secrets.CONTAINER_APP }} \ |
| 86 | + --resource-group ${{ secrets.RESOURCE_GROUP }} \ |
| 87 | + --image $IMAGE_TAG \ |
| 88 | + --set-env-vars ENV_MODE=${{ secrets.ENV_MODE }} API_KEY=${{ secrets.API_KEY }} |
| 89 | + fi |
0 commit comments