다음을 통해 공유


파이프라인 구성 및 업데이트 푸시

이 문서에서는 Azure 개발자 CLI(azd)를 사용하여 GitHub Actions 또는 Azure DevOps와 같은 CI/CD 파이프라인을 통해 템플릿 변경 내용을 푸시하는 방법을 알아봅니다. 이 예제에서는 Azure 템플릿에서 Node.js API 및 MongoDB와 React Web App을 사용하지만 이 문서에서 학습한 원칙을 Azure 개발자 CLI 템플릿에 적용할 수 있습니다.

참고 항목

azd pipeline config 명령은 여전히 베타 상태입니다. 기능 버전 관리 및 릴리스 전략 페이지에서 알파 및 베타 기능 지원에 대해 자세히 알아보세요.

필수 조건

azd 템플릿은 CI/CD를 설정하는 데 필요한 기본 GitHub Actions 및/또는 Azure DevOps 파이프라인 구성 파일을 azure-dev.yml포함하거나 포함하지 않을 수 있습니다. 이 구성 파일은 Azure 리소스를 프로비전하고 코드를 주 분기에 배포합니다. 다음을 찾을 azure-dev.yml수 있습니다.

  • GitHub Actions의 경우: .github/workflows 디렉터리에 있습니다.
  • Azure DevOps의 경우: .azdo/pipelines 디렉터리에 있습니다.

구성 파일을 있는 그대로 사용하거나 필요에 맞게 수정할 수 있습니다.

참고 항목

를 호출azd pipeline config하기 전에 템플릿에 파이프라인 정의(azure-dev.yaml)가 있는지 확인합니다. azd 는 이 파일을 자동으로 만들지 않습니다. 아래 azd에 대한 파이프라인 정의 만들기를 참조하세요.

명령을 azd pipeline config 사용하여 다음 작업을 처리하는 CI/CD 파이프라인을 구성합니다.

  • Azure 구독에서 앱에 대한 서비스 주체를 만들고 구성합니다. azd가 Owner 역할을 만들고 서비스 주체에 할당할 수 있도록 하려면 사용자에게 Azure 구독 내에서 역할 또는 Contributor + User Access Administrator 역할이 있어야 합니다.
  • 워크플로를 통해 GitHub 또는 Azure DevOps 리포지토리를 만들고 구성하고 프로젝트 코드를 커밋합니다. 기존 리포지토리를 사용하도록 선택할 수도 있습니다.
  • Azure와 리포지토리 간에 보안 연결을 만듭니다.
  • 워크플로 파일을 체크 인할 때 GitHub 작업을 실행합니다.

이 프로세스를 보다 세부적으로 제어하거나 사용자에게 필요한 역할이 없는 경우 파이프라인을 수동으로 구성할 수 있습니다.

계속하려면 원하는 파이프라인 공급자를 선택합니다.

Azure에 배포하도록 GitHub 권한 부여

워크플로를 구성하려면 GitHub 작업에서 사용자를 대신하여 Azure에 배포할 서비스 주체에 권한을 부여해야 합니다. azd 는 서비스 주체 및 페더레이션 자격 증명을 만듭니다.

  1. 다음 명령을 실행하여 Azure 서비스 주체를 만들고 파이프라인을 구성합니다.

    azd pipeline config
    

    이 명령은 필요에 따라 GitHub 리포지토리를 만들고 코드를 새 리포지토리에 푸시합니다.

    참고 항목

    기본적으로 azd pipeline config 페더레이션된 자격 증명이라고 하는 OIDC(OpenID Connect)를 사용합니다. OIDC를 사용하지 않으려면 azd pipeline config --auth-type client-credentials를 실행합니다.

    Terraform에는 OIDC/페더레이션 자격 증명이 지원되지 않습니다 .

    에서 OIDC 지원에 대해 자세히 알아봅니다 azd.

  2. 요청된 GitHub 정보를 제공합니다.

  3. 로컬 변경 내용을 커밋하고 푸시하여 새 GitHub Actions 실행을 시작하라는 메시지가 표시되면 지정 y합니다.

  4. 터미널 창에서 명령의 결과를 봅니다 azd pipeline config . 이 azd pipeline config 명령은 프로젝트의 GitHub 리포지토리 이름을 출력합니다.

  5. 브라우저를 사용하여 프로젝트에 대한 GitHub 리포지토리를 엽니다.

  6. 작업을 선택하여 실행 중인 워크플로를 확인합니다 .

    실행 중인 GitHub 워크플로의 스크린샷

