GitHub Actions를 사용하여 Azure에 배포하는 방법

완료됨

이 단원에서는 GitHub Actions를 사용하여 컨테이너 기반 Web Apps를 Microsoft Azure Web Apps에 배포하는 방법을 설명합니다. 워크플로를 트리거하는 몇 가지 옵션을 다룹니다. 다음으로 워크플로에서 조건문을 사용하는 방법을 알아봅니다. 마지막으로 GitHub Actions를 사용하여 Azure 리소스를 만들고 삭제하는 방법에 대해 알아봅니다.

CD 워크플로 트리거 옵션

CD 워크플로를 시작하는 몇 가지 옵션이 있습니다. GitHub Actions를 사용하는 CI에 관한 이전 모듈에서는 푸시부터 GitHub 리포지토리까지 워크플로를 트리거하는 방법을 살펴보았습니다. 그러나 CD의 경우 다른 이벤트에서 배포 워크플로를 트리거할 수도 있습니다.

한 가지 옵션은 ChatOps를 사용하여 워크플로를 트리거하는 것입니다. ChatOps는 채팅 클라이언트, 챗봇 및 실시간 커뮤니케이션 도구를 사용하여 작업을 실행합니다. 예를 들어 봇을 시작할 수 있는 특정 주석을 끌어오기 요청에 남길 수 있습니다. 이 봇은 일부 통계를 사용하여 주석을 다시 처리하거나 워크플로를 실행할 수 있습니다.

이 예제에서 사용하는 다른 옵션은 끌어오기 요청에서 레이블을 사용하는 것입니다. 레이블에 따라 다른 워크플로를 시작할 수 있습니다. 예를 들어, 스테이지 레이블을 추가하여 스테이징 환경에 대한 배포 워크플로를 시작합니다. 또는 환경 스핀업 레이블을 추가하여 배포할 Microsoft Azure 리소스를 만드는 워크플로를 실행합니다. 레이블을 사용하기 위한 워크플로는 다음과 같습니다.

on:
  pull_request:
    types: [labeled]

작업 조건을 사용하여 실행 제어

일부 조건이 충족되는 경우에만 워크플로를 실행할 수 있습니다.

GitHub 워크플로는 이 시나리오에 대한 if 조건을 제공합니다. 조건은 런타임에 평가되는 을 사용합니다. 예를 들어 stage 레이블이 끌어오기 요청에 추가된 경우에 이 워크플로를 실행할 수 있습니다.

if: contains(github.event.pull_request.labels.*.name, 'stage')

GitHub 비밀을 사용하여 자격 증명 저장

워크플로 파일에 중요한 정보가 노출되는 것을 원하지 않습니다. GitHub 비밀은 워크플로에 필요한 중요한 정보를 저장할 수 있는 안전한 장소입니다. 예를 들면 다음과 같습니다.

Azure 리소스에 배포하려면 GitHub Actions에 리소스에 액세스할 권한이 있어야 합니다. Azure 자격 증명을 워크플로 파일에 눈에 띄게 저장하지 않으려고 합니다. 대신 GitHub 비밀에 자격 증명을 저장합니다.

GitHub 비밀에 정보를 저장하려면 포털에서 비밀을 만듭니다.

Azure portal interface for creating a secret.

그런 다음, 해당 정보가 필요할 때마다 워크플로에서 만든 비밀의 이름을 사용합니다. 예를 들어, Azure login 작업의 creds: 특성에서 GitHub 비밀에 저장된 Azure 자격 증명을 사용합니다.

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

GitHub Actions를 사용하여 Microsoft Azure에 배포

GitHub Marketplace에는 Azure 관련 작업을 자동화하는 데 도움이 되는 몇 가지 작업이 있습니다.

The GitHub Marketplace showing search results for Azure.

또한 리포지토리의 워크플로 편집기에서 직접 GitHub Actions를 검색하고 찾아볼 수 있습니다. 사이드바에서 특정 작업을 검색하고, 추천 작업을 보고, 추천 범주를 찾아볼 수 있습니다.

