Skip to content

Merge pull request #33 from 9git9git/hotfix/deploy-test #15

Merge pull request #33 from 9git9git/hotfix/deploy-test

Merge pull request #33 from 9git9git/hotfix/deploy-test #15

name: Build, Push Backend Image to ACR and Trigger Deployment
# 워크플로우 트리거 설정
on:
push:
branches: [ dev, main ] # dev와 main 브랜치에 push될 때 실행
workflow_dispatch: {} # GitHub Actions 탭에서 수동으로 실행 가능
jobs:
build-and-push:
runs-on: ubuntu-latest # 실행 환경 지정
outputs:
image_tag: ${{ steps.set_image_tag.outputs.image_tag }}
steps:
# 1. 소스 코드 체크아웃
- name: Checkout repository
uses: actions/checkout@v4
# 2. Azure 로그인 (Service Principal 사용)
- name: Log in to Azure
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
# 3. ACR 로그인 (Azure 자격 증명 사용)
- name: Log in to ACR
uses: azure/docker-login@v1
with:
login-server: ${{ secrets.ACR_LOGIN_SERVER }}
username: ${{ secrets.ACR_USERNAME }}
password: ${{ secrets.ACR_PASSWORD }}
# 4. Docker 이미지 메타데이터 추출 (태그 생성 등)
- name: Extract metadata (tags, labels) for Docker
id: meta # 이 step의 출력을 참조하기 위한 ID
uses: docker/metadata-action@v5
with:
images: ${{ secrets.ACR_LOGIN_SERVER }}/${{ github.ref == 'refs/heads/dev' && secrets.ACR_REPOSITORY_NAME_TEST || secrets.ACR_REPOSITORY_NAME }}
# 예시 태그: main 브랜치면 latest, 그 외에는 브랜치명, 그리고 항상 Git SHA 태그 추가
tags: |
type=ref,event=branch
type=ref,event=pr
type=sha
type=raw,value=latest,enable={{is_default_branch}}
# 5. Docker 이미지 빌드 및 ACR에 푸시
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: . # Dockerfile이 있는 경로
file: ./Dockerfile # Dockerfile 경로 명시 (기본값)
push: true # 빌드 후 푸시 실행
tags: ${{ steps.meta.outputs.tags }} # 위 metadata step에서 생성된 태그 사용
labels: ${{ steps.meta.outputs.labels }} # 위 metadata step에서 생성된 라벨 사용
# 6. ACR에 푸시된 이미지 확인
- name: Verify pushed image
run: |
echo "Pushed image tags:"
echo "${{ steps.meta.outputs.tags }}"
echo "Checking image in ACR..."
echo "Basic tag information:"
az acr repository show-tags --name ${{ secrets.ACR_LOGIN_SERVER }} --repository ${{ github.ref == 'refs/heads/dev' && secrets.ACR_REPOSITORY_NAME_TEST || secrets.ACR_REPOSITORY_NAME }} --output table
# 7. 다음 job에서 사용할 이미지 태그 설정 (SHA 태그 사용!)
- name: Set Image Tag Output (Using SHA)
id: set_image_tag # job outputs에서 참조하는 id와 일치해야 함
run: |
# metadata-action 출력에서 SHA 태그 추출
SHA_TAG=$(echo "${{ steps.meta.outputs.tags }}" | grep -oE '[a-f0-9]{7,40}' | head -n 1)
if [[ -z "$SHA_TAG" ]]; then
echo "Error: Could not extract SHA tag from metadata outputs."
exit 1
fi
# 조건부 리포지토리 이름 다시 확인
if [[ "${{ github.ref_name }}" == "main" ]]; then
ACR_REPO_NAME_FOR_OUTPUT="${{ secrets.ACR_REPOSITORY_NAME }}"
else # dev 또는 기타
ACR_REPO_NAME_FOR_OUTPUT="${{ secrets.ACR_REPOSITORY_NAME_TEST }}"
fi
FULL_TAG="${{ secrets.ACR_LOGIN_SERVER }}/$ACR_REPO_NAME_FOR_OUTPUT:$SHA_TAG"
echo "Outputting image tag for deployment: $FULL_TAG"
echo "image_tag=$FULL_TAG" >> $GITHUB_OUTPUT
call-deploy-workflow:
name: Trigger ACA Deployment
needs: build-and-push
runs-on: ubuntu-latest
# main 또는 dev 브랜치에 push될 때만 배포 실행
if: github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'dev')
steps:
- name: Call Reusable Deployment Workflow
uses: 9git9git/9git-devops/.github/workflows/deploy_to_aca.yml@main
with:
image_tag: ${{ needs.build-and-push.outputs.image_tag }}
target_environment: ${{ (github.ref_name == 'main' && 'production') || 'test' }}
app_type: 'backend'
secrets: inherit