Skip to content

Instantly share code, notes, and snippets.

@Kesin11
Created May 4, 2021 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kesin11/bb660734b871c04c8df400b32ea97282 to your computer and use it in GitHub Desktop.
Save Kesin11/bb660734b871c04c8df400b32ea97282 to your computer and use it in GitHub Desktop.
Earthly.devを試してみた

Earthlyを試してみた

https://earthly.dev/

結論としては、Bazel、Gradleに比べれば圧倒的に低い学習コストでmakeより現代的なビルドツールとして筋は悪くない印象。 現代的と感じた機能

  • DSLのベースがDockerfile + Makefileなのでかなりとっつきやすい
  • ビルド環境がホストマシンから隔離されている(dockerの中でビルドすることで実現している)
    • それでありながらビルドしたファイルをホストマシンにコピーするのもとても簡単
  • Dockerイメージの書き出しにネイティブで対応している
    • ビルド自体をdockerの中で行っているので、ビルド後の状態をそのままイメージとして書き出すだけで実現できてる
    • BazelはDockerイメージを生成するためにまた別のプラグイン的なものを導入する必要があるのに比べると雲泥の学習コスト
  • dockerのlayer cacheの仕組みをビルドキャッシュとして活用している
    • どういう場合にキャッシュが再利用できるのか、破棄されるのかの仕組みがDockerfileと一緒なので非常にわかりやすい
  • dockerイメージをリモートキャッシュとして活用している
    • ビルドキャッシュ=dockerイメージをdockerレジストリにpushできる
    • CI環境やチームメイトがビルドするときにはpushされたイメージをリモートキャッシュとして活用できる
    • Bazel、Gradleはリモートキャッシュ機能を使うためにS3やGCSのセットアップ、認証が必要だったのに対してdockerのレジストリで済むので楽

全体的に好印象なツールだったが、そもそも個人開発OSSの規模だとビルド環境をホストマシンから完全に隔離したいとか、キャッシュを効かせないとビルドにものすごい時間がかかるなどの問題がないので旨味が少ない。 逆に、monorepoでチーム開発をしていてMakefileが必要な規模のビルドの複雑さ、ローカルのビルドとdocker buildで2重にビルド時間がかかっているなどの問題がある場合には向いているツールかもしれない。

せっかく試したので、自分のOSSのDockerfileとほぼ等価な結果になるEarthfileまで作ったので供養として置いておきます。

# TypeScript build
FROM node:14-slim
WORKDIR /build
deps:
COPY package.json package-lock.json ./
RUN npm install
# Output these back in case npm install changes them.
SAVE ARTIFACT package.json AS LOCAL ./package.json
SAVE ARTIFACT package-lock.json AS LOCAL ./package-lock.json
build:
FROM +deps
COPY --dir src tsconfig.json ./
RUN npm run clean && npm run build
SAVE ARTIFACT dist /dist AS LOCAL ./dist
test:
FROM +deps
COPY --dir src tsconfig.json ./
COPY --dir __tests__ jest.config.js bigquery_schema ./
RUN npm run test
SAVE ARTIFACT junit /junit AS LOCAL ./junit
docker:
FROM node:14-alpine
WORKDIR /ci_analyzer
# Resolve nodejs pid=1 problem
RUN apk add --no-cache tini
# Download dependencies
COPY package.json package-lock.json ./
RUN npm ci --production && rm -rf ~/.npm
COPY . .
COPY +build/dist ./dist
# Make "ci_analyzer" command alias
RUN cd dist && ln -s index.js ci_analyzer && chmod +x ci_analyzer
ENV PATH=/ci_analyzer/dist:$PATH
ENTRYPOINT [ "/sbin/tini", "--", "node", "/ci_analyzer/dist/index.js" ]
WORKDIR /app
SAVE IMAGE --push ghcr.io/kesin11/ci_analyzer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment