diff --git a/README.md b/README.md index 05e19168..fea1aebb 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ | `a-perfect-shell` | ✅ | ✅ | ✅ | An opinionated shell environment | | `direnv` | | | | | | **Applications:** | +| `dagger` | ✅ | ✅ | ✅ | Dagger - write your pipelines in Go/Python/Typescript | | `1password` | ✅ | ✅ | ✅ | 1Password + a simple shell helper | | `nginx` | ✅ | ✅ | ✅ | A HTTP web server and much more... | | `jupyterlab` | ✅ | ✅ | ✅ | Jupyter Lab notebook | diff --git a/dagger/.flox/.gitignore b/dagger/.flox/.gitignore new file mode 100644 index 00000000..15d71a16 --- /dev/null +++ b/dagger/.flox/.gitignore @@ -0,0 +1,4 @@ +run/ +cache/ +lib/ +log/ diff --git a/dagger/.flox/env.json b/dagger/.flox/env.json new file mode 100644 index 00000000..34ea929b --- /dev/null +++ b/dagger/.flox/env.json @@ -0,0 +1,4 @@ +{ + "name": "dagger", + "version": 1 +} \ No newline at end of file diff --git a/dagger/.flox/env/manifest.lock b/dagger/.flox/env/manifest.lock new file mode 100644 index 00000000..bca8e725 --- /dev/null +++ b/dagger/.flox/env/manifest.lock @@ -0,0 +1,540 @@ +{ + "lockfile-version": 1, + "manifest": { + "version": 1, + "install": { + "coreutils": { + "pkg-path": "coreutils" + }, + "dagger": { + "flake": "github:dagger/nix#dagger" + }, + "jq": { + "pkg-path": "jq" + }, + "which": { + "pkg-path": "which" + } + }, + "vars": { + "DO_NOT_TRACK": "1", + "GOAWAY": "1", + "NOTHANKS": "1" + }, + "hook": { + "on-activate": "\n# Check that docker is running using `docker info`\nif ! docker info > /dev/null 2>&1; then\n echo \"❌ Docker is not running. Please start Docker and try again.\"\n exit 1\nfi\n\nexport DAGGER_HOME=\"$FLOX_ENV_CACHE/dagger\"\nexport DAGGER_ENGINE_CONFIG=\"$DAGGER_HOME/engine.toml\"\nexport DAGGER_CERTS_DIR=\"$DAGGER_HOME/certs\"\n\nexport DAGGER_VERSION=$(dagger version | cut -d 'v' -f 2 | cut -d ' ' -f 1)\nexport DAGGER_ENGINE_IMAGE=\"registry.dagger.io/engine:v$DAGGER_VERSION\"\nexport DAGGER_ENGINE_NAME=\"flox-dagger-engine-v$DAGGER_VERSION\"\n\nexport _EXPERIMENTAL_DAGGER_RUNNER_HOST=\"docker-container://$DAGGER_ENGINE_NAME\"\nexport _EXPERIMENTAL_DAGGER_CLI_BIN=\"$(which dagger)\"\n\nmkdir -p \"$DAGGER_HOME\"\n\n# XXX: Write dagger engine config below\n# -> https://docs.dagger.io/configuration/custom-runner\n# -> https://docs.dagger.io/configuration/custom-registry\n# -> https://docs.dagger.io/configuration/custom-ca\n# -> https://docs.dagger.io/configuration/proxy\nif [ ! -f \"$DAGGER_ENGINE_CONFIG\" ]; then\ncat > \"$DAGGER_ENGINE_CONFIG\" < https://dagger.cloud/traces/setup +# DAGGER_CLOUD_TOKEN = "your-token-here" + +# XXX: Set GOPROXY to your private proxy +# GOPROXY = "" + +DO_NOT_TRACK = "1" # disable dagger metrics +NOTHANKS = "1" # disable dagger cloud +GOAWAY = "1" # disable dagger traces + +[hook] +on-activate = ''' + +# Check that docker is running using `docker info` +if ! docker info > /dev/null 2>&1; then + echo "❌ Docker is not running. Please start Docker and try again." + exit 1 +fi + +export DAGGER_HOME="$FLOX_ENV_CACHE/dagger" +export DAGGER_ENGINE_CONFIG="$DAGGER_HOME/engine.toml" +export DAGGER_CERTS_DIR="$DAGGER_HOME/certs" + +export DAGGER_VERSION=$(dagger version | cut -d 'v' -f 2 | cut -d ' ' -f 1) +export DAGGER_ENGINE_IMAGE="registry.dagger.io/engine:v$DAGGER_VERSION" +export DAGGER_ENGINE_NAME="flox-dagger-engine-v$DAGGER_VERSION" + +export _EXPERIMENTAL_DAGGER_RUNNER_HOST="docker-container://$DAGGER_ENGINE_NAME" +export _EXPERIMENTAL_DAGGER_CLI_BIN="$(which dagger)" + +mkdir -p "$DAGGER_HOME" + +# XXX: Write dagger engine config below +# -> https://docs.dagger.io/configuration/custom-runner +# -> https://docs.dagger.io/configuration/custom-registry +# -> https://docs.dagger.io/configuration/custom-ca +# -> https://docs.dagger.io/configuration/proxy +if [ ! -f "$DAGGER_ENGINE_CONFIG" ]; then +cat > "$DAGGER_ENGINE_CONFIG" < go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 + +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 + +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 diff --git a/dagger/go.sum b/dagger/go.sum new file mode 100644 index 00000000..5d11ef81 --- /dev/null +++ b/dagger/go.sum @@ -0,0 +1,83 @@ +github.com/99designs/gqlgen v0.17.63 h1:HCdaYDPd9HqUXRchEvmE3EFzELRwLlaJ8DBuyC8Cqto= +github.com/99designs/gqlgen v0.17.63/go.mod h1:sVCM2iwIZisJjTI/DEC3fpH+HFgxY1496ZJ+jbT9IjA= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vektah/gqlparser/v2 v2.5.21 h1:Zw1rG2dr1pRR4wqwbVq4d6+xk2f4ut/yo+hwr4QjE08= +github.com/vektah/gqlparser/v2 v2.5.21/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/dagger/main.go b/dagger/main.go new file mode 100644 index 00000000..44b2b899 --- /dev/null +++ b/dagger/main.go @@ -0,0 +1,37 @@ +// A generated module for Dagger functions +// +// This module has been generated via dagger init and serves as a reference to +// basic module structure as you get started with Dagger. +// +// Two functions have been pre-created. You can modify, delete, or add to them, +// as needed. They demonstrate usage of arguments and return types using simple +// echo and grep commands. The functions can be called from the dagger CLI or +// from one of the SDKs. +// +// The first line in this comment block is a short description line and the +// rest is a long description with more detail on the module's purpose or usage, +// if appropriate. All modules should have a short description. + +package main + +import ( + "context" + "dagger/dagger/internal/dagger" +) + +type Dagger struct{} + +// Returns a container that echoes whatever string argument is provided +func (m *Dagger) ContainerEcho(stringArg string) *dagger.Container { + return dag.Container().From("alpine:latest").WithExec([]string{"echo", stringArg}) +} + +// Returns lines that match a pattern in the files of the provided Directory +func (m *Dagger) GrepDir(ctx context.Context, directoryArg *dagger.Directory, pattern string) (string, error) { + return dag.Container(). + From("alpine:latest"). + WithMountedDirectory("/mnt", directoryArg). + WithWorkdir("/mnt"). + WithExec([]string{"grep", "-R", pattern, "."}). + Stdout(ctx) +} diff --git a/dagger/test.sh b/dagger/test.sh new file mode 100755 index 00000000..ffa2b3f3 --- /dev/null +++ b/dagger/test.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +set -eo pipefail + +command_exists() { + if ! command -v $1 2>&1 >/dev/null; then + echo "Error: '$1' command could not be found." + return 1 + fi + echo ">>> '$1' command exists" +} + +command_exists dagger + +is_dagger_engine_up() { + if [ "$( docker container inspect -f '{{.State.Running}}' $DAGGER_ENGINE_NAME)" = "true" ]; then + return 0 + else + return 1 + fi +} + +echo -n ">>> Waiting for Dagger Engine to start (it make take some time) .." +MAX_ATTEMPTS=300 # 5min in case it needs to download the image +until is_dagger_engine_up; do + if [ $MAX_ATTEMPTS -le 0 ]; then + echo -n "Ran out of attempts!" + echo "❌ Error: Dagger Engine didn't come up in time." + exit 1 + fi + echo -n "." + sleep 1 + MAX_ATTEMPTS=$((MAX_ATTEMPTS - 1)) +done +echo -n " ✅ IS UP!\n" + +echo ">>> flox services status" +flox services status + +echo ">>> flox services logs dagger-engine" +flox services logs dagger-engine + +dagger call container-echo --string-arg="WORKS" stdout +echo ">>> Dagger works" diff --git a/flake.nix b/flake.nix index 329d0e33..d80e0f41 100644 --- a/flake.nix +++ b/flake.nix @@ -40,15 +40,17 @@ export LC_TIME="C" export LC_ALL= + mkdir -p /tmp/floxenvs # copy self/nb into temp dir - export TESTDIR="$(mktemp -d --suffix floxenvs-${name}-example)" + export TESTDIR="$(mktemp --directory --tmpdir=/tmp/floxenvs --suffix floxenvs-${name}-example)" + chmod g=rwx "$TESTDIR" cp -R ${path}/* $TESTDIR cp -R ${path}/.flox* $TESTDIR if [ -f ${path}/.env ]; then cp -R ${path}/.env $TESTDIR fi chown -R $(whoami) $TESTDIR/.flox* - chmod -R +w $TESTDIR/.flox* + chmod -R a+w,g+rw $TESTDIR/.flox* # switch to root for the test cd $TESTDIR