0Pricing
Cloud & IT Cert Prep · 강의

Azure에서 GitHub Actions 사용

azure/webapps-deploy 작업과 GitHub Actions를 사용해 CI/CD 워크플로를 재현하고, Azure Pipelines 대신 GitHub Actions를 선택할 경우를 이해합니다.

Azure에서 GitHub Actions 사용은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

GitHub Actions란 무엇인가요

깃허브 Actions는 GitHub에 기본으로 포함된 CI/CD 및 자동화 플랫폼입니다. 워크플로는 리포지토리의 .github/workflows/ 디렉터리에 저장된 YAML 파일에 정의하며, 푸시, 풀 리퀘스트, 릴리스 등의 GitHub 이벤트에 의해 실행됩니다. GitHub Actions는 GitHub 생태계(이슈, PR, 패키지, 보안 검사)와 긴밀하게 통합되어 있으며, Azure 빌드, 테스트, 배포와 같은 작업에 사용할 수 있는 다양한 커뮤니티 Actions를 제공합니다.

GitHub Actions 워크플로 구조

GitHub Actions 워크플로 파일에는 최상위 섹션이 세 개 있습니다. on은 트리거 이벤트를 정의합니다. env는 전역 환경 변수를 설정합니다. jobs는 하나 이상의 작업을 정의하며, 각 작업은 runner(GitHub 호스팅 또는 자체 호스팅)에서 실행됩니다. 각 작업에는 단계가 있으며, run(셸 스크립트) 또는 uses(미리 빌드된 Action) 중 하나입니다. 작업은 기본적으로 병렬 실행되며, needs를 사용하면 순차적인 종속성을 만들 수 있습니다.

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  NODE_VERSION: '18.x'

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: ${{ env.NODE_VERSION }}
    - run: npm ci
    - run: npm test

GitHub Actions에서 Azure 인증하기

GitHub Actions를 Azure에 인증하는 데 권장되는 방법은 OpenID Connect (OIDC)입니다. 이 방법은 GitHub에 장기 보안 비밀을 저장하지 않고 수명이 짧은 토큰을 발급합니다. Azure App Registration 또는 Managed Identity에 페더레이션 자격 증명을 구성하고, GitHub 리포지토리와 브랜치에 대한 신뢰를 부여하십시오. azure/login@v2 Action을 사용하여 GitHub OIDC 토큰을 Azure 액세스 토큰으로 교환하면 GitHub Secrets에 클라이언트 보안 비밀을 저장할 필요가 없습니다.

# Configure OIDC federated credential in Azure
az ad app federated-credential create \
  --id <AppRegistrationObjectId> \
  --parameters '{
    "name": "github-oidc",
    "issuer": "https://token.actions.githubusercontent.com",
    "subject": "repo:myorg/myrepo:ref:refs/heads/main",
    "audiences": ["api://AzureADTokenExchange"]
  }'

# In the workflow: login via OIDC
# permissions:
#   id-token: write
#   contents: read
# - uses: azure/login@v2
#   with:
#     client-id: ${{ vars.AZURE_CLIENT_ID }}
#     tenant-id: ${{ vars.AZURE_TENANT_ID }}
#     subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

Azure App Service에 배포하기

azure/webapps-deploy@v3 Action은 코드 또는 컨테이너 이미지를 Azure App Service에 배포합니다. 슬롯 배포, 패키지 기반 배포, Docker 이미지 배포를 처리합니다. 인증에는 azure/login@v2를 함께 사용하십시오. 스테이징 슬롯을 대상으로 지정하고 스모크 테스트를 실행한 다음, 슬롯 교체 명령을 실행하는 azure/CLI@v2 Action으로 슬롯을 교체할 수 있습니다. 이렇게 하면 Azure Pipelines의 블루-그린 배포 패턴을 GitHub Actions에서 그대로 구현할 수 있습니다.

# .github/workflows/deploy.yml
jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
    - uses: actions/checkout@v4

    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

    - name: Build and zip app
      run: npm ci && npm run build && zip -r app.zip dist/

    - uses: azure/webapps-deploy@v3
      with:
        app-name: myUniqueWebApp
        slot-name: staging
        package: app.zip

Azure Kubernetes Service에 배포하기

