Home

Earthly#

Ist ein Buildtool welches Container nutzt, um die Toolchain bereit zustellen. Verschiedene Targets werden über ein sogennates Earthfile deklariert. Erinnern tut earthly dabei, an klassiche Makefiles.

Der große Vorteil an earthly ist die Portabilität. Man kann seine CI-Pipeline lokal zusammenbauen und erhält bei Runs enau die gleichen Ergebnisse wie im Gitlab.

Ein einziges Target, welches Python-Skripte auf ihre Richtigkeit testet, kann beispielsweise so aussehen:

syntax-python:
    FROM python:3.12.3 # pullt python-image
    WORKDIR /src
    COPY --dir my/project/path container/path
    COPY some/other/dir/*.py container/path

    RUN find ./path -name "*.py" | xargs -t -P4 -n1 python3 -m py_compile

Zusammen mit anderen Targets, kann dieses verkettet werden.

test-all:
    BUILD +syntax-go
    BUILD +syntax-python
    BUILD +syntax-bash
    BUILD +test-database

SAVE ARTIFACT LOCALLY#

Dieses Kommando wird nur Dateien ins Host-Filesystem ausgeben, wenn die --ci-Flag nicht mitgegeben wurde (--help um zu erfahren was sie impliziert).

SAVE ARTIFACT#

Möchte man Artifacts aus einem anderen Target importieren, kann man das wie folgt tun.

target:
  COPY +download-hugo/<articfact> /path/to/copy/to
  
  COPY +download-hugo/hugo /usr/local/bin/hugo
  COPY +download-tailwindcss/tailwindcss /usr/local/bin/tailwindcss

.secrets#

For deploying from your local machine, you need your secrets present in a .secrets file. That must be located in the same directory as the Earthfile. For multi-line secrets use '' like in the following example:

host=192.168.13.12
port=1337
username=secret-username
key='-----BEGIN OPENSSH PRIVATE KEY-----
SOMEVALIDCHARACTERSWHICHMAKEUP
AVERYGOODSECRETANDSAFEPRIVATEK
-----END OPENSSH PRIVATE KEY-----'
known_hosts='content-of-the-known-hosts-file'

The '' are needed because they keep the format (like newlines etc).

Errors#

Error: could not determine buildkit address - is Docker or Podman running?#

If you encounter this error, first look if the systemd-service is running.

systemctl status docker.service

If it is, you/Earthly probably don’t have sufficient rights to call docker. You can test this, by manually calling docker without sudo/doas.

docker ps -a
# Output:
# permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
# Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.46/containers/json?all=1": 
# dial unix /var/run/docker.sock: connect: permission denied

The solution to this problem, is to add your user-group to the docker group.

sudo usermod -aG docker <username>

failed to stat parent: stat /tmp/earthly/buildkit/runc-overlayfs/snapshots/snapshots/2006/fs: no such file or directory#

Something with the cache was wrong. I resolved the issue with: earthly prune -a which cleared the cache.

More on how to manage the cache: