π³ Build anything via containers - build container images or standalone artifacts (eg binaries, packages, arbitrary files)
π Programming language agnostic - allows use of language-specific build tooling
β»οΈ Reproducible builds - does not depend on user's local installation. Runs the same locally, as in CI
β Parallelism that just works - builds in parallel without special considerations the user has to make
π Mono-repo friendly - ability to split the build definitions across a vast directory hierarchy
π Multi-repo friendly - ability to import builds or artifacts from other repositories
Earthly is a build automation tool from the same era as your code. It allows you to execute all your builds in containers. This makes them self-contained, reproducible, portable and parallel. You can use Earthly to create Docker images and artifacts (eg binaries, packages, arbitrary files).
Earthly can run on top of popular CI systems (like Jenkins, Circle, GitHub Actions). It is typically the layer between language-specific tooling (like maven, gradle, npm, pip, go build) and the CI build spec.
Read the launch blog post for the motivation behind Earthly. To learn how to use Earthly, check out the getting started guide.
For some examples, see Go, Java, JS, Mono-repo, Multi-repo, Earthly's own build or the examples dir.
sudo /bin/sh -c 'curl -s https://api.github.com/repos/earthly/earthly/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d : -f 2- | tr -d \" | wget -P /usr/local/bin/ -i - && mv /usr/local/bin/earth-linux-amd64 /usr/local/bin/earth && chmod +x /usr/local/bin/earth'
brew install earthly
curl -s https://api.github.com/repos/earthly/earthly/releases/latest | grep browser_download_url | grep darwin-amd64 | cut -d : -f 2- | tr -d \" | wget -P /usr/local/bin/ -i - && mv /usr/local/bin/earth-darwin-amd64 /usr/local/bin/earth && chmod +x /usr/local/bin/earth
You may also download the binary from the releases page and place it in your bin
.
Windows native version coming soon. The linux version has been reported to just work on WSL [experimental].
If you use SSH-based git authentication, then your git credentials will just work with Earthly. Read more about git auth.
Add Earthfile Syntax Highlighting to VS Code.
ext install earthly.earthfile-syntax-highlighting
# Initialize the build environment - this applies to all targets.
FROM golang:1.13-alpine3.11
WORKDIR /go-example
build:
# Copy source from local dir into the build environment,
# run go build and save the resulting binary.
COPY main.go .
RUN go build -o build/go-example main.go
SAVE ARTIFACT build/go-example AS LOCAL build/go-example
docker:
# Copy an artifact from target +build,
# set an entrypoint for the image and save it.
COPY +build/go-example .
ENTRYPOINT ["/go-example/go-example"]
SAVE IMAGE go-example:latest
Invoke the build using either earth +build
(to build the binary) or earth +docker
(to build the docker image).
build:
# Build the target lint (defined in the same build.earth file).
BUILD +lint
# Inherit image from target +some-image available in ./some/deep/dir.
FROM ./some/deep/dir+some-image
# Execute the build of project github.com/some-user/some-project, with
# the target +some-binary, copying the artifact out.
COPY github.com/some-user/some-project+some-binary/out ./
# Execute the build within the local directory ./some/deep/dir, with
# the target +my-binary, copying the artifact bin.
COPY ./some/deep/dir+my-binary/bin ./
lint:
# ...
The container isolation prevents use of any resources specific to the local system. This allows Earthly to completely parallelize the building of independent targets, without any additional effort.
a-target:
# Something complex and time-consuming.
another-target:
# Something else complex and time-consuming.
final-target:
# This will build the two targets in parallel.
BUILD +a-target
BUILD +another-target
# So would this.
COPY +a-target/an-artifact ./
COPY +another-target/another-artifact ./
# And so would this (or some other combination).
FROM +a-target
COPY +another-target/another-artifact ./
Interleaved output shows execution of targets in parallel
If some artifacts or images succeed, but others fail, the system does not ouptut any of them. It also does not push partial results to registries or artifactories (unless the pushing operation itself fails).
Outputting only takes place below the === SUCCESS ===
line
... in fact, the same technology is used underneath.
The build picks up from the point it notices a difference in the code
lint:
FROM golang:1.13-alpine3.11
RUN go get golang.org/x/lint/golint
ARG COPY_SRC
COPY "$COPY_SRC" ./
RUN golint -set_exit_status .
lint-project-a:
BUILD --build-arg COPY_SRC=./project-a +lint
lint-project-b:
BUILD --build-arg COPY_SRC=./project-b +lint
Secrets are never stored within an image's layers and they are only available to the commands that need them.
some-target:
RUN --push --secret GITHUB_TOKEN=+secrets/GITHUB_TOKEN github-release upload file.bin
earth --secret GITHUB_TOKEN --push +some-target
Write your own build.earth
file, then build any target via
earth +target-name
You can also reference targets from other directories.
earth ./path/to/a/deep/dir+target-name
... or from other repositories.
# Try it yourself! No need to clone.
earth github.com/earthly/earthly+earth-docker
... or from a subdir of some repository.
# Try it yourself! No need to clone.
earth github.com/earthly/earthly/buildkitd+buildkitd
For more details on using the earth
command, see earth --help
.
Allows the classical syntax, as well as the additional
FROM +some-target
syntax, which allows target inheritance.
Allows the classical syntax for copying files from the build context, as well as the additional
COPY +some-target/artifact-name ./dest/path
syntax, which allows copying artifacts resulting from another target.
Behaves more like
cp -r
(copies the directories themselves, not just the contents).
Allows running with a secret as an env var. The secret is not stored in the image's layers and is only available to that command.
Runs the entrypoint of the image (useful when inheriting other targets, in order to run the images as part of the build).
Defines a push command. It never uses cache and only executes if the rest of the build succeeds. Useful for triggering state change in remote environments (eg production) or for pushing artifacts to artifactories.
Builds another target as part of the execution.
Builds another target, with specified value for a build arg. The
--build-arg
flag is also available forFROM +target
andCOPY +target/artifact
commands.
Builds another target, with a build arg value specified as the output of a command.
Saves an artifact for later use. It is stored as a target artifact, to be used by other targets (
/artifact-name
) and optionally, as a local file which will be written to the host system at./local/artifact/path
.
Saves the current target as an image. It can be used by other targets and also, optionally made available to the local system as docker image name
image/name:tag
.
Similar to above, but it additionally pushes the image to the image registry.
GIT CLONE [email protected]:some-user/some-project.git dest-dir
Clones the git project into directory
dest-dir
. The difference from doingRUN git clone ...
is that it is cache-aware, thus building again when the git hash is different.
Allows running commands in the presence of a docker daemon, as part of the build. The main use-case for this is running complex integration tests where several containers need to be running in parallel.
Allows pulling a remote image into the context of the build. (Can then run the image via
RUN --with-docker docker run some-image
). This command is cache-aware compared toRUN --with-docker docker pull some-image
.
Allows using an Earthly target as a docker image loaded into the context of the build.
For more details see the Earthfile reference.
To learn more about using Earthly, check the full documentation, which includes
Check out the Earthfile reference doc page. It has all the commands there and it specifies which commands are the same as Dockerfile commands and which are new. A summary of the differences are also shown above here.
It cannot - however, translating Dockerfiles to Earthfiles (build.earth
) is usually a matter of copy-pasting and making small adjustments. See the getting started page for some Earthfile examples.
- Please report bugs as GitHub issues.
- Join us on Gitter!
- Questions via GitHub issues are welcome!
- PRs welcome! But please give a heads-up in GitHub issue before starting work. If there is no GitHub issue for what you want to do, please create one.
- To build from source, you will need the
earth
binary (Earthly builds itself). Git clone the code and runearth +all
.
Earthly is licensed under the Mozilla Public License Version 2.0. See LICENSE for the full license text.