작업을 찾으려면 다음을 수행합니다.

  1. 리포지토리에서 편집하려는 워크플로 파일로 이동합니다.
  2. 파일 보기의 오른쪽 위에 있는 편집 아이콘을 선택합니다.
  3. 편집기의 오른쪽에 있는 GitHub Marketplace 사이드바를 사용하여 작업을 찾습니다.

컨테이너 기반 웹앱을 Azure Web Apps에 배포한다고 가정합니다. GitHub Marketplace를 검색할 경우 다음 작업을 찾습니다.

이러한 작업을 Deploy-to-Azure 작업에 추가할 경우 워크플로는 다음과 같습니다.

  Deploy-to-Azure:
    runs-on: ubuntu-latest
    needs: Build-Docker-Image
    name: Deploy app container to Azure
    steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - uses: azure/docker-login@v1
        with:
          login-server: ${{env.IMAGE_REGISTRY_URL}}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy web app container
        uses: azure/webapps-container-deploy@v1
        with:
          app-name: ${{env.AZURE_WEBAPP_NAME}}
          images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}

      - name: Azure logout
        run: |
          az logout

이 작업은 이전 Build-Docker-Image 작업에 따라 달라집니다. 이전 작업은 배포되는 아티팩트를 만듭니다.

azure/login@v1 작업에서 배포하려는 Azure 리소스에 액세스할 수 있도록 Azure 계정에 로그인하려면 자격 증명이 필요합니다. 여기서는 GitHub 비밀에 저장한 자격 증명을 사용합니다.

azure/docker-login@v1 작업의 경우도 마찬가지입니다. 컨테이너 이미지를 배포하는 중이므로 프라이빗 컨테이너 레지스트리에 로그인해야 합니다.

azure/webapps-container-deploy@v1 작업은 배포를 수행합니다. 이전의 두 작업에 따라 달라집니다.

GitHub Actions를 사용하여 Azure 리소스 만들기 및 삭제

CD는 자동화된 프로세스이므로 배포할 환경을 만들고 해제하기 위해 Infrastructure as Code를 사용하도록 이미 결정했습니다. GitHub Actions는 Azure에서 이러한 작업을 자동화할 수 있고, 사용자는 워크플로에 해당 작업을 포함할 수 있습니다.

참고

불필요한 요금을 방지하려면 더 이상 사용하지 않을 리소스를 최대한 빨리 해제해야 합니다.

한 가지 옵션은 리소스를 실행 및 삭제하는 두 작업을 사용하여 새 워크플로를 만드는 것입니다. 그런 다음, 조건을 사용하여 원하는 작업만 실행합니다. 이 예제에서 조건은 끌어오기 요청에서 레이블을 찾고, 레이블이 spin up environmentset-up-azure-resources 작업을 실행하고, 레이블이 destroy environmentdestroy-azure-resources 작업을 실행합니다.

jobs:
  set-up-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'spin up environment')

    ...

  destroy-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'destroy environment')

    ...

작업에서는 Azure CLI를 사용하여 Azure 리소스를 만들고 삭제합니다. Azure CLI에 대한 자세한 내용은 Azure CLI 개요를 참조하세요.

set-up-azure-resources 작업 단계에 대한 예는 다음과 같습니다.

steps:
  - name: Checkout repository
    uses: actions/checkout@v2

  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Create Azure resource group
    if: success()
    run: |
      az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create Azure app service plan
    if: success()
    run: |
      az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create webapp resource
    if: success()
    run: |
      az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }}  --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Configure webapp to use GitHub Packages
    if: success()
    run: |
      az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}

GitHub Actions를 사용하여 리포지토리를 체크 아웃하고 Azure에 로그인합니다. 그런 다음, 필요한 리소스를 만들고 Azure CLI를 사용하여 컨테이너를 배포합니다.