CI/CD 파이프라인에서 Docker 컨테이너를 사용하는 것에는 많은 이점이 있습니다, 특히 데이터베이스와 같은 stateful 시스템에 대해 그렇습니다. 예를 들어, 통합 테스트를 실행할 때마다 각 CI 작업은 깨끗한 상태의 격리된 컨테이너에서 데이터베이스를 시작하여 테스트 간 충돌을 방지합니다. 이로써 신뢰할 수 있고 일관되며 비용 효율적인 테스트 환경이 구축됩니다. 이 접근 방식은 또한 지연 시간을 줄이고 CI/CD 파이프라인 전반적인 성능을 향상시키는데 도움이 됩니다. 데이터베이스가 로컬에서 접근 가능하기 때문입니다.
리눅스 기반의 Azure Cosmos DB 에뮬레이터는 Docker 컨테이너로 제공되며 Apple Silicon과 같은 ARM64 아키텍처를 포함한 다양한 플랫폼에서 실행할 수 있습니다. Azure 구독 없이도 로컬 개발 및 애플리케이션 테스트를 수행할 수 있으며 서비스 비용을 발생시키지 않습니다. 쉽게 Docker 컨테이너로 실행하여 로컬 개발 및 테스트에 활용할 수 있습니다:
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
GitHub Actions로 Azure Cosmos DB 사용
Azure Cosmos DB 에뮬레이터를 사용하는 방법을 더 잘 이해하기 위한 예시를 살펴보겠습니다. 이를 위해 GitHub Actions과 함께 사용하는 방법을 알아봅니다. 지속적 통합 및 지속적 배포 (CI/CD) 플랫폼인 GitHub Actions 는 워크플로를 사용하여 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있습니다. 워크플로는 하나 이상의 작업을 실행할 수 있는 구성 가능한 자동화된 프로세스입니다. 이는 저장소에 체크인된 YAML 파일에 의해 정의되며 저장소의 이벤트에 의해 트리거되거나 수동으로 또는 정의된 일정에 따라 실행될 수 있습니다.
예시: .NET 애플리케이션을 위한 CI 워크플로
이 GitHub Actions 워크플로는 작업의 일부로 Azure Cosmos DB Linux 기반 에뮬레이터를 구성합니다. GitHub 는 Docker 컨테이너를 시작하고 작업이 완료되면 제거합니다 – docker run 명령을 실행할 필요가 없습니다. GitHub actions 서비스 컨테이너로 Azure Cosmos DB Linux 기반 에뮬레이터를 구성하는 것입니다.
name: .NET App CI
on:
push:
branches: [main]
paths:
- 'dotnet-app/**'
pull_request:
branches: [main]
paths:
- 'dotnet-app/**'
jobs:
build-and-test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, ubuntu-24.04-arm]
services:
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
ports:
- 8081:8081
env:
PROTOCOL: https
env:
COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Export Cosmos DB Emulator Certificate
run: |
sudo apt update && sudo apt install -y openssl
openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert
sudo cp cosmos_emulator.cert /usr/local/share/ca-certificates/
sudo update-ca-certificates
- name: Install dependencies
run: cd dotnet-app && dotnet restore
- name: Build
run: cd dotnet-app && dotnet build --no-restore
- name: Run tests
run: cd dotnet-app && dotnet test --no-build --verbosity normal
이 작업은 Ubuntu 러너에서 실행되도록 구성되어 있으며 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
도커 이미지를 서비스 컨테이너로 사용합니다. 연결 문자열, 데이터베이스 이름 및 컨테이너 이름은 환경 변수로 설정되어 있습니다. 작업이 GitHub Actions 호스팅 러너에서 직접 실행되기 때문에 “테스트 실행” 단계에서 localhost:8081
를 사용하여 에뮬레이터에 접근할 수 있습니다.
Cosmos DB 에뮬레이터 인증서 내보내기 단계는 작성 시점에서 .NET 및 Java SDK가 에뮬레이터의
HTTP
모드를 지원하지 않기 때문에 .NET(및 Java) 애플리케이션에 특화되어 있습니다.PROTOCOL
환경 변수는services
섹션에서 https로 설정되어 있으며, 이 단계는 에뮬레이터 인증서를 내보내고 이를 운영 체제의 신뢰할 수 있는 인증서 저장소에 추가합니다.
해보세요!
이 GitHub 리포지토리는 .NET, Python, Java 및 Go 애플리케이션을 위한 GitHub Actions CI 워크플로우의 일환으로 Linux 에뮬레이터를 구성하는 방법에 대한 예제를 제공합니다. 이는 x64
및 ARM64
아키텍처 모두에 대해 (Ubuntu를 사용하는 Linux 러너에서 시연됨) 보여집니다.
저장소 포크하기
GitHub 저장소로 이동하여 저장소 페이지 오른쪽 상단의 Fork 버튼을 클릭하여 GitHub 계정에 저장소의 사본을 만듭니다.
GitHub 계정에서 저장소를 열고 저장소 설정에서 워크플로우를 활성화합니다.
저장소 시크릿으로 Cosmos DB 에뮬레이터 연결 문자열 (COSMOSDB_CONNECTION_STRING
)을 추가합니다. 다음 값을 사용합니다:
AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
데이터베이스 이름 (COSMOSDB_DATABASE_NAME
)과 컨테이너 이름 (COSMOSDB_CONTAINER_NAME
)을 저장소 변수로 추가합니다:
포크한 저장소를 로컬 머신에 복제합니다 (GitHub 사용자명을 사용해야 함):
git clone https://github.com/<your-username>/cosmosdb-linux-emulator-github-actions.git
cd cosmosdb-linux-emulator-github-actions
워크플로우 트리거
워크플로우를 트리거하기 위해 코드 (.NET, Java, Python 또는 Go) 중 하나 또는 모두에 대해 작은 변경을 만들고 추가하며 변경 사항을 커밋합니다. 이해를 쉽게 하기 위해 각 언어에 대해 별도의 워크플로우를 사용합니다.
변경 사항을 GitHub의 포크한 저장소에 푸시합니다:
git add .
git commit -m "Your commit message"
git push origin main
변경 사항을 푸시한 후, GitHub Actions는 자동으로 워크플로를 실행합니다. 리포지토리의 “Actions” 탭으로 이동하여 워크플로의 상태와 결과를 확인하세요. 로그나 출력을 검토하여 워크플로가 올바르게 실행되고 있는지 확인하십시오.
GitHub Actions 러너 고려사항
이 샘플 리포지토리는 ubuntu
기반 러너(x64 및 ARM64 아키텍처용)를 보여주었습니다. 이는 Windows ARM 기반 러너에도 적용될 수 있습니다. Windows x64 러너를 고려하고 있다면, 작성 시점에 GitHub Actions 서비스 컨테이너가 비리눅스 러너에서 지원되지 않는다는 점에 유의하십시오. 그러나 Docker를 설치하고 컨테이너의 생명주기를 관리하는 단계를 추가하여 이를 우회할 수 있습니다. 여기에는 컨테이너 시작 및 중지가 포함됩니다.
마무리
앞서 언급했듯이 CI 파이프라인에서 Docker 컨테이너를 사용하는 데는 많은 이점이 있습니다. 이 경우 GitHub Actions가 CI/CD 플랫폼으로 사용되었지만 이러한 개념은 다른 솔루션에도 적용됩니다. 한 번 시도해 보시고, 여러분의 생각을 알려주세요!
Source:
https://dzone.com/articles/use-azure-cosmos-db-as-a-docker-container-in-cicd