코드 변경 및 푸시

  1. 프로젝트의 /src/web/src/layout 디렉터리에서 을 엽니다 header.tsx.

  2. 줄을 <Text variant="xLarge">ToDo</Text>찾습니다.

  3. 리터럴 ToDo 을 .로 변경합니다 myTodo.

  4. 파일을 저장합니다.

  5. 변경 내용을 커밋합니다. 변경 내용을 커밋하면 GitHub 작업 파이프라인이 업데이트를 배포하기 시작합니다.

    테스트 파일을 변경하고 커밋하는 데 필요한 단계의 스크린샷.

  6. 브라우저를 사용하여 프로젝트의 GitHub 리포지토리를 열어 다음을 모두 확인합니다.

    • 커밋
    • 설정 중인 GitHub Actions의 커밋입니다.

    GitHub에서 커밋된 변경 내용의 스크린샷.

  7. 작업을 선택하여 워크플로에 반영된 테스트 업데이트를 확인합니다.

    테스트 업데이트 후 실행되는 GitHub 워크플로의 스크린샷

  8. 웹 프런트 엔드 URL을 방문하여 업데이트를 검사합니다.

azd GitHub 작업으로

GitHub 작업으로 추가 azd 합니다. 이 작업은 설치 azd됩니다. 이를 사용하려면 다음을 .github\workflows\azure-dev.yml추가할 수 있습니다.

on: [push]

jobs:
   build:
      runs-on: ubuntu-latest
      steps:
         - name: Install azd
         uses: Azure/setup-azd@v0.1.0

리소스 정리

이 문서에서 만든 Azure 리소스가 더 이상 필요하지 않은 경우 다음 명령을 실행합니다.

azd down

고급 기능

다음 섹션에 설명된 azd pipeline config 대로 특정 템플릿 시나리오 또는 요구 사항에 대한 명령을 확장할 수 있습니다.

추가 비밀 또는 변수

기본적으로 파이프라인에 azd 대한 변수 및 비밀을 설정합니다. 예를 들어 azd pipeline config 명령은 실행할 때마다 파이프라인 변수로 및 environment name region 파이프라인 변수를 만듭니다subscription id. 그런 다음 파이프라인 정의는 이러한 변수를 참조합니다.

env:
   AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
   AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
   AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
   AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
   AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}

파이프라인이 실행 azd 되면 변수 및 비밀에 매핑되는 환경에서 값을 가져옵니다. 템플릿에 따라 환경 변수를 사용하여 제어할 수 있는 설정이 있을 수 있습니다. 예를 들어 템플릿 인프라 내에서 Key Vault 리소스의 이름을 정의하도록 명명 KEY_VAULT_NAME 된 환경 변수를 설정할 수 있습니다. 이러한 경우 변수 및 비밀 목록은 템플릿에서 다음을 사용하여 azure.yaml정의할 수 있습니다. 예를 들어 다음 azure.yaml 구성을 고려합니다.

pipeline:
  variables:
    - KEY_VAULT_NAME
    - STORAGE_NAME
  secrets:
    - CONNECTION_STRING

이 구성을 azd 사용하면 환경에서 변수 또는 비밀에 비어 있지 않은 값이 있는지 확인합니다. azd 그런 다음, 구성의 키 이름을 변수 또는 비밀의 이름으로 사용하고 값에 대한 환경의 비 문자열 값을 사용하여 파이프라인에 대한 변수 또는 비밀을 만듭니다.

그런 다음 파이프라인 정의는 azure-dev.yaml 변수 또는 비밀을 참조할 수 있습니다.

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      KEY_VAULT_NAME: ${{ variables.KEY_VAULT_NAME }}
      STORAGE_NAME: ${{ variables.STORAGE_NAME }}
      CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}

참고 항목