azure/k8s-deploy@v5 Action을 사용하여 GitHub Actions에서 AKS에 배포하십시오. 이 Action은 kubectl apply를 사용하여 매니페스트를 배포하고, 이미지 대체(현재 빌드의 태그로 이미지 태그 교체)를 수행하며, 롤아웃 상태를 모니터링합니다. azure/aks-set-context@v4 Action은 인증된 Azure 세션을 사용하여 클러스터 kubeconfig를 가져옴으로써 kubectl 자격 증명을 구성합니다.

jobs:
  deploy-aks:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
    - uses: actions/checkout@v4
    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

    - uses: azure/aks-set-context@v4
      with:
        resource-group: MyRG
        cluster-name: myAKSCluster

    - uses: azure/k8s-deploy@v5
      with:
        namespace: production
        manifests: k8s/
        images: 'mycontainerregistry.azurecr.io/myapp:${{ github.sha }}'

GitHub Secrets 및 변수

민감한 값은 GitHub Secrets에 저장하십시오. 워크플로에서는 이러한 암호화된 값에 ${{ secrets.SECRET_NAME }}으로 액세스할 수 있습니다. 민감하지 않은 구성은 GitHub Variables에 저장하며, ${{ vars.VARIABLE_NAME }}으로 액세스할 수 있습니다. 두 항목 모두 리포지토리, 환경 또는 조직 범위로 지정할 수 있습니다. GitHub Actions에서 환경을 사용하면 Azure DevOps Environments와 유사한 보호 규칙(필수 검토자, 배포 브랜치)을 추가할 수 있습니다.

# Reference secrets and variables in a workflow
steps:
- name: Configure app settings
  uses: azure/CLI@v2
  with:
    inlineScript: |
      az webapp config appsettings set \
        --name myUniqueWebApp \
        --resource-group MyRG \
        --settings \
          DATABASE_URL='${{ secrets.DATABASE_URL }}' \
          API_VERSION='${{ vars.API_VERSION }}'

환경 보호 규칙

GitHub Actions의 Environments(리포지토리 Settings → Environments에서 구성)는 Azure DevOps 환경과 유사한 배포 게이트를 추가합니다. 필수 검토자를 지정하여 해당 환경을 대상으로 하는 작업이 실행되기 전에 승인을 요구할 수 있고, 특정 브랜치로 배포를 제한할 수 있으며(main만 Production에 배포 가능), 대기 타이머를 추가하여 배포를 지연할 수도 있습니다. 보호된 환경을 대상으로 하는 작업은 모든 보호 규칙이 충족될 때까지 일시 중지됩니다.

# Workflow job targeting a protected GitHub environment
jobs:
  deploy-production:
    runs-on: ubuntu-latest
    environment:
      name: Production           # Must have 2 approvers in GitHub settings
      url: https://myapp.contoso.com
    needs: deploy-staging
    steps:
    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
    - uses: azure/webapps-deploy@v3
      with:
        app-name: myUniqueWebApp
        package: app.zip

재사용 가능한 워크플로와 복합 Actions

두 가지 GitHub Actions 기능을 사용하여 리포지토리 간에 CI/CD 로직을 중복 작성하지 마십시오. 재사용 가능한 워크플로를 사용하면 한 리포지토리에 워크플로를 정의하고, uses: myorg/shared-workflows/.github/workflows/deploy.yml@main을 사용하여 다른 리포지토리의 워크플로에서 호출할 수 있습니다. 복합 Actions는 여러 단계를 하나의 Action으로 묶어 리포지토리에 저장하며, uses: myorg/my-actions/deploy@v1로 재사용할 수 있습니다. 두 기능 모두 조직의 CI/CD 파이프라인 전반에서 DRY 원칙을 실현하는 데 도움이 됩니다.

# Call a reusable workflow from another workflow
jobs:
  deploy:
    uses: myorg/shared-workflows/.github/workflows/deploy-appservice.yml@main
    with:
      app-name: myUniqueWebApp
      slot-name: staging
      package-path: dist/
    secrets:
      AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

GitHub Actions와 Azure Pipelines: 언제 선택할까요

