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 최적화랑 같은 원리네요. 수정하겠습니다."