azd가 파이프라인 값을 다시 설정하려면 비밀 또는 변수 azure.yaml 목록을 업데이트한 후 실행 azd pipeline config 해야 합니다.

인프라 매개 변수

다음 bicep 예제를 고려합니다.

@secure()
param BlobStorageConnection string

매개 변수 BlobStorageConnection 에 기본값 집합이 없으므로 azd 사용자에게 값을 입력하라는 메시지가 표시됩니다. 그러나 CI/CD 중에는 대화형 프롬프트가 없습니다. azd 는 실행할 azd pipeline config때 매개 변수 값을 요청하고 파이프라인에 값을 저장한 다음 파이프라인이 실행되면 값을 다시 가져와야 합니다.

azd 는 파이프라인에 필요한 모든 매개 변수의 값을 자동으로 저장하고 설정하기 위해 호출 AZD_INITIAL_ENVIRONMENT_CONFIG 된 파이프라인 비밀을 사용합니다. 파이프라인에서 이 비밀을 참조하기만 하면 됩니다.

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}

파이프라인이 실행 azd 되면 비밀에서 매개 변수 값을 가져와 대화형 프롬프트가 필요하지 않습니다.

참고 항목

새 매개 변수를 추가하는 경우 다시 실행 azd pipeline config 해야 합니다.

파이프라인 정의 만들기

azd 템플릿에 CI/CD 파이프라인 정의 파일이 아직 없는 경우 직접 만들 수 있습니다. CI/CD 파이프라인 정의에는 일반적으로 4개 주요 섹션이 있습니다.

  • 트리거
  • permissions
  • 운영 체제 또는 풀
  • 실행할 단계

다음 예제에서는 GitHub Actions 및 Azure Pipelines에 대한 정의 파일 및 관련 구성을 만드는 방법을 보여 줍니다.

GitHub Actions에서 실행 azd 하려면 다음 구성이 필요합니다.

다음 템플릿을 고유한 파이프라인 정의의 시작점으로 사용할 수 있습니다.

on:
  workflow_dispatch:
  push:
    # Run when commits are pushed to mainline branch (main or master)
    # Set this to the mainline branch you are using
    branches:
      - main
      - master

# Set this permission if you are using a Federated Credential.
permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    # azd build-in variables.
    # This variables are always set by `azd pipeline config`
    # You can set them as global env (apply to all steps) or you can add them to individual steps' environment
    env:
      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
      ## Define the additional variables or secrets that are required globally (provision and deploy)
      # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
      # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}      
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      # using the install-azd action
      - name: Install azd
        uses: Azure/setup-azd@v1.0.0

      # # If you want to use azd-daily build, or install it from a PR, you can remove previous step and
      # # use the next one:
      # - name: Install azd - daily or from PR
      #  # Update this scrip based on the OS - pool of your pipeline. This example is for a linux pipeline installing daily build
      #  run: curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version daily
      #  shell: pwsh

      # azd set up Federated Credential by default. You can remove this step if you are using Client Credentials
      - name: Log in with Azure (Federated Credentials)
        if: ${{ env.AZURE_CLIENT_ID != '' }}
        run: |
          azd auth login `
            --client-id "$Env:AZURE_CLIENT_ID" `
            --federated-credential-provider "github" `
            --tenant-id "$Env:AZURE_TENANT_ID"
        shell: pwsh

      ## If you set up your pipeline with Client Credentials, remove previous step and uncomment this one
      # - name: Log in with Azure (Client Credentials)
      #   if: ${{ env.AZURE_CREDENTIALS != '' }}
      #   run: |
      #     $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable;
      #     Write-Host "::add-mask::$($info.clientSecret)"

      #     azd auth login `
      #       --client-id "$($info.clientId)" `
      #       --client-secret "$($info.clientSecret)" `
      #       --tenant-id "$($info.tenantId)"
      #   shell: pwsh
      #   env:
      #     AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Provision Infrastructure
        run: azd provision --no-prompt
        env:
         #  # uncomment this if you are using infrastructure parameters
         #  AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}
         ## Define the additional variables or secrets that are required only for provision 
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}

      - name: Deploy Application
        run: azd deploy --no-prompt
        env:
         ## Define the additional variables or secrets that are required only for deploy
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}