Amazon Web Services 한국 블로그
AWS CodeBuild 기반 연속적 통합 파이프라인에 macOS 지원 시작
오늘부터 AWS CodeBuild를 사용하여 macOS에서 애플리케이션을 구축할 수 있습니다. 이제 macOS 14 Sonoma에서 실행되는 관리형 Apple M2 머신에서 아티팩트를 빌드할 수 있습니다. AWS CodeBuild 는 소스 코드를 컴파일하고, 테스트를 수행하고, 바로 배포 가능한 소프트웨어 패키지를 생성하는 완전관리형 연속적 통합 서비스입니다.
Apple 시스템(iOS, iPadOS, watchOS, tvOS, and macOS)용 애플리케이션을 빌드, 테스트, 서명 및 배포하려면 macOS에서만 실행되는 Xcode를 사용해야 합니다. AWS 클라우드에서 Apple 시스템용으로 구축할 때는 Amazon EC2 Mac 인스턴스에서 실행되도록 연속적 통합 및 연속적 배포(CI/CD) 파이프라인을 구성했을 가능성이 큽니다.
2020년에 Amazon EC2 Mac을 출시한 이후로 저는 많은 시간을 다양한 산업 및 지역의 고객과 함께 하며 macOS에서 파이프라인을 구성하고 최적화하도록 지원했습니다. 가장 간단한 형태로 고객의 파이프라인은 다음 다이어그램과 같을 수 있습니다.
파이프라인은 소스 코드 리포지토리에 새로운 커밋 또는 풀 요청이 있을 때 시작됩니다. 머신에 설치된 리포지토리 에이전트는 다양한 스크립트를 트리거하여 환경을 구성하고, 애플리케이션을 구축 및 테스트한 후 최종적으로 App Store Connect에 배포합니다.
Amazon EC2 Mac은 macOS 시스템의 관리 및 자동화를 대폭 간소화합니다. 설명해 드리자면, EC2 Mac 인스턴스에는 제가 좋아하는 Amazon EC2 (Amazon EBS 볼륨, 스냅샷, 가상 사설 클라우드(VPC), 보안 그룹 등) 의 모든 기능이 클라우드에서 macOS를 실행하는 Mac mini에 적용됩니다.
그러나 고객에게는 두 가지 과제가 남아 있습니다. 첫 번째 단계는 빌드에 필요한 모든 도구를 갖춘 Amazon 머신 이미지(AMI)를 준비하는 것입니다. 최소 빌드 환경에는 Xcode가 필요하지만 Fastlane(및 Ruby)과 기타 빌드 또는 개발 도구 및 라이브러리를 설치하는 것이 매우 일반적입니다. 대부분의 조직에서는 macOS와 Xcode 버전을 다양하게 조합할 수 있는 다중 빌드 환경이 필요합니다.
두 번째 과제는 빌드 수와 기간에 따라 빌드 플릿을 확장하는 것입니다. 대규모 조직에서는 일반적으로 하루에 수백 또는 수천 개의 빌드를 생성하므로 수십 대의 빌드 머신이 필요합니다. 플릿을 확장하거나 축소하면 비용을 절감하는 데 도움이 됩니다. EC2 Mac 인스턴스는 전용으로 예약되어 있습니다. 하나의 인스턴스가 하나의 전용 호스트에 할당됩니다. 전용 호스트 플릿을 확장하려면 특정 구성이 필요합니다.
이러한 문제를 해결하고 macOS 빌드 머신의 구성 및 관리를 단순화하기 위해 오늘 macOS용 CodeBuild를 소개합니다.
macOS용 CodeBuild는 최근에 도입된 예약 용량 플릿을 기반으로 합니다. 예약 용량 플릿에는 Amazon EC2에서 제공하는 인스턴스 중 CodeBuild에서 유지 관리하는 인스턴스가 포함되어 있습니다. 예약 용량 플릿을 사용하여 빌드 환경을 위한 전용 인스턴스 세트를 구성할 수 있습니다. 이러한 머신은 유휴 상태로 유지되어 빌드 또는 테스트를 즉시 처리할 수 있으므로 빌드 기간이 단축됩니다. 예약 용량 플릿을 사용하면 머신은 항상 실행되며 프로비저닝되는 한 계속해서 비용이 발생합니다.
CodeBuild는 빌드를 실행하기 위한 표준 디스크 이미지(AMI)를 제공합니다. 사전 설치된 버전의 Xcode, Fastlane, Ruby, Python, Node.js 및 개발 및 빌드 환경을 위한 기타 인기 있는 도구가 포함되어 있습니다. 설치된 전체 도구 목록은 설명서에 나와 있습니다. 시간이 지나면 이러한 도구의 업데이트된 버전이 포함된 추가 디스크 이미지를 제공할 예정입니다. 원하는 경우 사용자 지정 디스크 이미지를 가져올 수도 있습니다.
또한 CodeBuild를 사용하면 오토 스케일링을 쉽게 구성할 수 있습니다. 원하는 용량을 알려주시면 저희가 모든 것을 관리해 드립니다.
macOS용 CodeBuild 시작하기
작동 방식을 보여드리기 위해 제 취미 프로젝트인 iOS에서 AWS Amplify 시작하기를 위한 CI/CD 파이프라인을 만들어 보았습니다. 이 튜토리얼과 함께 제공되는 소스 코드는 클라우드 기반 백엔드로 간단한 iOS 앱을 만드는 방법을 설명합니다. 이 앱은 GraphQL API(AWS AppSync), NoSQL 데이터베이스(Amazon DynamoDB), 파일 기반 스토리지(Amazon S3) 및 사용자 인증(Amazon Cognito)을 사용합니다. Swift용 AWS Amplify는 이러한 모든 서비스를 하나로 묶는 제품입니다.
튜토리얼과 앱 소스 코드는 Git 리포지토리에서 사용할 수 있습니다. 여기에는 앱의 빌드, 테스트 및 배포를 자동화하는 스크립트가 포함됩니다.
macOS용 CodeBuild를 사용하여 새 CI/CD 파이프라인을 구성하려면 다음과 같은 상위 단계를 거쳐야 합니다.
- 빌드 프로젝트를 생성합니다.
- 전용 머신 플릿을 생성합니다.
- 하나 이상의 빌드 트리거를 구성합니다.
- 프로젝트에 파이프라인 정의 파일(
buildspec.yaml
)을 추가합니다.
시작하려면 AWS Management Console을 열고 CodeBuild를 선택한 다음 프로젝트 생성을 선택합니다.
프로젝트 이름을 입력하고 소스 코드 리포지토리에 대한 연결을 구성합니다. 이 예제에서는 GitHub를 사용합니다. CodeBuild는 GitLab과 BitBucket도 지원합니다. 설명서에는 지원되는 소스 코드 리포지토리의 최신 목록이 있습니다.
프로비저닝 모델의 경우 예약 용량을 선택합니다. 이 모델은 Amazon EC2 Mac 인스턴스를 사용할 수 있는 유일한 모델입니다. 아직 플릿을 정의하지 않았으므로 빌드 프로젝트를 생성하면서 바로 플릿을 생성하겠습니다. 그런 다음 플릿 생성을 선택합니다.
컴퓨팅 플릿 구성 페이지에서 컴퓨팅 플릿 이름을 입력하고 macOS를 운영 체제로 선택합니다. 컴퓨팅에서 빌드 프로젝트에 필요한 메모리 양과 vCPU 수량, 용량에서 원하는 인스턴스 수를 선택합니다.
이 예제에서는 관리되는 이미지를 사용하겠습니다. 여기에는 Xcode 15.4와 iOS 17.5용 시뮬레이터 런타임 등의 패키지가 포함되어 있습니다. 설명서에서 이 이미지에 사전 설치된 패키지 목록을 읽을 수 있습니다.
작업을 마치면 플릿 생성을 선택하여 CodeBuild 프로젝트 생성 페이지로 돌아갑니다.
다음 단계로 CodeBuild에 새 서비스 역할을 생성하여 빌드 환경에 대해 원하는 권한을 정의하도록 지시합니다. 이 프로젝트의 맥락에서 Amplify 구성을 가져오고 AWS Secrets Manager에 액세스할 수 있는 권한을 포함해야 합니다. 단계별 안내를 공유하지는 않을 것이지만 샘플 프로젝트 코드에 제가 추가한 권한의 목록이 포함되어 있습니다.
프로젝트 정의에 빌드 명령 세트를 제공할지 또는 프로젝트에 포함된 buildspec.yaml
파일에 제공할지 선택할 수 있습니다. 저는 후자를 선택합니다.
선택 사항이지만 각 빌드를 보관할 수 있는 S3 버킷에 빌드 아티팩트를 업로드하려고 합니다. 따라서 아티팩트 1 – 프라이머리 섹션에서 유형으로 Amazon S3를 선택하고 버킷 이름 및 아티팩트 이름을 입력합니다. 업로드할 파일 이름은 buildspec.yaml
파일에 지정되어 있습니다.
페이지 아래쪽에서 GitHub WebHook을 추가하도록 프로젝트 트리거를 구성합니다. 이렇게 하면 GitHub에서 내 프로젝트에 커밋 또는 풀 요청이 전송될 때마다 빌드를 시작하도록 CodeBuild가 구성됩니다.
마지막으로 페이지 하단에 있는 오렌지색 프로젝트 만들기 버튼을 선택하여 이 프로젝트를 만듭니다.
빌드 테스트
제 프로젝트에는 빌드를 준비하고, 프로젝트를 빌드하고, 테스트를 실행하고, Apple의 TestFlight에 배포하기 위한 빌드 스크립트가 이미 포함되어 있습니다.
기존 스크립트를 오케스트레이션하기 위해 프로젝트의 루트에 buildspec.yaml
파일을 추가합니다.
version: 0.2
phases:
install:
commands:
- code/ci_actions/00_install_rosetta.sh
pre_build:
commands:
- code/ci_actions/01_keychain.sh
- code/ci_actions/02_amplify.sh
build:
commands:
- code/ci_actions/03_build.sh
- code/ci_actions/04_local_tests.sh
post_build:
commands:
- code/ci_actions/06_deploy_testflight.sh
- code/ci_actions/07_cleanup.sh
artifacts:
name: $(date +%Y-%m-%d)-getting-started.ipa
files:
- 'getting started.ipa'
base-directory: 'code/build-release'
이 파일을 Git 리포지토리에 추가하고 git commit -am "add buildpsec" buildpec.yaml
명령을 사용하여 GitHub에 푸시합니다.
콘솔에서 빌드가 시작된 것을 볼 수 있습니다.
빌드를 선택하면 로그 파일을 보거나 단계 세부 정보를 선택하여 빌드의 각 단계에 대한 개략적인 상태를 확인할 수 있습니다.
빌드가 성공하면 iOS 애플리케이션 IPA 파일이 S3 버킷에 업로드된 것을 볼 수 있습니다.
CodeBuild의 마지막 빌드 스크립트가 바이너리를 App Store Connect에 업로드합니다. App Store Connect의 TestFlight 섹션에서 새 빌드를 볼 수 있습니다.
알아야 할 사항
Amazon EC2 Mac 인스턴스를 준비하고 첫 빌드를 수락하는 데 8~10분 정도 소요됩니다. 이는 CodeBuild에만 국한되지 않습니다. 머신 준비 시간 동안 제출한 빌드는 대기열에 추가되며 머신을 사용할 수 있게 되는 즉시 순서대로 실행됩니다.
macOS용 CodeBuild는 예약된 플릿과 함께 작동합니다. 빌드의 분당 요금을 지불하는 온디맨드 플릿과 달리, 예약된 플릿은 빌드가 실행되지 않는 경우에도 빌드 머신이 사용자 전용으로 예약된 시간에 대해 요금이 부과됩니다. 용량 예약은 macOS용 소프트웨어 라이선스 계약(3.A.ii조)에서 요구하는 Amazon EC2 Mac 24시간 최소 할당 기간을 따릅니다.
AWS 계정의 CodeBuild 프로젝트 전체에서 여러 머신을 공유할 수 있습니다. 플릿에 있는 기계는 사용자 전용으로 예약되어 있습니다. CodeBuild만 머신에 액세스할 수 있습니다.
CodeBuild는 빌드 간 작업 디렉터리를 지우지만 머신은 다른 빌드에 재사용됩니다. 그러면 CodeBuild 로컬 캐시 메커니즘을 사용하여 빌드 후 선택한 파일을 빠르게 복원할 수 있습니다. 동일한 플릿에서 다른 프로젝트를 빌드하는 경우 새 빌드를 시작하기 전에 macOS 키체인과 같은 글로벌 상태와 SwiftPM 및 Xcode 패키지 캐시와 같은 빌드 아티팩트를 모두 재설정해야 합니다.
사용자 지정 빌드 이미지로 작업할 때는 64비트 Mac-Arm 아키텍처용으로 빌드해야 합니다. 또한 AWS Systems Manager Agent(SSM Agent)를 설치하고 시작해야 합니다. CodeBuild는 SSM 에이전트를 사용하여 자체 에이전트를 설치하고 머신을 관리합니다. 마지막으로, CodeBuild 조직 ARN에서 AMI를 사용할 수 있는지 확인합니다.
macOS용 CodeBuild는 미국 동부(오하이오, 버지니아 북부), 미국 서부(오리건), 아시아 태평양(시드니), 유럽(프랑크푸르트) AWS 리전에서 사용할 수 있습니다. 이러한 리전은 Amazon EC2 Mac M2 인스턴스를 제공하는 리전과 동일합니다.
지금 바로 시작하여 macOS에서 첫 번째 CodeBuild 프로젝트를 생성하세요.