🔧 DevOps

Earthly

컨테이너 기반 빌드 자동화 도구

상세 설명

Earthly는 컨테이너 기반의 빌드 자동화 도구로, Dockerfile과 Makefile의 장점을 결합했습니다. 빌드를 컨테이너 안에서 실행하여 "내 컴퓨터에서는 되는데" 문제를 해결하고, 로컬과 CI 환경에서 동일한 결과를 보장합니다.

Earthfile이라는 설정 파일을 사용하며, 문법은 Dockerfile과 유사하지만 타겟(target) 개념으로 빌드 단계를 구조화합니다. 각 타겟은 의존성을 가질 수 있어서 복잡한 빌드 워크플로우를 선언적으로 표현합니다.

강력한 캐싱 시스템이 특징입니다. 입력 파일이 변경되지 않으면 이전 빌드 결과를 재사용하고, 리모트 캐시를 통해 팀원 간 빌드 캐시를 공유할 수 있어 CI 빌드 시간을 크게 단축합니다.

모노레포(monorepo) 환경에서 특히 유용합니다. 여러 서비스의 빌드를 하나의 Earthfile로 관리하고, 변경된 부분만 선택적으로 빌드할 수 있습니다. GitHub Actions, GitLab CI 등 모든 CI 시스템과 통합됩니다.

코드 예제

# Earthfile - 모노레포 빌드 설정
VERSION 0.7

# 공통 베이스 이미지
base:
    FROM node:20-alpine
    WORKDIR /app
    RUN apk add --no-cache python3 make g++

# 프론트엔드 빌드
frontend:
    FROM +base
    COPY frontend/package*.json ./frontend/
    RUN cd frontend && npm ci
    COPY frontend ./frontend
    RUN cd frontend && npm run build
    SAVE ARTIFACT frontend/dist AS LOCAL ./frontend/dist

# 백엔드 빌드
backend:
    FROM +base
    COPY backend/package*.json ./backend/
    RUN cd backend && npm ci --only=production
    COPY backend ./backend
    RUN cd backend && npm run build
    SAVE ARTIFACT backend/dist AS LOCAL ./backend/dist

# 통합 테스트
integration-test:
    FROM +base
    COPY +frontend/dist ./frontend/dist
    COPY +backend/dist ./backend/dist
    COPY tests ./tests
    WITH DOCKER --compose docker-compose.test.yml
        RUN npm run test:integration
    END

# Docker 이미지 빌드
docker:
    FROM node:20-alpine
    WORKDIR /app
    COPY +backend/dist ./dist
    COPY +backend/node_modules ./node_modules
    EXPOSE 3000
    CMD ["node", "dist/main.js"]
    SAVE IMAGE --push myregistry/myapp:latest

# 전체 빌드
all:
    BUILD +frontend
    BUILD +backend
    BUILD +integration-test
    BUILD +docker

실무에서 이렇게 말해요

시니어: "CI 빌드가 20분이나 걸려. Earthly로 바꾸고 리모트 캐시 설정하면 많이 빨라질 거야."

주니어: "로컬에서 빌드한 캐시를 CI에서도 쓸 수 있나요?"

시니어: "응, S3나 GCS에 캐시 저장해두면 팀원 모두가 공유해. 첫 빌드 빼고는 5분 이내로 끝나."

면접관: "모노레포에서 빌드 시간을 줄이기 위해 어떤 전략을 사용하셨나요?"

지원자: "Earthly를 도입해서 빌드 캐시를 팀 전체가 공유하고, 변경된 서비스만 선택적으로 빌드했습니다. 평균 빌드 시간이 15분에서 3분으로 줄었습니다."

리뷰어: "이 타겟 COPY가 너무 넓어요. src만 복사하면 package.json 변경 없을 때 npm install 캐시 타요."

개발자: "아, Dockerfile 최적화랑 같은 원리네요. 수정하겠습니다."

주의사항

더 배우기