코드가 GitHub에 호스팅되고, 팀이 GitHub UI를 선호하며, GitHub PR 검사 및 코드 검사와 긴밀하게 통합하고 싶거나, 오픈 소스 프로젝트를 개발하는 경우(무료 사용 시간이 넉넉함) GitHub Actions를 선택하십시오. Azure Boards 통합, Azure Test Plans를 사용한 고급 테스트, Azure Artifacts 피드 관리, Azure Repos에 저장된 코드가 필요하거나, 여러 환경에 걸친 게이트를 포함한 복잡한 다단계 릴리스 관리가 필요한 경우에는 Azure Pipelines를 선택하십시오. 두 도구 모두 Azure에 동일하게 잘 배포할 수 있습니다.

GitHub Actions Marketplace

GitHub Actions Marketplace에는 일반적인 작업에 사용할 수 있는 수천 개의 커뮤니티 및 공식 Actions가 등록되어 있습니다. Microsoft는 azure/login, azure/webapps-deploy, azure/aks-set-context, azure/k8s-deploy, azure/CLI, azure/arm-deploy 등 공식 Azure Actions를 제공합니다. 손상된 Action이 악성 코드로 업데이트되어 공급망 공격이 발생하는 것을 방지하려면 항상 특정 버전 태그(예: @v3) 또는 커밋 SHA로 Actions 버전을 고정하십시오.

# Pin actions to specific version (recommended)
- uses: actions/checkout@v4         # Pinned to v4 tag
- uses: azure/login@v2               # Pinned to v2
- uses: azure/webapps-deploy@v3      # Pinned to v3

# Extra security: pin to commit SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

# Avoid unpinned 'latest' or branch references
# - uses: some-action@main           # UNSAFE - could change at any time

프라이빗 네트워크용 자체 호스팅 Runners

GitHub 호스팅 Runners는 퍼블릭 인터넷에만 액세스할 수 있으므로, 리소스를 공개적으로 노출하지 않으면 프라이빗 Azure 리소스(SQL 데이터베이스, 내부 API)에 연결할 수 없습니다. 프라이빗 리소스에 배포하려면 VNet 내부의 Azure VM에서 자체 호스팅 Runners를 사용하십시오. GitHub Actions runner 에이전트를 다운로드하고, 리포지토리 URL과 등록 토큰으로 구성한 다음, 서비스로 실행하여 Runner를 등록하십시오. 탄력적인 Runner 풀을 구성하려면 Azure Container Apps를 사용하여 자체 호스팅 Runners를 확장하십시오.

# Register a self-hosted runner on an Azure VM
# 1. Download runner (run on the VM)
curl -O -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
mkdir actions-runner && tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz -C actions-runner
cd actions-runner

# 2. Configure (use token from GitHub Settings > Actions > Runners)
./config.sh --url https://github.com/myorg/myrepo --token <REGISTRATION_TOKEN>

# 3. Run as a service
sudo ./svc.sh install && sudo ./svc.sh start

# Use in workflow
# runs-on: self-hosted

빠른 확인

이 수업에서 다룬 Microsoft Azure Fundamentals (AZ-900) 개념에 대한 이해도를 확인해 보십시오.

수업 요약

이 수업에서는 다음을 배웠습니다. GitHub Actions 워크플로는 GitHub 이벤트에 의해 트리거되고 Runners에서 실행되는 .github/workflows/의 YAML 파일이며, OIDC 페더레이션 자격 증명은 GitHub Actions에서 보안 비밀 없이 Azure 인증을 가능하게 하고, 보호 규칙이 적용된 GitHub Environments는 운영 환경 배포에 승인 게이트를 추가합니다. 이로써 Azure DevOps 과정이 완료됩니다. 다음으로는 Azure Monitor와 Log Analytics를 살펴봅니다.

자주 묻는 질문

“Azure에서 GitHub Actions 사용” 강의는 무료인가요?

네 — “Azure에서 GitHub Actions 사용” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“Azure에서 GitHub Actions 사용”에서 뭘 배우나요?

azure/webapps-deploy 작업과 GitHub Actions를 사용해 CI/CD 워크플로를 재현하고, Azure Pipelines 대신 GitHub Actions를 선택할 경우를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“Azure에서 GitHub Actions 사용” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Azure DevOps Services 개요
  2. Azure Pipelines로 CI 파이프라인 구축
  3. Azure로 지속적 배포
  4. Azure에서 GitHub Actions 사용
← Cloud & IT Cert Prep(으)로 돌아가기