가상 머신 이미지를 빌드하는 워크플로를 만들어 GitHub Actions 를 시작합니다.
GitHub Actions를 사용하면 워크플로의 아티팩트를 사용하여 사용자 지정 가상 머신 이미지를 만들어 CI/CD 프로세스의 속도를 높일 수 있습니다. 이미지를 빌드하고 공유 이미지 갤러리에 배포할 수 있습니다.
그런 다음 이러한 이미지를 사용하여 가상 머신 및 가상 머신 확장 집합을 만들 수 있습니다.
빌드 가상 머신 이미지 작업은 Azure Image Builder 서비스를 사용합니다.
필수 조건
- 활성 구독이 있는 Azure 계정. 무료로 계정을 만듭니다.
- 활성 리포지토리가 있는 GitHub 계정입니다. 없는 경우 무료로 가입하세요.
- 이 예제에서는 Java Spring PetClinic 샘플 애플리케이션을 사용합니다.
- 이미지가 있는 Azure Compute 갤러리입니다.
워크플로 파일 개요
워크플로는 리포지토리의 /.github/workflows/ 경로에 있는 YAML(.yml) 파일에서 정의됩니다. 이 정의는 워크플로를 구성하는 다양한 단계와 매개 변수를 포함합니다.
파일에는 세 개의 섹션이 있습니다.
| 섹션 | 업무 |
|---|---|
| 인증 | 1. 사용자 관리 ID를 추가합니다. 2. 서비스 주체 또는 Open ID Connect를 설정합니다. 3. GitHub 비밀을 만듭니다. |
| 빌드 | 1. 환경을 설정합니다. 2. 앱을 빌드합니다. |
| Image | 1. VM 이미지를 만듭니다. 2. 가상 머신을 만듭니다. |
사용자 관리 ID 만들기
이미지를 배포하려면 AIB(Azure Image Builder)에 대한 사용자 관리 ID가 필요합니다. Azure 사용자 할당 관리 ID는 이미지를 빌드하는 동안 공유 이미지 갤러리에 이미지를 읽고 쓰는 데 사용됩니다.
Azure CLI 또는 Azure Portal을 사용하여 사용자 관리 ID를 만듭니다. 관리 ID의 이름을 적어 씁니다.
이 JSON 코드를 사용자 지정합니다. 자리 표시자를
{subscriptionID}구독 ID 및{rgName}리소스 그룹 이름으로 바꿉니다.{ "properties": { "roleName": "Image Creation Role", "IsCustom": true, "description": "Azure Image Builder access to create resources for the image build", "assignableScopes": [ "/subscriptions/{subscriptionID}/resourceGroups/{rgName}" ], "permissions": [ { "actions": [ "Microsoft.Compute/galleries/read", "Microsoft.Compute/galleries/images/read", "Microsoft.Compute/galleries/images/versions/read", "Microsoft.Compute/galleries/images/versions/write", "Microsoft.Compute/images/write", "Microsoft.Compute/images/read", "Microsoft.Compute/images/delete" ], "notActions": [], "dataActions": [], "notDataActions": [] } ] } }이 JSON 코드를 사용하여 JSON을 사용하여 새 사용자 지정 역할을 만듭니다.
Azure Portal에서 Azure Compute 갤러리를 열고 액세스 제어(IAM)로 이동합니다.
역할 할당 추가를 선택하고 사용자 관리 ID에 이미지 만들기 역할을 할당합니다.
배포 자격 증명 생성
OIDC에서 Azure 로그인 작업을 사용하려면 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID에서 페더레이션 ID 자격 증명을 구성해야 합니다.
옵션 1: Microsoft Entra 애플리케이션
- Azure Portal, Azure CLI 또는 Azure PowerShell에서 서비스 주체를 사용하여 Microsoft Entra 애플리케이션을 만듭니다.
- 클라이언트 ID, 구독 ID 및 디렉터리(테넌트) ID의 값을 복사하여 나중에 GitHub Actions 워크플로에서 사용합니다.
- Azure Portal, Azure CLI 또는 Azure PowerShell을 통해 서비스 주체에 적절한 역할을 할당합니다.
- GitHub Actions에서 발급한 토큰을 GitHub 리포지토리에 신뢰하도록 Microsoft Entra 애플리케이션 에서 페더레이션 ID 자격 증명을 구성합니다.
옵션 2: 사용자 할당 관리 ID
- 사용자 할당 관리 ID 만들기.
- 클라이언트 ID, 구독 ID 및 디렉터리(테넌트) ID의 값을 복사하여 나중에 GitHub Actions 워크플로에서 사용합니다.
- 사용자 할당 관리 ID에 적절한 역할을 할당합니다.
- GitHub Actions에서 발급한 토큰을 GitHub 리포지토리에 신뢰하도록 사용자 할당 관리 ID에서 페더레이션 ID 자격 증명을 구성합니다.
GitHub 비밀 만들기
로그인 작업에 애플리케이션의 클라이언트 ID, 디렉터리(테넌트) ID 및 구독 ID 를 제공해야 합니다. 이러한 값은 워크플로에서 직접 제공하거나 GitHub 비밀에 저장하고 워크플로에서 참조할 수 있습니다. 값을 GitHub 비밀로 저장하는 것이 더 안전한 옵션입니다.
GitHub에서 리포지토리로 이동합니다.
보안 > 비밀 및 변수 > 작업을 선택합니다.
새 리포지토리 비밀을 선택합니다.
비고
공용 리포지토리에서 워크플로 보안을 강화하려면 리포지토리 비밀 대신 환경 비밀을 사용합니다. 환경에 승인이 필요한 경우 필수 검토자 중 한 명이 승인할 때까지 작업에서 환경 비밀에 액세스할 수 없습니다.
AZURE_CLIENT_ID,AZURE_TENANT_ID및AZURE_SUBSCRIPTION_ID에 대한 비밀을 만듭니다. GitHub 비밀에 대한 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID에서 다음 값을 복사합니다.GitHub 비밀 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID AZURE_CLIENT_ID 클라이언트 ID AZURE_SUBSCRIPTION_ID 구독 ID AZURE_TENANT_ID (Azure 테넌트 ID) 디렉터리(테넌트) ID 비고
보안상의 이유로 워크플로에 직접 값을 전달하는 대신 GitHub 비밀을 사용하는 것이 좋습니다.
Azure 로그인 작업 사용
Azure 로그인 작업과 함께 GitHub 비밀을 사용하여 Azure에 인증합니다.
Open ID Connect의 경우 Active Directory 앱과 연결된 페더레이션 자격 증명을 사용합니다.
워크플로 파일에서 GitHub 비밀을 참조하는 방법에 대한 자세한 내용은 GitHub Docs 의 워크플로에서 암호화된 비밀 사용을 참조하세요.
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- name: Log in with Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Java 구성
Java 설치 SDK 작업을 사용하여 Java 환경을 설정합니다. 이 예제에서는 환경을 설정하고 Maven을 사용하여 빌드한 다음 아티팩트를 출력합니다.
GitHub 아티팩트는 작업 간에 워크플로의 파일을 공유하는 방법입니다. JAR 파일을 보관할 아티팩트를 만든 다음 가상 머신 이미지에 추가합니다.
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '17' ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login via Az module
uses: azure/login@v2
with:
creds: ${{secrets.AZURE_CREDENTIALS}}
- name: Set up JDK ${{matrix.java}}
uses: actions/setup-java@v2
with:
java-version: ${{matrix.java}}
distribution: 'adopt'
cache: maven
- name: Build with Maven Wrapper
run: ./mvnw -B package
- name: Build Java
run: mvn --batch-mode --update-snapshots verify
- run: mkdir staging && cp target/*.jar staging
- uses: actions/upload-artifact@v2
with:
name: Package
path: staging
이미지 빌드
Azure Virtual Machine 이미지 빌드 작업을 사용하여 사용자 지정 가상 머신 이미지를 만듭니다.
의 자리 표시자를 {subscriptionID}{rgName}{Identity} 구독 ID, 리소스 그룹 이름 및 관리 ID 이름으로 바꿉니다.
{galleryName} 및 {imageName} 값을 이미지 갤러리 이름과 이미지 이름으로 바꾸십시오.
비고
권한 오류로 앱 구운 이미지 만들기 작업이 실패하는 경우 사용자 관리 ID에 이미지 만들기 역할을 할당했는지 확인합니다.
- name: Create App Baked Image
id: imageBuilder
uses: azure/build-vm-image@v0
with:
location: 'eastus2'
resource-group-name: '{rgName}'
managed-identity: '{Identity}' # Managed identity
source-os-type: 'windows'
source-image-type: 'platformImage'
source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
dist-type: 'SharedImageGallery'
dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image gallery's image definition
dist-location: 'eastus2'
가상 머신 작업 매개변수
| Input | 필수 | Description |
|---|---|---|
resource-group-name |
Yes | 빌드 프로세스 중에 스토리지 및 아티팩트 저장에 사용되는 리소스 그룹입니다. |
image-builder-template-name |
아니오 | 사용되는 이미지 작성기 템플릿 리소스의 이름입니다. |
location |
Yes | Azure Image Builder가 실행되는 위치입니다. 지원되는 위치를 참조하세요. |
build-timeout-in-minutes |
아니오 | 빌드가 취소된 시간입니다. 기본값은 240입니다. |
vm-size |
선택적 | 기본적으로 Standard_D1_v2 사용됩니다.
가상 머신 크기를 참조하세요. |
managed-identity |
Yes | 이전에 만든 사용자 관리 ID입니다. ID가 다른 리소스 그룹에 있는 경우 전체 식별자를 사용합니다. 동일한 리소스 그룹에 있는 경우 이름을 사용합니다. |
source-os |
Yes | 기본 이미지의 OS 유형(Linux 또는 Windows) |
source-image-type |
Yes | 사용자 지정 이미지를 만드는 데 사용할 기본 이미지 형식입니다. |
source-image |
Yes | 기본 이미지의 리소스 식별자입니다. 원본 이미지는 위치의 입력 값에 설정된 동일한 Azure 지역에 있어야 합니다. |
customizer-source |
아니오 | 사용자 지정을 위해 기본 이미지에 추가해야 하는 모든 아티팩트만 유지할 수 있는 디렉터리입니다. 기본적으로 값은 ${{ GITHUB.WORKSPACE }}/workflow-artifacts. |
customizer-destination |
아니오 | 아티팩트가 복사되는 사용자 지정된 이미지의 디렉터리입니다. |
customizer-windows-update |
아니오 | Windows에만 해당합니다. 부울 값입니다. 이 경우 true이미지 작성기에서 사용자 지정이 끝날 때 Windows 업데이트를 실행합니다. |
dist-location |
아니오 | SharedImageGallery의 경우 다음과 같습니다 dist-type. |
dist-image-tags |
아니오 | 이러한 태그는 생성된 사용자 지정 이미지에 추가되는 사용자 정의 태그입니다(예: version:beta). |
가상 머신 만들기
마지막 단계로 이미지에서 가상 머신을 만듭니다.
자리 표시자를
{rgName}리소스 그룹 이름으로 바꿉니다.가상 머신 암호(
VM_PWD)를 사용하여 GitHub 비밀을 추가합니다. 암호를 다시 볼 수 없으므로 암호를 기록해야 합니다. 사용자 이름은 .입니다myuser.
- name: CREATE VM
uses: azure/CLI@v1
with:
azcliversion: 2.0.72
inlineScript: |
az vm create --resource-group ghactions-vMimage --name "app-vm-${{ GITHUB.RUN_NUMBER }}" --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location eastus2 \
--image "${{ steps.imageBuilder.outputs.custom-image-uri }}"
YAML 완료
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Login via Az module
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Setup Java 1.8.x
uses: actions/setup-java@v1
with:
java-version: '1.8.x'
- name: Build Java
run: mvn --batch-mode --update-snapshots verify
- run: mkdir staging && cp target/*.jar staging
- uses: actions/upload-artifact@v2
with:
name: Package
path: staging
- name: Create App Baked Image
id: imageBuilder
uses: azure/build-vm-image@v0
with:
location: 'eastus2'
resource-group-name: '{rgName}'
managed-identity: '{Identity}' # Managed identity
source-os-type: 'windows'
source-image-type: 'platformImage'
source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
dist-type: 'SharedImageGallery'
dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image gallery's image definition
dist-location: 'eastus2'
- name: CREATE VM
uses: azure/CLI@v1
with:
azcliversion: 2.0.72
inlineScript: |
az vm create --resource-group ghactions-vMimage --name "app-vm-${{ GITHUB.RUN_NUMBER }}" --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location eastus2 \
--image "${{ steps.imageBuilder.outputs.custom-image-uri }}"
다음 단계
- Azure에 배포하는 방법을 알아봅니다.