#github-feed
1 messages · Page 19 of 1
Summary
- Replace walkObjectChecks with ModTree abstraction for traversing module trees
- Rename FnTreeNode to ModTreeNode with simplified structure
- Add support for walking arrays of objects with +check methods
- Add --all/-a flag to
dagger checkto enumerate dynamic checks - Include dynamic checks in aggregate listing even without --all
- Fix TUI display for aggregate check execution
- Add modtree path matching tests
Context
This PR adds the core infrastructure needed to support d...
Summary
- Add dynamic test enumeration to Go toolchain using
+checkdecorator - Add test splitting to engine-dev toolchain for parallel test execution
Changes
Go toolchain
Tests()returns[]*TestDirectorygrouped by directory- Each
Testhas a+checkdecoratedRun()method - Uses
Source.Search()for fast regex-based test discovery - Pre-builds container and shares across tests via
WithWorkdir()
Engine-dev toolchain
Tests()returns[]*TestDirectorywith...
Same as #11350 but that PR missed the specific case of "contextual git repo/ref that's actually a local dir".
Discord ref: https://discord.com/channels/707636530424053791/1458838030155513956
TODO:
- [ ] integ test (verified with a manual repro)
This reverts commit 79c2341d21f7499269a4667d093bb7f32e1d157d.
I saw some strange slowness in https://github.com/dagger/dagger/pull/11608 but thought it went away after re-runs. However, I did some more testing before starting the release and realized it actually is quite noticeably slower. It's hard to tell in CI since our infra is quite noisy, but my laptop is much more consistent and is consistently several minutes slower to run TestModules with the nftables change vs. without it.
...
https://github.com/dagger/dagger/pull/11608 attempted this but ended up causing perf regressions for unclear reasons. It may have resulted in CNI creation/teardown overhead that caused each container to take longer? Needs more investigation
Problem
When running 'dagger check' in a module, there is no distinction between:
a) checks meant to be run in the context of another module (by installing the current module as a toolchain)
b) checks meant to be run in the context of the current module
As a result, running 'dagger check' in a toolchain module, is likely to fail in confusing and unpredictable ways.
This complicates out-of-the-box CI for every Dagger module - because that requires a simple way to run every check on ...
Previously the unique identifier for a module was just module's git url, but that created issues in the case where we want a module to install a previous version of itself as a toolchain. This small change allows for that, plus lots more test cases.
Solves https://github.com/dagger/dagger/issues/11695
Do not merge unless we all agree we should go ahead with it!
Here's a strawman proposal that leans hard into pragmas to support sequencing and context-conditional execution.
This proposal has some controversial aspects even with me, but it seemed worth pulling on the thread and seeing how much it addresses.
In particular, I had to convince myself to press on after deciding it might be OK for functions to reference other functions in pragmas. And to press on after inventing a bit of special notation inside those pragmas. But, in the whole picture,...
Very interesting 👍
Regarding referencing functions by name or by their return type: type looks more elegant, but also more complex. You have to define a type, a specific type, that might only be used to create this link. For instance if your ship function must be run after tests to pass, the result value of test might be discarded anyway as we only want to synchronise execution, we have nothing to do with the value itself.
So in that case it means to create a type, return a value, add an...
When a user runs dagger toolchain install without a dagger module, automatically init the dagger module in the current directory.
If -m/--mod or DAGGER_MODULE is set, do not init but keep the previous behavior.
Maybe */ should become optional if users omit this too often ?
A small, low-hanging fruit optimization.
This optimization has already been done in the PHP SDK.
Both the official and community image are maintained by the same person. But the community image is almost 74Mb smaller and designed specifically for copying the binary.
https://hub.docker.com/_/composer
https://hub.docker.com/r/composer/composer
This PR adds a liveness probe in the same way we already have a readiness probe.
I've set the defaults to be more forgiving than the readiness checks.
This should help with engines that get into an unrecoverable state and need to be restarted.
Summary
This PR adds support for the checks feature to the Java SDK, bringing it to feature parity with Python, TypeScript, and Go SDKs.
Changes
- New
@Checkannotation: Marks functions as checks that can be executed for validation - Updated
FunctionInforecord: AddedisCheckfield to track check status - Updated annotation processor: Detects
@Checkannotation and generateswithCheck()call - Test module added:
hello-with-checks-javademonstrates usag...
So in that case it means to create a type, return a value, add an argument, all that for nothing.
Yeah, I agree - the arg-passing trick is neat when there is something actually worth propagating, but it's really clunky to require it for all forms of sequencing, especially if/when the values being propagated are deterministic (i.e. keyed on commit or branch) or not interesting to the target function (shipping probably doesn't care about test reports, even if you make your checks return ...
The engine logs above Debug have over time devolved to be mostly useless. Many of the Debug level logs are also not particularly helpful. This commit is a grab bag of improvements that makes Info level logs useful without being too overwhelming:
- warnings about deprecated APIs are rm'd; there's zero utility for these to be in engine logs vs client telemetry output
- "CoreModObject.ConvertFromSDKResult: got nil value" happens in expected scenarios, lowered to debug
- "collectPBDefinitions:...
This changes how arguments of type dagger.Directory get parsed by the CLI.
The old simple syntax is the default but you'll also be able to say
dagger call fn1 --path-arg "$HOME/project/p1?include=go.mod,go.sum,cmd,internal&gitignore=true"
This removes the generation of internal/telemetry and internal/querybuilder that can be installed from the local library.
Add a new flag to --generate-module to pull the libraty that matches the engine version's.
Add a new _EXPERIMENTAL_DAGGER_DEV_ENGINE to force the engine to act as a dev engine even if its tagged so we don't break engine_test files if we do some breaking changes in telemetry or querybuilder package.
Related to #11515 and #11547
Just realized +labels wouldn't be enough for preview environments, since we'd need to handle removing them too. :thinking:
Currently we handle that by looking for a unlabeled or closed event and that the PR is missing the labels:
on:
pull_request:
types:
- unlabeled
- closed
paths:
- ...
name: Cloud preview environment deleted
jobs:
add-github-pr-comment:
# add the check in case a user remove a different set of labels
...
I was thinking about some use cases, that are don't know how we should handle them.
So for instance, let's say we have a check function, defined in a toolchain. And we want to notify a system when the check is passing or failing (I'm thinking about notification and tracking, but that could be anything else). So in this case, a ship/publish function makes total sense. But we want, we need the check results.
I'm seeing different ways to achieve that:
1/ define a ship function tha...
Apparently containerd added support for igzip to decompress image layers as it's multiple times faster than pigz.
It is made by Intel and heavily uses specialized CPU instructions, but it does exist for aarch64? Not sure if the perf optimizations carry over entirely to arm yet.
Context
Dagger is great at building and running integration test harnesses. This is done in two parts:
- Execution environment: the container that will run the test code
- Service dependencies: services that the tests need to connect to while they run
Orchestrating the execution environment with Dagger is pretty straightforward: build the container on-the-fly, mount the application code, optionally build, run the test tool.
But there are several ways to orchestrate servi...
I think a good DX would look something like this:
import { render, screen, fireEvent } from '@testing-library/react';
import Counter from './Counter.jsx';
import dag from '@dagger.io/dagger';
describe('Counter Component', () => {
// Create service container
let postgres = dag().container().from('postgres:latest').asService();
// Jest beforeAll hook to start services.
// Can also do beforeEach() to start a new one for each unit in this suite
beforeAll(async ()...
Use our own dagger/pytest test integration library to run the python sdk tests. This will send telemetry for all tests that are running.
Reverting the code that was allowing to have currentEnv from a toolchain corresponding to the currentEnv of the parent module. This causes issues in ci:boostrap check, will doit differently but for now just revert that part so CI will be green again.
NOTE: this is about a change to how we test the Dagger project. It is NOT about how Dagger runs tests.
For our e2e tests, we orchestrate service dependencies outside our test code. Recently we have discussed the benefits of orchestrating service dependencies in the test code. This made us realize that, for our own project, we should switch to this technique.
Task list
Core integration tests
- [ ] Migrate test execution: from `to...
This lets you do
// +default="alpine:latest"
ctr *dagger.Container,
and
{
"function": ["testWithDefaultContainer"],
"argument": "ctr",
"default": "alpine:3.18"
}
in json.
Added lots of tests so hopefully this isn't a terrible idea.
In making this I discovered that our documentation for python constructors with complex types has been wrong all along, so I've corrected that too.
Hi! :wave:
re: "Docker API compatibility bridge", aka Dogger. The (limited) work I've done on it is here. It's worth keeping in mind that I didn't start this with just Testcontainers in mind. The goal I had was to be able to use the docker CLI from within Dagger's execution environment without having to pull down and run the Docker engine, while also taking advantage of Dagger's cache. The primary use-case I had in mind was `ki...
I recently implemented (what i understand to be) the (2) service orchestration at the client level, as one of those rare examples from the community :]
https://github.com/hofstadter-io/hof/blob/_next/lib/env/cmd/run.go
pseudo-code
all = `user selected sync points`
services = [for $item in all if $item.kind == "service"]
containers = [for $item in all if $item.kind == "container"]
for $svc in services:
$svc.up()
for $ctr in containers:
if isLast:
$ctr.terminal()
...
another one which resonates in my head is mutate. Mostly because ship in my head usually implies changing the state of something.
Another obstacle I'd identified is that docker run -p 8080:80 nginx wouldn't actually expose the container's port on localhost, but on Service.endpoint()
If you call Service.up(), the port is in fact exposed on localhost. This is strictly better than Docker/testcontainers, because Docker cannot actually guarantee what the listening hostname + ports are - testcontainers has to make educated guesses.
Bumps the sdk-java group with 8 updates in the /sdk/java directory:
| Package | From | To |
|---|---|---|
| io.smallrye:smallrye-graphql-client-api | 2.16.0 |
2.17.0 |
| io.smallrye:smallrye-graphql-client-implementation-vertx | 2.16.0 |
2.17.0 |
| io.vertx:vertx-web-client | 4.5.23 |
4.5.24 |
| com.palantir.javapoet:javapoet | 0.9.0 |
0.10.0 |
| [com.github.javaparser:javaparser-core](https... |
Bumps the sdk-typescript group in /sdk/typescript with 13 updates:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.4.0 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.4.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.210.0 |
| [@opentelemetry/sdk-metrics](https://github.com/open-t... |
Bumps the sdk-python-docker group with 1 update in the /modules/ruff/build directory: astral-sh/ruff.
Updates astral-sh/ruff from 0.14.11 to 0.14.13
Release notes
Sourced from astral-sh/ruff's releases.
0.14.13
Release Notes
Released on 2026-01-15.
This is a follow-up release to 0.14.12. Because of an issue publishing the WASM packages, there is no GitHub release or Git tag for 0.14.12, although the package was published to PyPI. The contents of the 0...
Bumps the engine group with 28 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/99designs/gqlgen | 0.17.81 |
0.17.86 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.0 |
| github.com/anthropics/anthropic-sdk-go | 1.14.0 |
1.19.0 |
| github.com/aws/aws-sdk-go-v2 | 1.39.3 |
`... |
What are you trying to do?
From https://docs.dagger.io/core-concepts/checks/. Elixir SDK required to add checks to the function to annotate that it can be run via dagger check.
Why is this important to you?
No response
How are you currently working around this?
No response
Initially the proposal SGTM. The only question that comes to my mind is if you have thought about how the UX around customizing exposed ports might be. Given that dagger up could potentially start multiple services, it could happen that those services might be trying to expose an invalid (< 1024) or overlapping ports so some sort of client-side customization will be needed here similarly to the --ports flag that dagger call $svc up has today.
@eunomie Having tried something like that in Concourse, I'm inclined to not mix the notifications use case in with ships:
- Notifications tend to be unilateral, like "alert the team when ANY function fails." In Concourse this meant copy-pasting ~6 lines of YAML on every Job, and with
@shipit seems like that would mean one@shipper@check, or a new notation like@any-check- so it starts to feel a bit forced. - A lot of the time people what notifications to be on _state transit...
If you call Service.up(), the port is in fact exposed on localhost
Right, but in the context of a "Docker API compatibility bridge", the localhost that the Service.up() gets exposed on is not the user who would have ran docker run, but the compatibility bridge's.
Had some promising but not quite fruitful trials w/ latest LLM coding models (codex 5.2-xhigh + opus 4.5) when it comes to debugging super gnarly engine issues around caching.
Seemed like one bottleneck was that it had to learn (and re-learn after context compaction) the whole codebase every time (which is often necessary for particularly tricky problems). So giving it detailed developer docs that focus it in on the parts that truly matter when debugging cache stuff may save a lot of file ...
The security:scanSource CI check fails when a newer Trivy version is available. Bump to the latest release to unblock the pipeline.
To verify the digest:
docker pull aquasec/trivy:0.68.2docker inspect aquasec/trivy:0.68.2 --format='{{index .RepoDigests 0}}'
Bumps the sdk-typescript group with 13 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.4.0 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.4.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.210.0 |
| [@opentelemetry/sdk-metrics](https://git... |
- Adds ContainerLogs method to the containerBackend interface
- Implements it for Docker and Apple container backends
- When container startup fails, fetches and displays container logs in the error message
What is the issue?
I am deploying a GitHub self-hosted actions runner on some older Nvidia Jetson hardware that uses an ARM Cortex-A57 that the software we are developing must support. Every version of the dagger cli that' I've tried panics immediately.
From the digging I've done so far the panic appears to be an issue with the github.com/wazero/wazero dependency. Updating it from 1.9.0 to 1.11.0 seems to resolve the issue when I tested against main. I unfortunately don't have the t...
Fixes #11554
Context
When from __future__ import annotations (PEP 563) is enabled, param.annotation becomes a string instead of an actual type object. This causes all metadata extraction (DefaultPath, Doc, Name, Ignore, Deprecated) to fail silently: the annotations are simply ignored.
Fix
The fix uses get_type_hints(..., include_extras=True) to resolve string annotations back to actual types while preserving Annotated metadata.
To test
dagger ...
Introduce MainModule field to Env to explicitly represent the project
being worked on, as distinct from toolchain modules. This provides a
clear semantic separation:
- MainModule: the project/context module
- installedModules: toolchain modules (via withModule, now deprecated)
Changes:
- Add MainModule field to Env struct
- Add Env.WithMainModule() method and GraphQL binding
- Update currentEnv() to use withMainModule instead of withModule
- Env.Checks() now delegates to MainModule.Checks()...
Well, I think you could have a toolchain with a notify @ship function that will run after all checks, and deals with it. So you just install the toolchain, probably add some config in the dagger.json to customize it, and that should be enough. So no copy-pasting. But more than that, notification was just one easy example, there's probably other use cases. And I'm not really sure why we should make notification a special case.
But the transition based notification looks interesting. But...
I have not, but that's a good point.
A first idea could be to add the port to the +up pragma, but that's probably wrong. We can imagine to have that in the dagger.json, the same way we are customizing checks for instance. That way it stays decoupled from the implementation of the service and is really just a host-side configuration.
But we start to have more and more things in this dagger.json and I don't know if that's a good thing.
Here's a strawman proposal that leans hard into pragmas to support sequencing and context-conditional execution.
There is an inherent limitation with using pragmas.
In our company most github workflows do the following:
- on pull request run checks and pushes concurrently, because we need to push an image for further testing regardless of unit tests passing
- on merge we push only after checks are successful
Pragmas are unconditional, so something like this becomes very tricky to d...
We haven't been maintaining these and generally do benchmarking locally for now. They cause CI to be red when triggered, so just removing for now.
@idlsoft Isn't that just a matter of setting different pragmas on different functions to handle the different configurations? Parts 1 and 2 are meant to address the fact that all these sorts of different configurations need to be supported, and at least with this proposal the idea is that you would just define different functions for them, which shouldn't be too toilsome, since they can trivially share code. (Much easier than duplicating entire GHA workflows, and IMO still better than templat...
Didn't have time for a detailed review yet... But my 2 cents: if we're going in the direction of a full-blown declarative workflow DSL built on dagger functions (not a bad idea, although the devil is in the details)... then the starting point IMO is to move that declarative config out of the function code, and into a separate layer, possibly a yaml/toml config file in the project module, or something equivalent.
A few reasons:
- If you're referencing another function from code, that ...
@idlsoft Isn't that just a matter of setting different pragmas on different functions
Well, maybe, but all the extra attributes are basically a replacement for good old if statements. Which still has value, is convenient to use, and may satisfy 90% of use cases, but is also limited.
To give another example, after pushing a docker image we post a request to an external service to scan the image, and get approval that no critical vulnerabilities were found. That's a post-push action.
...
@idlsoft
To give another example, after pushing a docker image we post a request to an external service to scan the image, and get approval that no critical vulnerabilities were found. That's a post-push action.
If you're humor me for a moment, that's just another pragma:
@ship(branches: ["@default"]) # defaults to `after: ["@checks"]`
pub publishImageAfterChecks: Void {
publishImage
}
@check(after: ["publish-image-*"]) # * to match PRs and main, or just spell ...
I suppose if dependencies between checks and ships go both ways - yes, this is a lot more flexible.
For some reason I assumed that ships can depend on checks, but not the other way around.
On a different note, it may be useful to have 3 possible outcomes instead of 2: success, failure, ignored. And, perhaps a way to consume them in the "after" functions?
- Yeah, the encoded function names were a hesitation that I also had. It would really come down to DX. If that's the cost of entry and the DX is better in every other way than the alternatives we come up with, for me it's not a dealbreaker, since it's at least using string values that we're already expecting the user to be familiar with outside of any particular codebase, in particular as a way to interact with the very functions that have these pragmas. But, it's subjective like you said.
...
I suppose if dependencies between
checksandshipsgo both ways - yes, this is a lot more flexible.
Yeah exactly. :)
On a different note, it may be useful to have 3 possible outcomes instead of 2: success, failure, ignored. And, perhaps a way to consume them in the
"after"functions?
Interested to hear more on that - what's your use case?
Interested to hear more on that - what's your use case?
It'd be similar to how in unittesting you can to skip a test under certain conditions that can only be evaluated at runtime, typically by throwing a specific exception/error.
You can then see separate counters for succeeded/failed/skipped. The distinction is important, I think.
An example... Only push an artifact if remote repository credentials were provided? idk, I'm sure there are better ones.
Also... if pragmas control co...
Couple interrelated goals here:
- Fix the root cause of the
TestConstructorflakes by more fundamentally squashing the possibility of content digest overlap resulting in cross-client cache confusion - Setup some cache key + ID changes that will be needed for the imminent removal of the buildkit solver
- Finish what I originally started in https://github.com/dagger/dagger/pull/11625 but had to partially back out of due to needing a fix ASAP
Main thing is to manage "content digests" ...
This is a rough first draft based purely on a single instance where I daggerized a particular repo. I daggerized it via prompting and then asked the LLM to create a skill out of what it learned. Likely useful enough to merge as is and iterate on.
I don't think the opinions it expresses are likely what everyone shares, but I also don't have time to get bogged down in refining details right now since this was just a quick extracurricular thing. If there's preference to not merge I'll just cl...
This is an update to the reverted https://github.com/dagger/dagger/pull/11608 which fixes the performance regression that introduced.
After investigation, the previous PR was fine except that it removed the ip6tables package.
When I run TestModule (pretty heavy integ test suite):
- With the previous PR: 7m39s
- With the previous PR but leave in ip6tables: 5m56s
These numbers are pretty consistent on my laptop, not noise.
It's not 100% clear to me yet why that is, but m...
It might be a little bit off topic, but if we think about a separate config layer, would it also make sense to include the toolchain customization that is right now inside the dagger.json?
Or should all that in fact be the equivalent of the dagger.json but maybe using a different format (like toml)? To also avoid to have multiple config files.
@eunomie That's a great point - much more interested in the config file approach from that POV, since we've already made a concession there to some extent.
@vito whether it's a @ship in a 100% reusable toolchain, or in a more project-specific toolchain, it's the same problem. It makes it impossible to break down your project's dagger functions in a set of toolchains - you have to keep a '.dagger` in your project with embedded functions, and also install toolchains when that's possible. And we have to explain all of that, navigate when to use which, etc. I don't like that UX because it's too many concepts to understand on day one. I would p...
@shykes Sorry, I don't follow - why would you need a .dagger? Wouldn't @ship functions always be defined in a toolchain, just like @check?
Or should all that in fact be the equivalent of the dagger.json but maybe using a different format (like toml)? To also avoid to have multiple config files.
As long as non-json formats are being considered, PKL may be an interesting contender. It has interesting built-in features to help avoid duplication.
This refactors/simplifies toolchain proxying. I've felt like the original proxying was too hacky, especially if we're going to lean on toolchains even more. This can all potentially go away if we solve contextual Envs (@shykes @vito ), but in the current implementation this refactor seems like a more straightforward approach
We were running all tests with -race, which means that we don't hit earlier go build cache and is generally quite slow to build. It also is not incredibly valuable in that it applies to the client side of integ tests, which isn't the main point of the integ tests.
You could see this in telemetry because there was often a large gap between the start of the withExec for go test ... and the actual start of spans for tests.
This was exacerbated by the fact that we defaulted to running go ...
This adds a private API that allows retrieving the include field of a dagger.json
Bumps the sdk-java group in /sdk/java with 2 updates: org.assertj:assertj-core and org.testng:testng.
Updates org.assertj:assertj-core from 3.27.6 to 3.27.7
Release notes
Sourced from org.assertj:assertj-core's releases.
v3.27.7
:lock: Security
Core
Fix XXE vulnerability in isXmlEqualTo assertion (CVE-2026-24400)
See GHSA-rqfh-9r24-8c9r for details; many thanks to @wxt201 and @Song-Li for responsibly repor...
Bumps the docs group with 5 updates in the /docs directory:
| Package | From | To |
|---|---|---|
| posthog-js | 1.313.0 |
1.335.2 |
| sass | 1.97.1 |
1.97.3 |
| typedoc | 0.28.15 |
0.28.16 |
| unist-util-visit | 5.0.0 |
5.1.0 |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEA... |
Bumps the sdk-typescript group with 15 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.211.0 |
| [@opentelemetry/sdk-metrics](https://git... |
Bumps the engine group with 30 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/99designs/gqlgen | 0.17.81 |
0.17.86 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| github.com/anthropics/anthropic-sdk-go | 1.14.0 |
1.19.0 |
| github.com/aws/aws-sdk-go-v2 | 1.39.3 |
`... |
Every Go module contains a bunch of boilerplate to work properly and integrate with the IDE.
A regular dagger go module is composed of the following generated files:
├── dagger.gen.go <--- module support static generation + dagger global client used in the module
├── internal
│ ├── dagger/dagger.gen.go <--- Client bindings to query the dagger engine, include core and dependencies bindings.
│ ├── querybuilder/
│ └── telemetry/
Note: querybuilder and telemetry are staticall...
This is a discussion to decide if we should get rid of defaultPath and defaultAddress to just use default for everything. We should discuss context for why things are the way they are, blockers for making the change, and how the change would be implemented.
Some historical context for reference: https://github.com/dagger/dagger/issues/7647#issuecomment-2201921231
Simplify the test harness for our integration tests, without changing the actual test logic.
A skill to help AIs and humans understand and improve Dagger's complex codegen system.
Mark gitignored entries in stats instead of excluding them from the walk, and have the server skip deletes/updates under those paths.
This avoids cross-client conflicts caused by confusing overlapping requirements of having .gitignore in the synced fs tree but also needing to exclude it sometimes.
Fixes CI flake about change kind changed from "add" to "delete" during sync and variations
- repro'd with `dagger call engine-dev test --parallel=12 --pkg ./core/integration --run='TestHo...
see test comments for details + ASCII art
fixes this issue (thanks to @sipsma for catching it in the act!):
https://github.com/user-attachments/assets/f606d496-8822-4c25-9de6-ed8827ce0592
What is the issue?
Follow-up of Discord discussion: https://discord.com/channels/707636530424053791/1465717553530671389
I have a context directory, which looks like (simplified)
// +defaultPath="/"
// +ignore=["**","!dagger.json"]
source *dagger.Directory,
When calling a module without any arguments, the source is resolved as a "context" directory and the correct filters (exclude) are applied:
$ dagger call test
dagger.json
However, if a --source...
[dagger/dagger] Issue opened: #11751 'dagger client install go' overwrites replaced dagger.io/dagger
When installing a generated go client ('dagger client install go'), if the target module has dagger.io/dagger installed and replaced with a go.mod replace directive, then the replaced version will be overwritten with the generator's bundled version (matching the current engine's version).
This will break whatever behavior was enabled by the replaced version. In our case, github.com/dagger/dagger, we need the replace directive because we're targeting a dev version of the library.
As discus...
- codegen: fix optional argument detection in generated client wrappers
- docs: document IsArgOptional gotcha in dagger-codegen skill
This was causing an engine panic when you install a module which has toolchains.
The change is to only load toolchains on the parent module.
This is preliminary work for generators I extracted in a dedicated PR to help keep the generators one as focused as possible.
This PR extracts the code to preview patches (used in the CLI to display a summary of a changeset) so it might be used in different places later
This is preliminary work for generators I extracted in a dedicated PR to help keep the generators one as focused as possible.
Allow to handle changesets in the CLI with the object directly instead of the id.
Just a shortcut that will help to deal with changesets from generators.
Missed this during previous effort that split up recipe+content digests. Seems to have been causing flakes in CI where wrong auth was used for git ops. Setting the content digest rather than recipe digest fixes it since it keeps the recipe consistent even when git ops using different auth happen to result in the same directory.
Remove evaling span which was accidentally committed.
Bumps the sdk-typescript group with 14 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.211.0 |
| [@opentelemetry/sdk-metrics](https://git... |
I was reading the docs and noticed this link was getting a 404 so I tracked down the updated location.
Bumps qs and express. These dependencies needed to be updated together.
Updates qs from 6.11.0 to 6.14.1
Changelog
Sourced from qs's changelog.
6.14.1
[Fix] ensure arrayLength applies to [] notation as well
[Fix] parse: when a custom decoder returns null for a key, ignore that key
[Refactor] parse: extract key segment splitting helper
[meta] add threat model
[actions] add workflow permissions
[Tests] stringify: incre...
- ref #11728
Signed-off-by: Marcos Lilljedahl
Bumps the engine group with 30 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/99designs/gqlgen | 0.17.81 |
0.17.86 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| github.com/anthropics/anthropic-sdk-go | 1.14.0 |
1.19.0 |
| github.com/aws/aws-sdk-go-v2/config | `1.31... |
Longstanding subtle DagQL issue - sub-selections of array results need to be resolved in parallel. We already resolved fields in parallel, just not arrays.
What is the issue?
We occasionally get errors from the engine trying to load a remote module through SSH in our CI environment (multiple ephemeral GHA runners accessing a single dagger engine).
We receive 128 exit code with a permission denied; however, our SSH socket looks correctly started and has our key in the runner.
It appears that the engine is trying to reuse a socket from a previous runner that does not exist anymore.
Dagger version
dagger v0.19.8 (image://registry.d...
Using this to run CI async and test various things for now. Probably will end up having a couple spin-off PRs to avoid a single monster one
This gives generated clients in go their own go.mod.
Doing this means we don't compete with the project's own go.mod at all
It includes backwards compat for existing generated clients so that we don't break anyone's working setup.
We are also directly handling the integration test's need to replace the local SDK (read: library) rather than making that part of client generation. In the integration tests we handle the replace for the local library. Because the generated clients have th...
Skip Available() call for drivers, getting rid of docker version altogether.
If Provision() or Connect() fails, try the next driver.
Skip Wait() loop when establishing the buildkit connection.
Instead, if Info() fails, error out.
Delay setting up buildkit session to before Run.
This approximately halves the connect time for me on a docker+ssh context.
I've had trouble running dagger call engine-dev introspection-json as-json contents due to possible Alpine issues.
load http(url: "https://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/libcrypto3-3.5.4-r0.apk", refID: "qbyaq3p936rlfmt7shw4nbi3z"): invalid response status 404 Not Found
I'm not exactly sure what happened: https://dagger.cloud/tiborvass/traces/22fa61bd3737d64e844dad167bd733c5?listen=5f98acc260801256&listen=0a627df8013f68cd&listen=f86b388a509b75ae&listen=8ec8af...
It was inadvertently removed in the refactor in #11685
Please first merge https://github.com/dagger/dagger/pull/11770
Trying a theory: we can identify which spans are 'user spans' by wrapping all points where we exec something, since that will cover both module function calls and any telemetry produced by a withExec (e.g. test spans).
Every call made in the engine is sent back to the client (and from there forwarded to cloud). Each call also was including the entire ID payload of the call.
That takes total O(n^2) space, where n is the size of the DAG, due to the fact that each call payload duplicates the parts of the DAG already sent in earlier call payloads.
e.g. for a very simple DAG like A->B->C, the telemetry sent would be
- ID for A
- ID for A->B
- ID for A->B->C
We don't seem to be using the payload at...
Bumps the docs group with 7 updates in the /docs directory:
| Package | From | To |
|---|---|---|
| posthog-js | 1.313.0 |
1.336.4 |
| react | 19.2.3 |
19.2.4 |
| react-dom | 19.2.3 |
19.2.4 |
| sass | 1.97.1 |
1.97.3 |
| [typedoc](https://github.com/TypeStrong/TypeDo... |
Bumps the sdk-elixir group with 2 updates in the /sdk/elixir directory: credo and ex_doc.
Updates credo from 1.7.15 to 1.7.16
Release notes
Sourced from credo's releases.
v1.7.16
Check it out on Hex: https://hex.pm/packages/credo/1.7.16
Fix compatibility & compiler warnings with Elixir 1.20.0-rc.1
Credo.Check.Refactor.PassAsyncInTestCases add new param :force_comment_on_explicit_false (defaults to false)
Cre...
What is the issue?
I don't see a way to mark things as Checks. I believe it would be implemented through a new attribute ?
Dagger version
dagger v0.19.10 (image://registry.dagger.io/engine:v0.19.10) darwin/arm64/v8
Steps to reproduce
dagger init --sdk=php and no Check attribute seems available
Log output
No response
Add dagger generate feature.
Functions returning a Changeset can be decorated and will be listed as generator function and executed via dagger generate command.
Generators can be used to construct assets, generate code that should be versioned, etc.
Security scans are failing, need to bump go to 1.25.6. Also regenerating some stale files that got committed to main.
Bumps preact from 10.26.9 to 10.28.3.
Release notes
Sourced from preact's releases.
10.28.3
Fixes
Avoid scheduling suspense state udpates (#5006, thanks @JoviDeCroock)
Resolve some suspense crashes (#4999, thanks @JoviDeCroock)
Support inheriting namespace through portals (#4993, thanks @JoviDeCroock)
Maintenance
Update test with addition of _original (#4989, thanks @JoviDeCroock)
10.28.2
Fixes
Enforce strict equality for VNode object construct...
Bumps cross-spawn from 7.0.3 to 7.0.6.
Changelog
Sourced from cross-spawn's changelog.
7.0.6 (2024-11-18)
Bug Fixes
update cross-spawn version to 7.0.5 in package-lock.json (f700743)
7.0.5 (2024-11-07)
Bug Fixes
fix escaping bug introduced by backtracking (640d391)
7.0.4 (2024-11-07)
Bug Fixes
disable regexp backtracking (#160) (5ff3a07)
Commits
77cd97f chore(release): 7.0.6
6717de4 chore: upgrade standard-version
f700743 fix: upda...
When storage fills up, opening the client telemetry DB can fail, but aborting the session prevents telemetry from flushing or cleanup from progressing — a catch-22 where the engine can’t proceed to recover.
This change logs and continue on keepalive DB open errors, so clients are at least not stuck waiting for a clientdb prune.
There's probably a lot more we could do here, but this seems like a reasonable start.
If a LICENSE isn't found during dagger init, we create one for you by downloading it from spdx.org.
This creates a network dep, which is especially problematic when there's networking errors from spdx.org and our tests flake out.
It also is probably somewhat impolite to download hundreds of copies of the same license file each CI run.
This changes the default license only (apache 2.0) to be embedded so we can avoid the network dep in that case.
A likely better long-term fix would ...
Hi everyone,
Does anyone know how to export files or directories from the runtime container?
I followed these cookbook examples (thanks for them, btw):
https://docs.dagger.io/cookbook#copy-a-file-to-the-dagger-module-runtime-container-for-custom-processing
https://docs.dagger.io/cookbook#export-a-directory-or-file-to-the-host
However, I can’t find any way to chain an export from within the runtime container.
More specifically, I have an entrypoint module that runs and manages ot...
Turns out some infra providers like AWS CodeBuild are somehow still on Linux kernel 4.14 (despite that one officially being 2y past EOL).
The experience on these kernels is not gonna be ideal in terms of performance but right now the only hard blocker is our use of open_tree and related syscalls during container start (to avoid overlayfs leak issues).
It's pretty easy to just skip that when starting containers, so we may as well to unblock users on CodeBuild. Overlay leaks result in var...
Sockets have to be explicitly provided as arguments to the API. If so, then RUN --mount=type=ssh will use that socket.
So if you want to have a function that does a DockerBuild with an SSH socket the code might be like:
func (m *MyModule) DoDockerbuild(dir *dagger.Directory, sshSock *dagger.Socket) *dagger.Container {
return dir.DockerBuild(dagger.DirectoryDockerBuildOpts{SSH: sshSock})
}
And can then be called like this (or similar):
dagger call do-dockerbuild ...
A skill for writing design proposals for improving Dagger
When the engine started, it was checking mutable mounts for any leftover volatile dirs. The way it did this resulted in the "shared" mount pool needed by overlay cache mounts being skipped. This also ended up being saved as the mounts to use for that ref going forward, which meant any concurrent use of the overlay cache mount would be invalid due to duplicate work/upper dirs and also fail due to volatile existing.
Fix is to just ensure the shared mount pool is correctly used in all cases.
Bumps apko to latest version to fix the CVE
This is an option of the official client libraries, that is not passed through in generated clients.
As reported by @kpenfound
Module loading was specifying an include that had a **/* appended, which appears to create a huge slowdown in monorepos with large directory trees in terms of number of files/dirs.
This specifically applies to a case like:
- Big monorepo
- A dagger module subdir that has relatively few files
Before this change, the **/* pattern seemed to be possibly be resulting in walks/checks of the full tree. I didn't take time yet to diagnose why exactly that happens and if it's expected or ...
This is a test for https://github.com/dagger/dagger/issues/8955 Unfortunately there isn't a fix for this, and the test will check for the buggy case.
Once the bug is fixed, this test can be adjusted to test for the correct behaviour.
What is the issue?
When running dagger develop multiple times on the same module, ocassionally the output is different. Specifically the ordering of a particular module type's .MarshalJSON, .UnmarshalJSON functions is changing in the /dagger.gen.go.
I actually found this issue rarely happens so I don't have an exact repro, however I believe I have isolated the root cause of the non-determinism and can show it [using this example repo](https://github.com/chrisjpalmer/dagger-co...
Fixes https://github.com/dagger/dagger/issues/11798
This re-exports core types and some functions we were missing in generated clients. Without this, users would have to import their generated client and the published library
What is the issue?
When doing a dagger install .. in a CI pipeline the task can fail with:
error setting dir metadata for / lchown / not permitted
The full error from logs looks like:
✘ .export(path: ""): String! 0.0s ERROR
✘ export directory / to host 0.0s ERROR
! error from receiver: error setting dir metadata for /: lchown /: operation not permitted
In this use case, the dagger modules each have tests in a tests directory. i.e. daggerverse/module/tests.
As part ...
Bumps the engine group with 31 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/99designs/gqlgen | 0.17.81 |
0.17.86 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| github.com/anthropics/anthropic-sdk-go | 1.14.0 |
1.21.0 |
| github.com/aws/aws-sdk-go-v2/config | `1.31... |
This reverts commit f68dea413fe7118330b3eea9196ecbf1463250de from #11685
It broke check.Source() API. It's being added back in #11771
This fixes a loading error that breaks our main module
What are you trying to do?
After a few talks with some fellow daggernauts, we are all wondering why there is not some kind of curation on the daggerverse.
- Docker Hub has pulls + stars + last updated criteria
- Github has stars and forks
- Packagist has Installs Stars Watchers Forks
- You've got the idea...
IMHO, the daggerverse desperately needs an addition of more criteria or a manual curation to go one step further.
This is a break in the adoption of dagger generally, as I see it.
...
Problem
As of 0.19.11, generated clients are smaller: they import dagger.io/dagger for core types, instead of duplicating it. This includes dagger.io/dagger/telemetry.
This broke a small number of modules (all internally used by us) that manually imported their generated dagger/telemetry package, to use our experimental otel features (attribute definitions etc). As a result these modules fail to load with v0.19.11.
Known affected modules:
Directly affected:
- `github.com/dagge...
The change to telemetry imports doesn't work in dev engines because it ends up requiring import statements change.
Fixing this will require more significant work, just adding a temporary workaround in the meantime to unblock our local dev.
cc @TomChv
This ones been biting me for a while so I'm finally taking a shot at this lol
Fixes using go natively on mac in the dagger project.
Summary
- Export
CopyFileContenton darwin ininternal/fsutil/copyto match the linux API - Extract
syscall.Mount/syscall.Unmountbind-mount calls fromcore/changeset.gointo platform-specific helpers - Move 4 Linux-only functions from
core/git_remote.go(runWithStandardUmaskAndNetOverride,unshareAndRun,overrideNetworkConfig,runProcessGroup) intogit_remote_linux.go - Move
mountIntoContainerfromcore/service.gointoservice_linux.go - Move `pathResolverForM...
Updates the requirements on uv-build to permit the latest version.
Updates uv-build to 0.10.0
Release notes
Sourced from uv-build's releases.
0.10.0
Release Notes
Since we released uv 0.9.0 in October of 2025, we've accumulated various changes that improve correctness and user experience, but could break some workflows. This release contains those changes; many have been marked as breaking out of an abundance of caution. We expect most users to be able t...
Bumps the sdk-java group in /sdk/java with 2 updates: com.palantir.javapoet:javapoet and io.opentelemetry:opentelemetry-bom.
Updates com.palantir.javapoet:javapoet from 0.10.0 to 0.11.0
Release notes
Sourced from com.palantir.javapoet:javapoet's releases.
0.11.0
No documented user-facing changes
Commits
035c1f3 Release 0.11.0
a020cf1 [High Priority] Excavator: Upgrades baseline-error-pron...
Bumps the sdk-typescript group with 16 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.211.0 |
| [@opentelemetry/sdk-metrics](https://git... |
Bumps the docs group with 8 updates in the /docs directory:
| Package | From | To |
|---|---|---|
| posthog-js | 1.313.0 |
1.342.1 |
| react | 19.2.3 |
19.2.4 |
| react-dom | 19.2.3 |
19.2.4 |
| sass | 1.97.1 |
1.97.3 |
| [typedoc](https://github.com/TypeStrong/TypeDo... |
Bumps the sdk-python-docker group with 1 update in the /modules/ruff/build directory: astral-sh/ruff.
Updates astral-sh/ruff from 0.14.14 to 0.15.0
Release notes
Sourced from astral-sh/ruff's releases.
0.15.0
Release Notes
Released on 2026-02-03.
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
Ruff now formats your code according to the 2026 style guide. See the formatter section below or in the blog post ...
What is the issue?
I have a larger repository which I've adopted to use Dagger. This repository contains a .env file with ~220 env variables, all unrelated to Dagger, which is copied from a .env.template for local dev. I've noticed significant slow downs to module loading when the .env file is present (~1.9s w/o .env, ~26s w/ .env).
This directly impacts all uses of Dagger within this repository.
There looks to be some prior discussion on configuring the env file loading in h...
What is the issue?
I'm not certain how to this occurred, but I wanted to record the error here. I was refactoring an existing module, moving/deleting code (a Release struct) from one module (mod A) to a new one (mod B). When I called dagger functions on mod A the CLI errors with:
$ dagger functions
✘ load module: . 2.2s ERROR
✘ initializing module 0.3s ERROR
! Post "http://dagger/query": command [docker exec -i dagger-engine-v0.19.11 buildctl dial-stdio] has
exited with exit ...
Update the go_sdk to send a pinned lib version to a commit from dagger-go-sdk.
⚠️ This change the release process, now we will need to update the const in go_sdk to the latest commit of dagger-go-sdk, this commit will not be the one tagged because it's done before the release.
At some point, it would be much better to release the SDKs before the engine so we can set the commit of the released instead of the one before.
When a function return an object that defines check or generat functions, those should appear when we list and be run when needed.
This behaviour has been removed during the migration from the previous checks code to the new ModTree.
fixes #11811
Fixes #11765
Couple of interrelated high-level goals here.
One goal is to reduce usage of "custom recipe digests" and replace them with content digests. This is important for the dagql cache upgrades as recipe digests will be changed to always be purely "recipe", with any additional digests (content, "semantic", etc.) modeled as separate digests. That in turn makes the whole system much simpler algorithmically and makes digests less opaque ("is this a true recipe digest or a cus...
Before this change, manual local-cache pruning only accepted useDefaultPolicy, so teams running with gc=false could not reuse their configured space thresholds and had to choose between all-or-nothing pruning behavior.
After this change, engine.localCache.prune accepts explicit space overrides and applies them per call, enabling controlled manual pruning windows without re-enabling automatic GC.
Added test coverage in core/integration/localcache_test.go, test case `TestLocalCachePru...
Dang now has dang fmt + LSP support - getting this reformat out of the way so it doesn't become a large diff landmine for whoever edits these next.
Follow-up, on top of #11560
Instead of always:
- ls-remote
- then fetch
We should be able to only fetch directly to avoid this unnecessary step. This has implications on the function caching, but discussion is open on that
This is an ugly solution still, but the aim is to assess the performance across the entire test suite
Expose generators and generator functions to environments, allowing to access all the generate functions.
Fixes #11750.
The issue is caused by a check on setCallInputs:
if len(arg.metadata.Ignore) > 0 && !arg.metadata.isContextual() { // contextual args already have ignore applied
In this context an argument is considered contextual if either the DefaultPath or DefaultAddress is set. If it is then setCallInputs will not go through the ignore process of directories. The problem: arguments that are contextual (they have a default path) but a user specified a value ...
[dagger/dagger] Pull request opened: #11837 Avoid WithExec panics and surface underlying exec errors
Before this change, Container.WithExec could panic with "index out of range" while handling exec failures. The failure-handling path assumed mount and output slices were always aligned, and a deferred block could run even when mount preparation had already failed.
e.g.
panic: runtime error: index out of range [0] with length 0
goroutine 4176537 [running]:
github.com/dagger/dagger/core.(*Container).WithExec.func2()
/app/core/container_exec.go:299 +0x1198
githu...
This is unrefined slop atm, but directionally correct. Just want to kick off some full CI checks for errors and/or perf impact. Will do human cleanup before bringing out of draft.
Goal is to make the base cache aware of more dagql primitives, specifically of IDs and Results (whereas previously cache was decoupled and generic).
This is another crucial step for replacing the buildkit solver and enables a lot of simplifications + new features.
This is one of those situations wher...
Not sure how this got set to 0.19.20? But it did
The jest module's dang SDK source was unpinned, resolving to whatever main pointed to at fetch time. A breaking change in vito/dang (e5942b3) caused a ~2h window where any CI run fetching the SDK got a compile error. This was fixed upstream (dagger/jest#7), and these test refs now point to commits that include the pinned SDK.
This span is important so the UI knows where to zoom into, otherwise you get a trace that has all the check(foo).run() plumbing around it.
Follow-up of https://github.com/dagger/dagger/pull/11837
PrepareMounts allocates refs in a loop and can fail partway through. Before, callers were responsible for cleaning up partial refs on error. This was fragile: a caller refactor could silently introduce leaks.
Now PrepareMounts cleans up after itself:
- on success, caller owns the refs
- on failure, PrepareMounts releases any refs it created
Includes a regression test for the partial-failure path.
Interested to see if there's anything noticeable in terms of performance
- retire
dagger watch- stopped working ages ago I think? - add
dagger trace [--org ]
Currently, trace streams payloads via the existing Cloud GraphQL APIs, converts them back into OTLP data, and exports them back into the local frontend. Alternatively we could add OTLP fetching endpoints to Cloud, and I had a separate PR for that, the main advantage being that you don't need to specify an org, but this PR immediately works without having to bikeshed that and coordinate merging, so...
[dagger/dagger] Pull request opened: #11845 cmd/dagger: hint that module ref is overridden on errors
Context
@nipuna-perera hit a Jenkins-only failure on dagger toolchain install.
The command was resolving the module from DAGGER_MODULE (remote git ref) instead of the local workspace. For local-mutating commands, that leads to: kind must be "local", got "git".
Problem
The error did not explain where the module ref came from, so the fix path was unclear.
Approach
Keep behavior unchanged, impro...
Store and expose the reference to the original module in which the check or generate has been defined (and by extension to any ModTreeNode).
For instance if a check is defined in a Toolchain, Module will remain the root module while OriginalModule will be the Toolchain's module.
That way we can access properties like ModuleSource from a check or generate function.
The OriginalModule is exposed in the schema, I'm not sure it's needed or not. If it's not required I'd be...
Hi,
Is there any improvements about this subject ?
even simpler than dots - just print logs, no dots or report
This converts a panic into an error, so the engine will keep on running when this bug is encountered. Unfortunately this does not fix https://github.com/dagger/dagger/issues/11825
When we use a glob like **/*.go in doc strings or descriptions, that was causing these comments to become invalid syntax.
Before this change, several engine BoltDBs ran with NoSync only, and crashy/shutdown-edge cases could still surface bbolt corruption panics like page ... already freed.
After this change, every BoltDB in this tree that already uses NoSync also sets NoFreelistSync and NoGrowSync, aligning the option set across all DB open paths and matching the mitigation pattern used in containerd.
This updates all four relevant init points: snapshotter metadata store options, containerd metad...
What is the issue?
I have a dagger module where I am
(1) creating a hashicorp/vault server with -dev flag
(2) initializing that vault server with a bunch of policies
(3) initializing a nomad instance running on my local docker using
but I am running into an issue where (2) and (3) aren't always run. Upon further investigation, it looks like its just skipping those initialization steps because its being cached. I created a minimal reproduction of ...
Replace manual generate function exposed in the main .dagger module by dagger generate command:
-
add
+generatepragma and@generatedirective -
rename some of the
generatefunctions to better express what they are doing$ dagger generate -l Name Description changelog:generate Generate the changelog with 'changie merge'. Only run this manually, at release time. docs:references Regenerate the API ...
Bug Description
After a Dagger session completes (or fails), the BuildKit solver's in-memory vertex cache (actives map) can retain stale session ID references. When a new session connects and resolves the same LLB vertex digests (same Dagger module, same code), the solver reuses the cached vertex state. The reused state's NextSession() iterator walks parent states and finds the dead session ID, causing a 5-second timeout per cache key lookup. Every subsequent job fails within ~10 seco...
[dagger/dagger] Pull request opened: #11855 engine: fix safeToPersistCache propagation for nullables
Nullable return types from functions weren't propagating from the Nullable-wrapped result to the de-ref'd un-null result.
This meant nullable return types from functions would not get cached. It seems most SDKs end up using Non-nullable types for the most part in practice, but we just hit this in Dang where you can easily specify a type as Nullable.
Along the way I noticed a quirk with the sqlite db TTL checks in that we were always following the "TTL expired" branch even when there act...
(still deep in the process of de-slop-ification, not human readable or fully tested yet)
This is the next step in the process of migrating all caching to dagql (away from buildkit and its solver)
It updates the cache implementation to use smarter data structures and algorithms, namely a union-find structure wrapped up as an e-graph. This:
- Maximizes our ability to find cache...
This is so that we can develop dagger/dagger with git worktrees. This should greatly simplify agent setups. I tested locally and it looks good, I can dagger-dev -m version call version from a regular branch or a worktree and it works correctly. Using main dagger the same command does not work in a worktree.
Summary:
In git worktrees, .git is a file (not a directory) containing a gitdir reference. This caused Dagger to crash when trying to sync .git as a directory. This change adds workt...
Splitting this out of #11812 so I can get a clean test of it in isolation to make sure the accompanied refactor didn't break anything.
Add the ability to decorate a function with @Generate annotation in Java SDK.
Expand integration tests to cover java.
Fixes #11656
Users expectchangeset.layer to follow 3 simple rules for scoped changesets:
- diff only what is inside the selected scope
- keep the resulting layer shape at that same scope
- if there are no scoped changes, the layer must be empty
Before this change, changeset.layer called before.Diff(after) directly. For scoped inputs, that bypassed the resolver diff path that normalizes both sides before diffing, which could lead to inconsistent scoped output, breaking 1 and ...
I was helped on discord learn about the .env file features for defaulting of arguments and since there was no documentation covering the feature I offered to add a quick page and was told that would be great.
I verified that the docs build and that they look correct and all links are functional when running the doc server. I also validated that all of the cases I documented here function the way they are documented.
Bumps the sdk-java group with 3 updates in the /sdk/java directory: com.palantir.javapoet:javapoet, org.junit:junit-bom and io.opentelemetry:opentelemetry-bom.
Updates com.palantir.javapoet:javapoet from 0.10.0 to 0.11.0
Release notes
Sourced from com.palantir.javapoet:javapoet's releases.
0.11.0
No documented user-facing changes
Commits
035...
Bumps the sdk-typescript group with 17 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.212.0 |
| [@opentelemetry/sdk-metrics](https://git... |
Bumps the engine group with 32 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.86 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Bumps the sdk-java group with 4 updates in the /sdk/java directory: io.vertx:vertx-web-client, com.palantir.javapoet:javapoet, org.junit:junit-bom and io.opentelemetry:opentelemetry-bom.
Updates io.vertx:vertx-web-client from 4.5.24 to 4.5.25
Commits
30d906a Releasing 4.5.25
c89f11c Update to testcontainer...
When DAGGER_MODULE is set, the module is silently loaded with no visible
indication in the TUI.
This PR fixes that by always displaying the name of the module being loaded.
Fixes #11802
Go module codegen had a nondeterministic edge case: when types or methods share the same source position (notably token.NoPos), Pos()-only sorting cannot define a stable order.
This showed up as occasional reordering of generated blocks (e.g. MarshalJSON / UnmarshalJSON) between identical runs, producing noisy diffs in generated code.
Add shared comparators with explicit tiebreakers (position, package path, name) and use them consistently across all codegen sorting...
git is needed for workspace detection (.git root), apk for runtime package installs.
What is the issue?
Setting OTEL_EXPORTER_OTLP_METRICS_ENDPOINT on the Dagger engine process has no effect — metrics are never exported to external OTLP collectors.
Root cause
cmd/engine/telemetry.go:53-55 calls telemetry.Init() without Detect: true:
ctx = telemetry.Init(ctx, telemetry.Config{
Resource: otelResource,
})
When Detect is false (zero value), Init() at sdk/go/telemetry/init.go:398 skips the block that calls ConfiguredMetricExporter() — t...
Extracting a backwards-compatible portion of #11812 that we can ship first and begin adopting in the repo.
Take advantage of the new workspace API to adopt it in our own modules.
Bumps the sdk-typescript group with 18 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.212.0 |
| [@opentelemetry/sdk-metrics](https://git... |
Bumps the sdk-typescript group with 17 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-jaeger | 2.3.0 |
2.5.1 |
| @opentelemetry/exporter-trace-otlp-http | 0.209.0 |
0.212.0 |
| [@opentelemetry/sdk-metrics](https://git... |
Also fix a bug introduced by the bug on env path.
What is the issue?
Error when trying to pass in a default that looks like a number
Dagger version
dagger v0.19.10 (docker-image://xxxinternalurl:0.1.115) linux/amd64
Steps to reproduce
- Create a dagger module
dagger init --sdk=go - Create a toolchain in a subdir
toolchains/test-toolchainusingdagger init --sdk=goagain - In the first module you created run
dagger toolchain install ./toolchains/test-toolchain/ - in dagger.json add the customization below
- run `dagge...
What is the issue?
The casing of the function and argument field seem to be the casing of the actual implementation.
For example in the go default example, the functionName is ContainerEcho. I don't think this is by design because it is surprising, considering other views on function names are standardized for the environment they are being used in. My first instinct was to use the names as shown by the CLI when using help commands or invoking things.
If it is by design and shoul...
What are you trying to do?
We are trying to build toolchains that offer a very standardized out-of-the-box experience with our templates. While doing this we noticed that it's not easy to design these without some arguments being repeated between the functions we expose.
For example, for our dotnet toolchain, we want to offer an override for the SDK image to be used. This is needed for pretty much all the features we expose and we end up with a large amount of repeated defaults in custo...
Description
When using _EXPERIMENTAL_DAGGER_CACHE_CONFIG with an S3 backend, the Dagger engine crashes with a Go stack overflow during the cache export phase on the second run of a pipeline. The first run succeeds and populates the S3 cache. Any subsequent run that imports this cache and then tries to re-export crashes the engine.
Environment
- Dagger version: v0.19.11
- Engine: Remote engine on EC2 (Amazon Linux 2023, c7i.xlarge24, 192GB RAM)
- Cache config: `type=...
- return container instead of an error. As returning a container the engine will sync to return the error, that's exactly what was done. By making the container available, it's easier to debug as we can dagger call python-sdk lint terminal
- limit lint-docs-snippets check to lint docs... Previously it was also linting sdk/python that added confusion in check results as the same error appeared multiple time
What is the issue?
dagger check --scale-out currently shows a passing check and exit status 0 even if checks failed.
There's a different in the local (to the engine) vs. scale-out paths.
The local path directly calls the underlying function, which will bubble up an error if the call returns it (or returns a Syncable object that fails on sync):
The scale-out path however just q...
This adds telemetry to Python SDK tests so we can see each individual test passing in the traces/cloud.
What is the issue?
When I'm setting a json value in a variable for an envfile quotes are stripped.
ENV_JSON_ISSUE={foo: bar}
ENV_JSON_GOOD={"foo": "bar"}
Dagger version
dagger v0.19.11 (image://registry.dagger.io/engine:v0.19.11) linux/amd64
Steps to reproduce
import dagger
from dagger import dag, function, object_type
import json
@object_type
class DaggerBug:
@function
async def env_file_bug(self) -> str:
return await (
dag.
...
This PR will prevent conversion of numeric-looking string argument to numeric when parsing a module configuration.
Resolves: #11882
This is a simple client-side feature to complement the more comprehensive server-side dynamic filtering.
It will allow specifying include/exclude options for arguments of type dagger.Directory using a url-like format.
For example:
/path/to/monorepo?include=apps/app1,libs/lib1,libs/lib2&exclude=libs/lib1/testdata
Can be useful for builds that need a subset of directories.
For example a golang build, with replace support.
Works for command line args, as well a...
Summary
When a non-ClientError exception occurs during a GraphQL request (e.g. transport failures with kube-pod://, Docker socket issues, or container exec errors that don't come back as proper ClientError), the TypeScript SDK throws a generic:
Encountered an unknown error while requesting data via graphql
This makes debugging CI failures extremely difficult. Real build failures (like exited with code 1 or binary already exists in destination) get hidden behind this ge...
Bumps the sdk-java group in /sdk/java with 1 update: com.jayway.jsonpath:json-path.
Updates com.jayway.jsonpath:json-path from 2.10.0 to 3.0.0
Release notes
Sourced from com.jayway.jsonpath:json-path's releases.
json-path-3.0.0
What's Changed
adding jackson3 provider (#1066) by @bsa01 in json-path/JsonPath#1067
Prepare Version 3.0.0 - Java 17 baseline with Jackson 3 by @kallestenflo in json-path/JsonPath#1072
New Contributors
@bsa01 made their ...
Bumps the sdk-python-docker group with 1 update in the /modules/ruff/build directory: astral-sh/ruff.
Updates astral-sh/ruff from 0.15.1 to 0.15.2
Release notes
Sourced from astral-sh/ruff's releases.
0.15.2
Release Notes
Released on 2026-02-19.
Preview features
Expand the default rule set (#23385)
In preview, Ruff now enables a significantly expanded default rule set of 412 rules, up from the stable default set of 59 rules. The new rules are mostly...
Bumps the engine group with 35 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.87 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Add a directive named origin to track where a typedef is originating from.
This directive only apply to object, enum, interface and scalars.
Bumps the sdk-typescript group with 6 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @types/node | 25.2.3 |
25.3.0 |
| @typescript-eslint/eslint-plugin | 8.56.0 |
8.56.1 |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parse... |
This is a guess, but the error https://github.com/dagger/dagger/actions/runs/22108534795/job/63905196975 is related to a change with 3.14 and it started to failed after bumping python to 3.14 in https://github.com/dagger/dagger/pull/11868
I also bumped uv at that time but forgot those github actions.
At least it can't hurt to update those.
also updates the CONTRIBUTING.md guide which had some outdated steps
What it says on the tin - just passes through to Host.directory(gitignore: true), and passes the workspace root along too since we already know it (to avoid an extra FindUp).
[!NOTE]
This is a follow up to https://github.com/dagger/dagger/pull/11827 that was (partially) solving https://github.com/dagger/dagger/issues/11811
Problem | State
check and generate functions must be listed and callable.
When check and generate functions are defined on the main object of a module, it's working.
#11827 was solving the case where check and generate functions are defined on a different object of a module. But this was working only on the "main"...
What is the issue?
I try to run tests for a pipeline written with the Typescript SDK following the documentation (https://docs.dagger.io/reference/best-practices/modules). When I try to launch the test, it fails with a failed to get type defs json during module sdk codegen error
Dagger version
dagger v0.19.11 (image://registry.dagger.io/engine:v0.19.11) darwin/arm64/v8
Steps to reproduce
I followed the steps described:
mkdir tests
cd tests
dagger init --name=tests --sd...
Fixes #11904
Problem
A user reporting getting this module init failure:
failed to get type defs json during module sdk codegen
TypeError: reduce of empty array with no initial value
Root cause
getTsSourceCodeFiles recursively scans src/, and each level reduces readdirSync(dir).map(...) without an initial accumulator.
To trigger the error, the module does not need to be empty: any empty nested directory under src/ can trigger this panic.
...
What is the issue?
# tony @ hydrogen in ~/repros/dagger/obf-errs [12:15:27] C:1
$ dagger run --progress report go run ./main.go
✔ connect 0.2s
Full trace at https://dagger.cloud/verdverm/traces/8316244cfb3c1372a1510d8bd1c68d24
A new release of dagger is available: v0.19.10 → v0.19.11
To upgrade, see https://docs.dagger.io/install
https://github.com/dagger/dagger/releases/tag/v0.19.11
# tony @ hydrogen in ~/repros/dagger/obf-errs [12:15:43] C:1
package main
impor...
This pull request aims at allowing dagger install to honor --eager-runtime flag.
I'm not sure what is the correct design here.
Option 1 (this PR): install defaults to not load the runtime, but honors --eager-runtime flag.
Option 2: always make it eager + possibly have a --lazy-runtime ?
Problem
The remote fetch hot path currently uses git fetch --tags unconditionally. That is expensive on tag-heavy repos and makes branch/commit/tree flows pay global tag transfer cost even though tag APIs and ref resolution already come from ls-remote.
There is a real drawback to removing --tags: some Git servers/proxies reject direct SHA fetches (not our ref, unadvertised object, couldn't find remote ref). BuildKit historically handled this with conditional behavior (`--n...
Introduce a specific object type exposing unit and slow check function executing tests.
Instead of relying on the python version matrix and handling the parallelism when calling the tests, use the built-in check behaviour. All the check functions will be run in parallel.
This change gives more visibility and more control to the developer to run python sdk tests.
Previously only one single check was available regarding those tests:
$ dagger check -l
...
python-sdk...
The tests themselves were racy in this case, so test-only adjustments here.
Tested by running them with -count=1000
we can no longer build the CLI for Windows ARMv7 after upgrading to Go 1.26. So we just need to remove it from the release process too.
Bumps the engine group with 36 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.87 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Adds a TLS driver for clients behind a new tls:// protocol for _EXPERIMENTAL_DAGGER_RUNNER_HOST.
Main motivation for this change was in the context of Native CI. We've been debating for more direct ways to send smart information to our scheduler that do not require going through the CLI with custom cloud-only parameters. Connecting to a cloud engine today requires a TLS certificate, and we are already doing that in the Cloud driver. So I thought: easier to just provision the engine, get ...
Bumps the sdk-typescript group with 8 updates in the /sdk/typescript directory:
| Package | From | To |
|---|---|---|
| @opentelemetry/semantic-conventions | 1.39.0 |
1.40.0 |
| graphql | 16.12.0 |
16.13.0 |
| @types/node | 25.2.3 |
25.3.1 |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript... |
Previous attempt to remove windows/armv7 builds of CLI wasn't quite right because the goreleaser config had a duplicate name in it. I ran with --dry-run at the time but apparently that skipped goreleaser. CI also only runs goreleaser on main, so missed there too.
Fixed the problem, this time I tricked goreleaser into actually running (without actually uploading anything), so more confident in the fix this time around.
Will need this before next release
have not tested at all yet, just sending out as draft
Bumps the engine group with 35 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.87 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Can dagger be scaled to run jobs on multiple machines somehow?
Seems like it probably can be, as dagger runs a series of 'immutable' operations etc.
Hey there!
Dagger's design and architecture has the ability to scale acorss multiple machines but there's currently no user-facing when to set this up. This is mostly because it involves a considerable amount of effort between infrastructure, observability and the runtime.
We are currently in the testing phase a of a Dagger hosted CI service which provides this capability. If this is something you think you're interested, we'd like to chat.
Set by default to 1 thread per CPU instead of 1 thread
Changesets will be merged and user will be promted to apply changes if there's no conflict
func (m *Multi) Foo() []*dagger.Changeset {
return []*dagger.Changeset{
dag.Directory().WithNewFile("foo", "this is foo file").Changes(dag.Directory()),
dag.Directory().WithNewFile("bar", "this is bar file").Changes(dag.Directory()),
}
}
In case node_modules directory is present, the generate function might fail with an error like:
get patch: file size 134250496 exceeds limit 134217728
Ignoring the directory is enough to fix the issue.
Required for https://github.com/dagger/dagger/pull/11856 but technically can be done independently off main and saves that PR from more diff
Still WIP but very good progress so far. Almost all the Dockerfile integ tests in our repo are passing already.
The diff here is not as bad as it seems; there's thousands of lines of redundant tests from earlier iterations of it that can be deleted. Also almost a thousand lines for the WHITEBOARD.md file used to persist LLM work+state. The converte...
Summary
Adds OIDC support to the vault secretsprovider. This falls back to oidc auth of other forms of auth envs are not provided (making it the default). It supports opening the browser and waiting for response before proceeding to obtain vault token.
AI Generated Summary
This pull request introduces comprehensive support for Vault OIDC (OpenID Connect) authentication in the secret provider, including robust token caching, fallback, and end-to-end testing. The main focus is to...
Bumps the sdk-java group in /sdk/java with 1 update: org.mockito:mockito-core.
Updates org.mockito:mockito-core from 5.21.0 to 5.22.0
Release notes
Sourced from org.mockito:mockito-core's releases.
v5.22.0
Changelog generated by Shipkit Changelog Gradle Plugin
5.22.0
2026-02-27 - 6 commit(s) by Joshua Selbo, NiMv1, Rafael Winterhalter, dependabot[bot], eunbin son
Avoid mocking of internal static utilities (#3785)
Bump graalvm...
Bumps the sdk-typescript group in /sdk/typescript with 1 update: @types/node.
Updates @types/node from 25.3.1 to 25.3.3
Commits
See full diff in compare view
Bumps the docs group in /docs with 2 updates: posthog-js and @types/node.
Updates posthog-js from 1.354.3 to 1.356.2
Release notes
Sourced from posthog-js's releases.
posthog-js@1.356.2
1.356.2
Patch Changes
#3174 e9127d8 Thanks @TueHaulund! - Detect and report when rrweb fails to initialize. rrweb's record() silently swallows startup errors and returns undefined, which ...
Bumps the sdk-python-docker group with 1 update in the /modules/ruff/build directory: astral-sh/ruff.
Updates astral-sh/ruff from 0.15.2 to 0.15.4
Release notes
Sourced from astral-sh/ruff's releases.
0.15.4
Release Notes
Released on 2026-02-26.
This is a follow-up release to 0.15.3 that resolves a panic when the new rule PLR1712 was enabled with any rule that analyzes definitions, such as many of the ANN or D rules.
Bug fixes
Fix panic on access to ...
Bumps the engine group with 36 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.87 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Feature Request
SkillBoss provides 100+ AI models via unified API.
- API: https://api.heybossai.com/v1
- Website: https://www.skillboss.co
The built-in LLM defaults have drifted behind current provider recommendations. This updates the core Anthropic/OpenAI defaults and keeps CLI/docs examples aligned so fresh sessions start with sensible, current model names.
What changed
- update core default Anthropic model to
claude-sonnet-4-6 - update core default OpenAI model to
gpt-5.2 - keep core default Google model at
gemini-2.5-flash - add OpenRouter alias mapping for
claude-sonnet-4-6->anthropic/claude-sonnet-4.6 - u...
Also update dagger-chores skill to explain how to regenerate golden telemetry tests.
ExitError swallowed its Original error message, so ParseErrorOrigins was not able to find it.
We already never show this message (as indicated by an existing comment), so there's no harm in including the original error message.
Add a root function that allows to merge an array of changesets.
Before, with changes an array of changesets:
changes[0].WithChangesets(changes[1:])
After:
dag.MergeChangesets(changes)
The benefit is essentially to not have to worry about the size of changes (and so if changes[0] will panic).
[!NOTE]
I don't know about the name, I was also thinking aboutdag.Changesets(changes)
Add new checks in the release toolchains that create a fake released engine and use it.
This will help us catch eventual breaking changes with the codegen.
Bumps the docs group in /docs with 1 update: posthog-js.
Updates posthog-js from 1.356.2 to 1.357.1
Release notes
Sourced from posthog-js's releases.
posthog-js@1.357.1
1.357.1
Patch Changes
#3149 91223c5 Thanks @adboio! - avoid re-checking URLs if they have not changed
(2026-03-02)
Updated dependencies [5e8d5fc]:
@posthog/core@1.23.2
@posthog/types@1.357.1
posthog-js@1.357.0
1.357.0
Minor Changes
#3169 4f885c0 Thanks @marandaneto! - f...
Add moduleSource.GeneratedContextChangeset so it acts exactly as generatedContextDirectory
but it returns a changeset.
Use that new endpoint when running dagger develop.
The goal is that once we generated one file for each dependency, we will be able to remove
the dependency file if that dependency is uninstalled.
Currently loadPackage fails with no packages found in . when we make changes to go.mod in the root of the repo. To debug, I added a go mod tidy immediately before the packages.Load, suspecting that it's silently failing. go mod tidy revealed that the module's generated code was referring to
github.com/dagger/dagger/modules/go/internal/telemetry which indeed did not exist. Including it in this spot fixes the issue, but it's still a bit mysterious as to how it's been working up u...
Switch dagger check -l to a single bulk GraphQL request (dag.Do with CheckGroupListDetails) instead of per-check field fetches. When using --cloud, this avoids a roundtrip from client server.
This is the simple fix to a more deep issue: following the Dagql-ification, we dropped the eager return of object fields. At the moment, accessing the fields requires a roundtrip to the engine. [It would be nice to have a way to specify that some fields as safe to be returned as part of ...
Bumps the docs group with 2 updates in the /docs directory: posthog-js and markdownlint-cli.
Updates posthog-js from 1.356.2 to 1.358.0
Release notes
Sourced from posthog-js's releases.
posthog-js@1.358.0
1.358.0
Minor Changes
#3165 0e08337 Thanks @dustinbyrne! - feat: Tree-shake surveys, toolbar, exceptions, conversations, logs, experiments
(2026-03-03)
Patch Changes
#3164 20c1ff2 Thanks @...
Context
Container.dockerHealthcheck (as an example, but this might probably be hit by other API methods) can resolve to null, with the docker equivalent of:
FROM alpine
HEALTHCHECK NONE
When exposed using the Dagger API, the Python codegen exposes docker_healthcheck() as a concrete HealthcheckConfig type and scalar accessors (shell(), args()) as non-null values.
This leads to an error, at runtime, in which the Python SDK raises **Required field got a null re...
fixes needed for running integration tests with a generated client
These are the engine and cli changes required for https://github.com/dagger/dagger/pull/11746
Fixes are mainly for the client generator and for nested sessions + ExecError
Switch dagger generate -l to a single bulk GraphQL request (dag.Do with GeneratorGroupListDetails) instead of per-generator field fetches.
Run that list-query subtree with a discarded tracing context so per-generator name/description spans are not emitted, while keeping CLI behavior/output unchanged.
This is a follow up to https://github.com/dagger/dagger/pull/11946 that did it for dagger check -l
If a docker healthcheck command is defined (either from a Dockerfile HEALTHCHECK command, or by using the WithDockerHealthcheck() api), it will be used instead of the exposed ports to determine when a service is ready.
To revert to the old behavior of using the exposed ports, one can use the WithoutDockerHealthcheck() call before defining a service.
e.g.
srv := c.Container().
From("some-image-with-a-healthcheck").
WithExposedPort(8080).
WithoutDockerHealthchec...
This PR reimplements our "pretty" TUI frontend using Tuist, a new TUI framework. The main benefit is scrollback handling. Bubbletea is constrained to your viewport, and requires you to painfully track items as they go out of view and print them on your own, where they become "frozen" - completely out of bounds of Bubbletea, unable to be repainted or interacted with at all. Tuist, on the other hand, supports an infinite scrollback, with an efficient rendering...
Add utilities functions to include/exclude types in the GraphQL schema that comes from dependencies.
This is a follow up on https://github.com/dagger/dagger/pull/11896 that uses these changes.
The ultimate goal is to follow up that PR with another one that will generate dependency bindings in specific files instead of being in dagger.gen.go.
The tests were written by getting the introspectionJSON schema locally on a module Test that has a dependency Dep then I simplified that fil...
What are you trying to do?
I'd like to be able to have more than one context for docker build from Dockerfile.
Why is this important to you?
It would ease quite a lot the adoption of dagger on projects with massive Dockerfile to migrate over to dagger. That way we could focus on orchestrating other parts of the CI instead of the build itself.
How are you currently working around this?
I am not.
Moving to a version that moves off of Codeberg. Too unstable for us, and we're probably causing too much load for them at the same time.
This extends util/parallel to have WithFailFast which uses github.com/sourcegraph/conc/pool's WithCancelOnError to cancel remaining checks as soon as one check fails.
My main motivation with this is to give agents a faster feedback loop when running dagger check. I can't really see the use of this in CI or for humans.
The next step would be to enable failfast for the go tests inside our checks through an optional flag so that we dont need to wait for entire suites to fail.
also fixing some other secret related issues found along the way:
- secret scheme need to be supplied when passing secerts via flags
this time with arm support
smiling through the pain
Describes the full vision for dagger up: annotation-based service discovery, parallel startup with port tunneling, health checks, toolchain integration, and phased rollout plan.
Add the --mod/-m flag to the dagger generate command, allowing users to specify which module to generate code for. This brings generate in line with dagger call and dagger check which already support this flag.
The fix is a one-line addition to register moduleAddFlags on generateCmd, since loadModule() already reads the module reference via getExplicitModuleSourceRef().
Using Dagger to automate the CI/CD pipeline for a stock market data platform. The programmable pipeline approach works great for complex data workflows.
Why Dagger for Financial Platforms
- Reproducible builds — Same pipeline locally and in CI
- Caching — Don't rebuild unchanged data processors
- Parallel steps — Run tests, lint, and data validation concurrently
- Programmable — Complex deployment logic in real code, not YAML
Pipeline Steps
1. Build API serve...
Summary
- define the Workspace API desired state in
spec/workspace-api.md - enforce absolute path inputs for
Workspace.directory,Workspace.file, andWorkspace.findUp(from:) - resolve workspace paths directly in host/repo context and reject paths outside the workspace repo root
- keep host filesystem access routed through the owning workspace client metadata
- remove
allowOutsideRepofor now - regenerate GraphQL/docs/SDK bindings for updated API docs
Why
This tightens works...
This was causing a pull of dagger/dagger because dagger/pytest had the wolfi module as a dependency. But this was only used to have a container with uv installed inside. dagger/pytest now has alpine by default. And in our specific case we are giving a dev container anyway.
I noticed the agent struggles to build the dev engine if we don't explicitly tell him to run ./hack/dev so here's a skill to teach him 🚀
That's useful when you want a full dev loop with a repro where the agent do a change and test itself with the built engine if it works :)
Financial Data Pipeline Architecture
Sharing the CI/CD and data pipeline architecture for a stock market platform:
Pipeline Components
Data Sources (5 providers)
↓
Ingestion Layer (BullMQ workers)
├── Stock sync (6K+ symbols, 30s)
├── Options sync (99 Tier 1 chains)
├── News ingestion (22 RSS feeds + Finnhub + SEC)
├── Fundamentals sync (Finnhub basic_financials)
└── Bar backfill (5yr daily for 290 stocks)
↓
Processing Layer
├── Price aggregation (...
Summary
- add a new
dang-dagger-modulesskill for creating, editing, and debugging Dagger modules written in Dang - include a full Dang language reference focused on Dagger module development patterns
- add editor setup instructions (Zed, VS Code, Neovim) and troubleshooting guidance
- document nullable type-handling patterns and common pitfalls seen in real module work
Testing
- not run (docs/skill content only)
Bumps the engine group with 35 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.87 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
client and engine now send the spans that they create respectively instead of the client handling everything
What is the issue?
dockerfile-build is unable to build a dockerfile that runs a heredoc script.
Dagger version
dagger v0.20.0 (image://registry.dagger.io/engine:v0.20.0) linux/amd64
Steps to reproduce
Consider the following Dockerfile:
# syntax=docker/dockerfile:1
FROM alpine
RUN < data
Then try to build it with dagger:
dagger -c 'directory | with-file . $(host |file "Dockerfile") | docker-build | sync'
it fails with:
✘ sync 1.2s ERROR
! p...
What are you trying to do?
I'd like if we could have support to specify a custom tsconfig.json for the TypeScript SDK, something along the lines of:
{
"sdk": {
"source": "typescript",
"config": "tsconfig.dagger.json"
},
"source": ".dagger"
}
Why is this important to you?
I have a monorepo that is using composite projects, so I'd like if my language server and tools can run type checks and include my Dagger sources as well, without having to have a separate ...
Follow up of https://github.com/dagger/dagger/pull/11962 but the generated files can be removed by running dagger develop after uninstalling a dep
What is the issue?
With the newest release I am getting a hash mismatch in my pipeline:
Run dagger/dagger-for-github@v8.3.0
with:
version: latest
cloud-token: ***
dagger-flags: --progress plain
verb: call
workdir: .
enable-github-summary: false
env:
_EXPERIMENTAL_DAGGER_RUNNER_HOST: tcp://my-url:1234
Run set -o pipefail
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Tota...
[dagger/dagger] Issue opened: #11977 🐞 `golangci-lint` is outdated after upgrading to Dagger v0.20.0
What is the issue?
The Go linter golangci-lint errors out when linting the dagger module after having our Dagger module from v0.19.11 to v0.20.0.
Running dagger call go lint fails with:
Error: can't load config: the Go language version (go1.25) used to build golangci-lint is lower than the targeted Go version (1.26.0)
┃ The command is termi...
What are you trying to do?
Building Dagger release archives should produce bit-for-bit identical assets on every run.
Why is this important to you?
For v0.20.1 our publish job flaked out, and we had to delete the GitHub release in order to re-run it (not idempotent - separate issue). When publish finally succeeded, we had a mix of opinions on what the checksums should be for our archives, between Nix, our checksums.txt on dl.dagger.io, our CDN, our S3 bucket, etc. - a huge ...
The Dagger CLI checks for new versions on every invocation and prints a notification to stderr when an update is available. There's currently no way to disable this.
This can be noisy in CI environments and automated scripts where upgrading isn't desired or is managed externally (e.g., pinned versions in Dockerfiles, Nix, Homebrew).
A common pattern in other CLI tools (Terraform, GitHub CLI, etc.) is to support an environment variable like DAGGER_NO_UPDATE_CHECK=1 to suppress the notifica...
Free AI-powered code review tool — catches security vulnerabilities.
Try it — no signup.
Finds injection, XSS, hardcoded secrets, auth bypass.
Fixes #11979
Summary
- Adds support for the
DAGGER_NO_UPDATE_CHECKenvironment variable to suppress the CLI update notification that runs on every invocation - When set to any non-empty value (e.g.,
DAGGER_NO_UPDATE_CHECK=1), the automatic version check is skipped entirely, avoiding both the network request and the stderr output - This is useful in CI environments and automated scripts where CLI versions are pinned and managed externally
Details
The change is a 4-line early retu...
Bumps the sdk-java group in /sdk/java with 3 updates: com.fasterxml.jackson:jackson-bom, com.palantir.javapoet:javapoet and io.opentelemetry:opentelemetry-bom.
Updates com.fasterxml.jackson:jackson-bom from 2.18.6 to 2.21.1
Commits
08a5a9a [maven-release-plugin] prepare release jackson-bom-2.21.1
5b03376 Prep for 2.21.1 release
1d78778 Merge branch '...
Bumps the docs group in /docs with 2 updates: posthog-js and @types/node.
Updates posthog-js from 1.358.0 to 1.359.1
Release notes
Sourced from posthog-js's releases.
posthog-js@1.359.1
1.359.1
Patch Changes
#3204 2b0cd52 Thanks @marandaneto! - chore: upgrade dompurify to 3.3.2
(2026-03-06)
Updated dependencies []:
@posthog/types@1.359.1
posthog-js@1.359.0
1.359.0
M...
Bumps the sdk-typescript group in /sdk/typescript with 9 updates:
| Package | From | To |
|---|---|---|
| @opentelemetry/core | 2.5.1 |
2.6.0 |
| @opentelemetry/exporter-jaeger | 2.5.1 |
2.6.0 |
| @opentelemetry/exporter-trace-otlp-http | 0.212.0 |
0.213.0 |
| [@opentelemetry/sdk-metrics](https://github.com/open-te... |
Bumps the sdk-elixir group in /sdk/elixir with 1 update: credo.
Updates credo from 1.7.16 to 1.7.17
Release notes
Sourced from credo's releases.
v1.7.17
Check it out on Hex: https://hex.pm/packages/credo/1.7.17
Credo.Check.Readability.ModuleDoc add new param :ignore_modules_using (defaults to [Credo.Check, Ecto.Schema, Phoenix.LiveView, ~r/.Web$/])
Credo.Check.Warning.UnusedOperation update :modules param: instead of a list of functions to check, :all...
Bumps the sdk-python-docker group with 1 update in the /modules/ruff/build directory: astral-sh/ruff.
Updates astral-sh/ruff from 0.15.4 to 0.15.5
Release notes
Sourced from astral-sh/ruff's releases.
0.15.5
Release Notes
Released on 2026-03-05.
Preview features
Discover Markdown files by default in preview mode (#23434)
[perflint] Extend PERF102 to comprehensions and generators (#23473)
[refurb] Fix FURB101 and FURB103 false positives when I/O varia...
What happened? What did you expect to happen?
Have reported this issue on Discord
We do use some GitHub workflows that has jobs that run several actions that use dagger.
And this for a number of workflows that are run in parallel.
This quite often result in Error 429, which we presume is due to rate limits. And as the workflows typically uses the same IP this causes all workflows to fail.
Have tried to remedy this,...
Bumps the engine group with 44 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.88 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Running git config -l -z from a directory with a broken .git pointer (e.g. a git worktree mounted into a container) causes a fatal exit 128. Fix by running from a temp directory so only system/global config is read, and treat CONFIG_RETRIEVAL_FAILED as non-fatal since git config forwarding is best-effort (only used for url.*.insteadOf mappings).
Bug introduced in #11949
Discord context: #maintainers message
[dagger/dagger] Issue opened: #11992 🐞 <is not possible to add custom liveness and readiness probes>
What is the issue?
Hey all, I tried to configure a custom liveness probe on my dagger engine but ended up having next error,
rror while running post render on files: map[string]interface {}(nil): yaml: unmarshal errors: │
│ line 110: mapping key "exec" already defined at line 104
Reason is: it is not possible to have two readinessprobes for the ...
Summary
This feature adds a Kubernetes service manifest to dagger helm chart.
Details
In the case engine.port is set, a service manifest is added to expose the dagger engine within the cluster.
- Revive #11264 - still really want it, Workspaces might substantially simplify it
- Add Workspace APIs to support coding agents (testing w/ Doug)
- [x]
Workspace.exists - [ ]
Workspace.glob
- [x]
Context
This PR is a spinoff of #11812 (Workspaces, modules v2). That PR grew large enough that it benefits from being split into two focused, reviewable PRs:
- This PR (foundation + compat): the lower half — engine-side plumbing, runtime workspace model, legacy compatibility, lockfile substrate
- Follow-up PR (UX + authoring): the upper half —
.dagger/config.tomlsupport,dagger migrate, explicit workspace targeting, workspace management commands
Together these two PRs depr...
What is the issue?
It seems that ever since: https://github.com/dagger/dagger/pull/11909 merged, and 0.20.1 was released, all of our CI pipelines are failing to pull a module that exists inside of our GitHub Enterprise instance.
Specific versions: GitHub Enterprise 3.18.4
Error I'm seeing:
load module: .
9 : ┆ finding module configuration
10 : ┆ ┆ moduleSource(refString: "."): ModuleSource!
11 : ┆ ┆ ┆ load SDK: go
11 : ┆ ┆ ┆ load SDK: go DONE [0.0s]
12 : ┆ ┆ ┆ moduleSource(...
@rough birch let me know if you need any other information for this ticket
Resolves https://github.com/dagger/dagger/issues/11977.
As the ticket suggests, updating Dagger to v0.20.0 breaks the Go toolchain package as golangci-lint is compiled on Go 1.25 instead of 1.26 which is pulled in by the latest Dagger version.
This PR bumps the Go toolchain package to use golangci-lint from a newer image.
What is the issue?
A TypeScript module function returning Promise that runs multiple parallel checks via Promise.all — including one that uses .withServiceBinding() to bind an .asService() container — fails when the service's underlying withExec exits non-zero.
The Dagger TUI output (--progress=dots) clearly shows the error:
): Void 5m17s ERROR
✘ withExec sh -c '...' 1m12s ERROR
! exit code: 1
✘ withExec sh -c '...' 2m23s ERROR
! start (aliased as ): exit code: 1
```...
Fixes: #11996
AI Usage Transparency: Claude was used to find this fix and then write the integration test for the fix.
Two commits with separate approaches:
- if
err != nilbut the exit code was 0, still have the CLI exit 1. It's not clear the exact sequence of events where this might happen, but it seems plausible since 0 is the Go zero value (duh). - If the primary span is marked as failed, then never exit 0
- I'm less convinced by this one, but it should handle the case where
err == nilsomehow but the telemetry still knows the main span was failed. cc @vito dunno if we're gonna be breaking any...
- I'm less convinced by this one, but it should handle the case where
Problem
Changesets larger than 128MB couldn't show diff summaries at all — the raw patch had to be loaded into memory as a string, which hit the max file contents size limit. Even below that threshold, the TUI would freeze while diffparser chewed through the full patch just to count lines.
Solution
The fix is to stop parsing patches for metadata that git already knows.
git diff --numstat returns per-file line counts directly, without loading patch content. We expose...
Hi,
An automated responsible-disclosure scan found pattern(s) matching the following API key type(s) in this file:
Keys detected
- AWS Access Key → revoke at https://console.aws.amazon.com/iam
Recommended actions
- Revoke each key immediately using the links above
- Remove the key(s) from the file and commit the cha...
Bumps the sdk-java group with 4 updates in the /sdk/java directory: com.fasterxml.jackson:jackson-bom, com.palantir.javapoet:javapoet, org.mockito:mockito-core and io.opentelemetry:opentelemetry-bom.
Updates com.fasterxml.jackson:jackson-bom from 2.18.6 to 2.21.1
Commits
08a5a9a [maven-release-plugin] prepare rel...
Bumps the sdk-typescript group in /sdk/typescript with 5 updates:
| Package | From | To |
|---|---|---|
| @types/node | 25.3.5 |
25.5.0 |
| @typescript-eslint/eslint-plugin | 8.56.1 |
8.57.0 |
| @typescript-eslint/parser | 8.56.1 ... |
Bumps the docs group in /docs with 3 updates: posthog-js, sass and @types/node.
Updates posthog-js from 1.359.1 to 1.360.2
Release notes
Sourced from posthog-js's releases.
posthog-js@1.360.2
1.360.2
Patch Changes
#3236 bc30c2d Thanks @dustinbyrne! - fix: Calling reset() now automatically reloads feature flags
(2026-03-13)
Updated depe...
Bumps the engine group with 45 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.88 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
Extracting the core part of this so we can start using it for test modules etc. without the "loading module" overhead (because they always run with a fresh engine).
Bumps the engine group with 45 updates in the / directory:
| Package | From | To |
|---|---|---|
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | 0.17.81 |
0.17.88 |
| github.com/alecthomas/chroma/v2 | 2.20.0 |
2.23.1 |
| [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sd... |
The Namespace runner was still pinned to v0.20.0 while the daggerverse module requires v0.20.1. This was missed during the v0.20.1 post-release bump.
PS: as i'm pushing from my fork, it's expected to fail
This is a breaking fix -- previously WithVariable would parse the value as if it were an .env file entry, which meant one would have to manually escape all quotes in order to set a value containing quotes.
Now escaping is only required for \ and $.
fixes #11889
Context
This PR is adds an optional cacheBuster argument to the checks API:
Check.run(cacheBuster: String)CheckGroup.run(cacheBuster: String)
The contract is:
- no
cacheBuster: current behavior, normal cache lookup - same
cacheBuster: reuse the same isolated cache branch - different
cacheBuster: run on a different cache branch
In other words, this gives the caller a way to choose the cache branch used for a check run.
It is shipped to open the discussion, stil...
Bumps the engine group with 41 updates in the / directory:
| Package | From | To |
|---|---|---|
| charm.land/lipgloss/v2 | 2.0.1 |
2.0.2 |
| cloud.google.com/go/secretmanager | 1.14.7 |
1.16.0 |
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | `0.17.... |
What is the issue?
dagger init fails if there's a directory called .env in any of the parent directories.
Dagger version
dagger v0.20.1 (image://registry.dagger.io/engine:v0.20.1) linux/amd64
Steps to reproduce
sh -c 'cd $(mkdir -d) && pwd && mkdir .env && mkdir example && cd example && dagger init'
Log output
✔ connect 0.1s
✘ moduleSource(refString: ".", disableFindUp: true, allowNotExists: true, requireKind: LOCAL_SOURCE): ModuleSource! 0.0s ERROR
┇...
Fixes #12018
Changes
When .env exists as a directory (e.g. Python venvs create .env/), dagger init fails because innerEnvFile() and outerEnvFile() in core/modulesource.go try to read it as a file.
Fix: detect the "is a directory, not a file" error from the Host.file() call and skip gracefully instead of propagating it.
Test Plan
Added two integration tests in core/integration/envfile_test.go:
TestEnvDirectory:.envdirectory in the module directory- `TestEnvD...
Fixes #11972
Problem
Dockerfile heredoc syntax fails with "command not found (exit 127)" when using dagger docker-build.
Root Cause
In engine/buildkit/executor_spec.go, the mount filtering logic separates OCI spec mounts into those kept for runc and those pre-applied to the rootfs. The /dev/pipes/ bind mount used by heredoc processing was being pre-applied to the rootfs. However, runc subsequently mounts /dev as tmpfs (a default OCI spec mount), which shadows everything prev...
It seems that it's still possible in some cases for a contextual directory sourced from a private git repo to end up in function cache in a state where a client hitting the cache reloads it but with different credentials than before and then the engine complains it doesn't have the creds anymore (since the http auth secret becomes and explicit arg to the git operation).
All these problems are going away in the new cache implementation, but in the meantime we can patch this by just checking...
The page at https://docs.dagger.io/reference/configuration/cloud/ was super out of date, so this is a refresh
Quick summary:
- Link to cloud reference page from cloud section on features page
- mention cloud checks on features page
- improve github onboarding instructions on reference page
- add cloud checks section to reference page
- add secret provider configuration section on reference page
- clean up modules section that was overly verbose
- improve instructions in Traces secti...
What are you trying to do?
I wonder if Rust Community SDK is going to be promoted to official SDK. Currently it doesn't have proper codegen ( dagger-codegen library was last updated two years ago ) and as Rust users we can't use modules properly. I know there is an option to opt in for Go or other officially supported languages but it would be awesome if we could use Rust for that case
Why is this important to you?
Currently we only can talk to the Dagger client and fully replace D...
What is the issue?
The CVE GHSA-p77j-4mvh-x3m3 (Critical gRPC vulnerability, fixed in v1.79.3) is coming from the Dagger engine/SDK for dagger v0.20.1.
This appeared today for dagger modules built.
Dagger version
dagger v0.20.1 (docker-container://dagger-engine) linux/amd64
Steps to reproduce
- Create go container for dagger module using dagger SDK for v0.20.1
- Run Grype scanning for the module
Log output
NAME INSTALLED FIXED IN TY...
Fixes GHSA-p77j-4mvh-x3m3.
Fixes #12024
The security:scan-engine-container CI check fails because Trivy 0.68.2 is outdated (0.69.3 available). Bump to the latest release to unblock the pipeline.
To verify the digest:
docker pull aquasec/trivy:0.69.3docker inspect aquasec/trivy:0.69.3 --format='{{index .RepoDigests 0}}'
Bumps the engine group with 40 updates in the / directory:
| Package | From | To |
|---|---|---|
| charm.land/lipgloss/v2 | 2.0.1 |
2.0.2 |
| cloud.google.com/go/secretmanager | 1.14.7 |
1.16.0 |
| github.com/1password/onepassword-sdk-go | 0.3.1 |
0.4.0 |
| github.com/99designs/gqlgen | `0.17.... |
The v1.1.2 release (~1 hour ago) fixes a panic on negative slice index in Delete with malformed JSON (GO-2026-4514).
Note: Trivy currently flags buger/jsonparser via GHSA-6g7g-w4f8-9c9x (Denial of service), which appears to be a separate issue : the adv...
- added a viztest function for manual testing
- teav1 bump is unrelated, just doing it along the way
given the recent changes in the git operation in the engine, we now
need to fetch the tags beforehand so we can get the correct version
Signed-off-by: Marcos Lilljedahl
Problem
Claude Code agents can silently bypass git hooks by running git commit with the hook-skip flag. This disables pre-commit, commit-msg, and pre-push hooks — the same hooks that enforce linting, type-checking, and commit message conventions.
Solution
Create .claude/settings.json with block-no-verify@1.1.2 as a PreToolUse Bash hook. It reads tool_input.command from the Claude Code hook stdin payload, detects the hook-bypass ...
Summary
Creates .claude/settings.json with block-no-verify@1.1.2 as a PreToolUse Bash hook to prevent Claude Code agents from bypassing git hooks via the hook-skip flag.
Details
When an agent runs git commit or git push with the hook-bypass flag, it silently disables pre-commit, commit-msg, and pre-push hooks. block-no-verify reads tool_input.command from the Claude Code hook stdin payload, detects the hook-bypass flag across all git subcommands, and exits 2 to block. T...
aws:// should be aws+sm:// or aws+ps://
What is the issue?
Running WithExec with these options:
dagger.ContainerWithExecOpts{
Expect: expectedResult,
RedirectStdout: reportPath,
Expand: true,
},
Where reportPath = $HOME/artifacts
Results in an error open redirect stdout file: open /tmp/rootfs1507444385/$HOME/artifacts
It looks like Expand is not applying to RedirectStdout option.
Dagger version
0.20.1
Steps to reproduce
Run WithExec with the options and configuration in the desc...
The trick is to use Directory as the shared state between your modules, and then call .Export() from your top-level entrypoint.
Here is the pattern:
1. Have each sub-module return a Directory
Instead of writing files to the runtime container's filesystem directly, have each module function return a *dagger.Directory containing its outputs:
// In your sub-module
func (m *SubModule) Build(ctx context.Context, src *dagger.Directory) *dagger.Directory {
return dag.Containe...
The core issue is that when dag.Container().From("registry/image:tag") pulls an already-published image, Dagger re-exports it with a fresh timestamp in the config, producing a different digest. This is by design -- Dagger treats From() as constructing a new container state, not as a reference to the remote manifest.
Workaround: use the registry directly for the manifest merge
Skip Dagger for the final combine step and use crane or docker manifest instead. Since you have already ...
@sipsma, since you looked into this recently, do you have any thoughts on the dagger approach? I don't think using a tool (like docker or crane) outside of dagger is right solution.
Adds a gitcgr badge to the README showing code graph statistics for this repository.
Badge preview:
gitcgr.com visualizes any GitHub repo as an interactive code graph — just change hub to cgr in the URL.
Generated automatically by gitcgr.
Bumps the sdk-java group in /sdk/java with 1 update: com.fasterxml.jackson:jackson-bom.
Updates com.fasterxml.jackson:jackson-bom from 2.21.1 to 2.21.2
Commits
10e12a5 [maven-release-plugin] prepare release jackson-bom-2.21.2
d754903 Prep for 2.21.2 release
63e1b3b Post-release dep version bump
716ab0d [maven-release-plugin] prepare for next development iteration
See full diff in compare view
[
Don't show noqa hover for non-Python documents (#24040)
Rule changes
[pycodestyle] Recognize pyrefly: as a pragma comment (E501) (#24019)
Server...
Summary
This stacks on workspace-plumbing and extracts the lockfile lookup substrate into its own PR.
It adds:
- the generic tuple-based lockfile substrate in
util/lockfile - lock policy and lock mode plumbing through the CLI, client metadata, nested clients, and module runtimes
- workspace-local lockfile read/write helpers and
currentWorkspace.update(): Changeset! dagger lock updatefor refreshing existing entries- initial lock-aware consumers for
container.fromand Git ref...
this fixes the issue of some devs getting "Permission denied (publickey)" when trying to call this function
This PR is implementing the host volume mount for engines that are started locally, as well as allows sshfs mounts that would be used as two way binding mount from the engine to the container.
This feature allows large filesystems to be used in dagger workflows
Fixes #9326
I am investigating Dagger and it seems to be active and well documented - and worked for me first shot. But I am daunted by the number of open issues. Any thoughts or direction in this area?
@hongchaodeng what is your concern exactly? project velocity? An issue in particular?
Lots of use cases and lots of users, will lead to lots of issues being filed.
OK thanks - I felt the same - it is certainly getting uptake and I see why. The doc is beautiful and examples great. The only hitch I had was trying to do the codegen, the container doesn't accept any arguments (like our own custom npm registry from artifactory) and it can't get out to the npm registry, so I was stumped. Other than that - the programmatic approach is great.
@hongchaodeng - the concern is that number is a lot, and I could see burning that down to be an enormous effort, even with AI - and that if we hit one of the issues we are stuck. I am purely evaluating it and I see it as an incredible bit of a kit.
Note that we've historically used issues as a catch-all for discussions, design debates, etc. So not every one of these 800 issues is an actual bug or problem encountered by a user.
What are you trying to do?
After a few talks with some fellow daggernauts, we are all wondering why there is not some kind of curation on the daggerverse.
- Docker Hub has pulls + stars + last updated criteria
- Github has stars and forks
- Packagist has Installs Stars Watchers Forks
- You've got the idea...
IMHO, the daggerverse desperately needs an addition of more criteria or a manual curation to go one step further.
This is a break in the adoption of dagger generally, as I see it.
...
@fredleger I agree, we need to improve curation. We've been stretched thin but are looking at this problem again.
The root cause of the issue is that we've made it much easier to write and share modules, than to reuse them. As a result, there is a lot of noise on Daggerverse, since it's basically a search engine for every dagger module available anywhere on the internet. As a result, it's very difficult to find a high quality module that you can trust is following all the best practices, e...
My current build system often fails when a remote network / service behaves badly. 502's, host hangs up, services being down... Today, I have to add custom logic at all of these points as we discover them, or we move to replicating these remotes internally.
git clonego mod downloaddocker pullapt update- the list goes on and on...
It would be great if there was retry / expo decay options across the building blocks for these situations. Detecting which are network ...
[dagger/dagger] New comment on discussion #12052: Dagger should enable network resilience everywhere
Just as another example of this, @jpadams hit a remote cache import error (failed to compute cache key: failed to copy: invalid status response 503 Egress is over the account limit) due to a 503 from GHA that failed the entire run. In general Buildkit tries to treat these errors as cache misses, but due to the way this failed Buildkit didn't. Have an issue open there now, though it's actually a pretty hard problem: https://github.com/moby/buildkit/issues/2836
To have meaningful bug report, it would be good to have some subcommand that would automatically prefill OS+env information (OS type, version, dagger version, latest log, etc)
So the reporter can just add its own issue, without having to care about the whole context if it can get automatically.
I love this. A few follow-up thoughts:
-
We can probably broaden this to also allow suggesting features, asking for help on a configuration, discussing a use case, reporting an issue with a specific package, search the knowledge base... A proposal to get us started:
dagger support? -
This feature works in tandem with a backend service. That service should be hosted by dagger.io, not github :) Of course we can still leverage github as much as we want, for example to create issues as y...
What are you trying to do?
We have the circumstance where a build could engage a large amount of expensive steps to all be engaged in order to assemble the pieces necessary to create a final build artifact. A number of these steps are large enough that even a well equipped machine might have a hard time coping with it.
My intent is to be able to schedule some/all actions as separate Pods scheduled on a K8s cluster. We could define their resource constraints so that K8s would be able t...
That's an amazing idea, being able to split task into multiple pod.
It requires a lot of thinking and design but result would be awesome!
I'm not sure it's a priority for now, I have tagged this issue with discussion so it will not be forgotten
My team would be open to discuss this sometime soon if you'd like. We have a design for a new bespoke system that would fit our needs that would be a large effort for us to build. If we could come to an arrangement perhaps our effort could be spent making this sort of thing work over Dagger instead.
https://www.youtube.com/watch?v=wTENRhYt3mw is a video by Apple on front-ending BuildKit with K8s jobs so you can pass through resource constraints and have K8s schedule it. If this could somehow be hooked into Dagger, it would be a possible way to tackle this.
Visualize the DAG
Being able to visualize the DAG, wether it is through an ASCII code or a web UI
_Originally posted by @grouville in https://github.com/dagger/dagger/discussions/2052#discussioncomment-2517752_
Being able to diff the DAG would be awesome too, so you could understand how builds and caching layers might change.
A complex dagger plan visualised would really help with debugging and troubleshooting
Cache invalidation explain
It's very common for an action (or a set of actions) to be re-executed given that "something" in the build cache changed. While speaking with @gerhard today across several topics, we came up with the idea that it'd be great if Dagger could output some optional detailed information about why the cache is being invalidated. I think this could potentially help to prevent mistakes and/or find issues/improvements in already executed pipelines.
As side nice-to...
This would be a really cool feature for Cloud debugging... :) cc @marcosnils
@vito found this old issue, thought you'd find it interesting in the context of your prototyping work :)
This would be a really cool feature for Cloud debugging... :) cc @marcosnils
Indeed, I was the one originally posting the question ;)
What are you trying to do?
I'd like to create a reusable dagger package to run MegaLinter
Would such PR be accepted ?
If yes, where in dagger sources could I implement it ?
Why is this important to you?
It could allow dagger users to easily integrate MegaLinter within their dagger pipelines :)
How are you currently working around this?
I could just do docker run but i'd prefer to have a reusable item :)
hey @nvuillam 👋
That's a great idea. Sorry for the late answer 🤭
Dagger is now using SDKs, in which language would you prefer to create this reusable package ?
MegaLinter is in python, with a little bit of node.js, would it fit ?
Are there some guidelines to build on dagger something equivalent to a docker based github action ?
Dagger Cloud run URL
What happened? What did you expect to happen?
There are multiple examples in the docs about running dagger using multiple CI's, but I want to run dagger in a Kubernetes pod.
I was wondering on how to run dagger inside a container? if possible without requiring access to docker sock, or using a privileged container.
thanks in advance
I would like to see this as well. Especially as to how to run dagger in containerized platforms such as Kubernetes and Openshift
I would like to see an example of it, especially in docker because this
should be part of the developer tools, and if we can have all dev tools in
a repo, dockerized it is easy to keep the same environment in the team,
versions, etc. Not so many devs have a k8s or the likes running locally
however I would like to understand the use case for you guys that have
asked for it.
On Fri, Apr 28, 2023 at 4:04 AM thecooldrop @.***>
wrote:
I would like to see this as well. Especially as to ho...
awesome thanks
On Thu, May 18, 2023 at 1:01 AM Miranda Carter @.***>
wrote:
Hi @thecooldrop https://github.com/thecooldrop , @chopanpma
https://github.com/chopanpma , and @kajogo777
https://github.com/kajogo777 ! We are actively working on this. I
highly recommend joining the Dagger Community call on June 1st. @gerhard
https://github.com/gerhard and @kpenfound https://github.com/kpenfound
will be doing a demo about this topic.You can register here:
https:...
For me it would be sufficient to see how we can run dagger within a rootless container. Namely a container where I do not have to have access to root. This would then enable me to run the dagger in any containerized environment. Mostly that would mean that I can use dagger in my Jenkins, while using Kubernetes Pods as agent nodes, where I can then have elastically scaling Jenkins server as load increases or decreases, while still retaining the capability to run the pipelines locally.
@mircubed signed up! We are looking to modernize our CI from Jenkins to a combination of Argo Workflows + Dagger CI, feels like this may be the feature we are looking for in Dagger.
Hi @thecooldrop , @chopanpma , and @kajogo777 ! We are actively working on this. I highly recommend joining the Dagger Community call on June 1st. @gerhard and @kpenfound will be doing a demo about this topic.
You can register here: https://dagger-io.zoom.us/webinar/register/4416686668409/WN_USQjVBGXT0SWhNMvqYVvCA#/registration
Hi @mircubed was the community call recorded? I wasn't able to make it due to timezones.
I am also looking for this !
I can add my 2 use cases also
Again using Argo Workflow for CI/CD (i.e Argo suite with ArgoCD Argo Workflows Argo Events ...)
Also would like to have builds local inside k8s i.e something like ...
https://www.talos.dev/v1.4/talos-guides/install/local-platforms/docker/
throw in challenge's with multi platform i.e arm/amd with rise of M1, M2 .. I am having a hard time working out how this should work would love some more examples !
This might help: 🎬 https://www.youtube.com/watch?v=c93_EsedP1s
<a href="https://www.youtube.com/watch?v=c93_EsedP1s"><img width="1418" alt="image" src="https://github.com/dagger/dagger/assets/3342/c8ef5607-ea12-4a2e-a096-1629c1dbb735"></a>
See the code: docker run -it --entrypoint nvim registry.dagger.io/equinix-demo-day-2023 .
Just a quick note that we now have a few guides on the topics mentioned above:
Dagger on Kubernetes: https://docs.dagger.io/194031/kubernetes
Dagger with Argo Workflows: https://docs.dagger.io/324301/argo-workflows
Dagger with Tekton: https://docs.dagger.io/213240/tekton
use dagger in my Jenkins, while using Kubernetes Pods as agent nodes
In principle this should be possible using Sysbox. I failed to install it on GKE, however.
What are you trying to do?
Using Dagger with Azure Pipelines. The documentation has a helpful example for Azure Pipelines. It starts with a script to install dagger:
- script: |
cd /usr/local
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=$(DAGGER_VERSION) sh
displayName: Install Dagger $(DAGGER_VERSION)
then there is a different approach for Windows agents.
Azure Pipelines has the concept of 'tool installer' tasks that help to accompl...
What are you trying to do?
Get some Go code coverage directly from dagger
Why is this important to you?
100% coverage doesn't mean you're safe, but having 0% is worst. Having an idea where you are in between is useful.
What would be great would be to be able to track the difference between the last run in the main branch to track the evolution more than the absolute value.
At a first step, erroring if the full coverage value <XX% would already be interesting.
How are you...
some basic implementation: https://itnext.io/github-actions-code-coverage-without-third-parties-f1299747064d
The tricky part is to have a global number
What are you trying to do?
It would be great to be able to hook into the DAG created by dagger to create build steps in a Jenkins that align to visualize the progress of a long running job via Blue Ocean.
Why is this important to you?
Seeing the output visually is often helpful vs just seeing streaming text output.
How are you currently working around this?
I don't see a way to work around this currently. Everything just ends up in a single build step in Jenkins.
What are you trying to do?
Clearly export and see errors from a Dagger do execution using a standard format. Someone I talked to after my PlatformCon talk mentioned this as a good way to integrate with existing systems:
Usually an HTML or something like JUnit XML, which can be displayed in most of the CI/CD web interfaces.
They in the past have struggled with trying to parse errors out of BuildKit's (custom, non-standard) output, something like this seems like it would help them a ...
There are use cases that call for always running a certain step of a pipeline. Examples include an step that checks to see if a remote resource has drifted from the last known cached state, in which case other steps may need to run in order to correct it.
This requires being able to specify that a step should always run. A few open questions:
- Who configures this: the extension author (or us as dagger devs in the case of core api)? the api invoker? both?
- Do we use buildkit's `Ignore...
Some updated thoughts on this, another benefit to having official support for this is in our API that we can have our remote caching skip these execs (which would obviously be a waste of time+space to cache).
I think a good potential implementation here would be to re-use @vito's idea w/ services where we stop buildkit from caching these by forcing them to fail. In this case we wouldn't cancel them though, we can instead have the shim always exit non-zero so buildkit thinks it's failed and...
What are you trying to do?
I want to merge PR but sometimes test fail for no good reason except they are flaky.
Why is this important to you?
Flaky test can be a productivity killer. It can lead you to the wrong rabbit hole when you don't need it.
I know go test accepts the -count flag. We could use it with 10 or 30 to run those tests many times on main, and if it fails, it means there must be some race condition or some flaky test.
We're better investigating this problem...
I'm trying to step through the getting started guide and it looks like the volume mount logic is tripping up on Windows paths.
PS > .\cloak.exe -p "examples/alpine/cloak.yaml" do @"
{
alpine{
build(pkgs:["curl"]) {
exec(input: {args:["curl", "https://dagger.io"]}) {
stdout(lines: 1)
}
}
}
}
"@
`Error: failed to solve: input:5: cor...
Looks like it's filepath.Join being helpful.
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
wd, _ := os.Getwd()
configPath := filepath.Join(wd, "examples/alpine/cloak.yaml")
fmt.Println(configPath)
}
PS > go run .\test.go
C:\source\github\cloak\examples\alpine\cloak.yaml
filepath.Dir() also replaces the separator.
filepath.Dir("examples/alpine/cloak.yaml") => examples\alpine
What are you trying to do?
Add govulncheck to CI pipeline
Why is this important to you?
No response
How are you currently working around this?
No response
Done through trivy there: https://github.com/dagger/dagger/blob/eaed4d2e767973023e6d178b8bd77c09d42cce3e/.dagger/engine.go#L410
I'm closing this issue, please reopen it if it was a mistake
The trivy vuln scanner (https://trivy.dev/latest/docs/scanner/vulnerability/) is not the same as govulncheck (a core go tool).
We should ideally do both.
There should be a way to repeatedly run dagger pipelines with a set of extensions.
When extensions in dagger.gql are first pulled via git refs, we should record the sha in a dagger.lock file.
Agreed 100%
We should see if we can re-use the new related feature coming in buildkit soon: https://github.com/moby/buildkit/pull/2943
Useful because:
- Users sometimes want to prevent files from changing somewhere
- Performance benefits (buildkit doesn't need to create new layers)
- Better content-based caching (there are some really convoluted corner cases that cause the caching behavior to be slightly different when using a rw mount, I can look them up again if needed - suffice it to say there can be differences that a few users might care about someday)
Could model this as
- allowing a mount to be specified as re...
What are you trying to do?
Having two different clients taking to the same Dagger engine to have different views of the API depending on the extensions that each decided to include, currently the engine exposes a single global API for everyone.
Why is this important to you?
So we can provide multi-tenancy clients in the same engine
How are you currently working around this?
N/A
cc @sipsma @aluzzardi
Related to this issue, which is essentially the same but specific to extensions (whereas this new one is about clients): https://github.com/dagger/dagger/issues/3072
What are you trying to do?
I wonder if Rust Community SDK is going to be promoted to official SDK. Currently it doesn't have proper codegen ( dagger-codegen library was last updated two years ago ) and as Rust users we can't use modules properly. I know there is an option to opt in for Go or other officially supported languages but it would be awesome if we could use Rust for that case
Why is this important to you?
Currently we only can talk to the Dagger client and fully replace D...
@timplifier good question, it really depends on a maintainer stepping up to get it done. I agree it would be really nice to have full module support in Rust, unfortunately the core Dagger team doesn't have the bandwidth to develop one, but we are happy to provide support it some Rustaceans volunteer :) Perhaps the new generation of coding AIs makes this exponentially easier?
User reported that they expected this to result in evaluation:
id, _ := g.DaggerClient.Container().
Build(src, dagger.ContainerBuildOpts{Dockerfile: "docker/Dockerfile")}).
Stdout().Contents(context.Background())
But it didn't. The implementation reason is that Stdout only prints the output of previous Execs, not Build. However, that doesn't really make any intuitive sense.
Possible solutions:
- Stdout could return the progress output of the previous bui...
What are you trying to do?
I need to access /dev/ttyUSB0 to be able to flash some stm32 microcontroller.
Once I built an app with tinygo, I need to use stm32flash on /dev/ttyUSB0 with it.
Why is this important to you?
We could simplify the whole flashing process by removing the dependencies on the host to be able to hack on those devices.
How are you currently working around this?
I do it directly on the host (and have a bunch of microcontroller tools on it)
Hey is there any update on this? This would be really awesome in order to be able to start virtual machines using Qemu for services. Then the /dev/kvm device could be passed through the container..
Usually one would of course use docker containers to manage services, but sometimes its just necessary to have a VM. For example running a macOS VM using docker-osx, because building iOS apps strictly require macOS with Xcode.
Not sure if Buildkit exposes the knobs we'd need to include the device in the container today. Could be buried in the oci worker config (in buildkit's toml) somewhere.
The other hurdle will be that buildkitd by default runs containerized (via our docker provisioner), so we'll also need to poke the device nodes through that too.
I'll work on this issue this week.
It seems like a quick win to improve the API.
From @sipsma:
it would probably result in simpler code in the long run if we can just use vektah/gqlparser to construct these graphql operation strings. I used Formatter.FormatSchemaDocument in the code-first stuff, I think you can use Formatter.FormatQueryDocument for this. Even though we don't need a whole document, from what I can tell briefly glancing you can use that for individual queries too.
(This needs to be verified, it should be true in theory but hasn't been tried yet)
When using the Container API, if a mount is placed under a path containing a symlink, it's possible to create situations where:
- a directory in the container during an exec op shows some contents
- use of the
directoryAPI to get the contents of that path returns something completely different
Described more here: https://github.com/dagger/dagger/pull/3217#discussion_r987479638
Possible soluti...
We should support validating checksums for HTTP downloads. LLB already supports it, thankfully: llb.Checksum.
Here are some discussion points:
# should it be required or optional?
http(url: String!, digest: String!): File!
http(url: String!, digest: String): File!
# usage:
http(url: "https://dagger.io", digest: "sha256:4f559663fb9d7d49db9c17b4ef81fb41c85fe8a3c7dca127a18af4818f07b807")
# should we have ...
I think it should be optional, we don't always know the checksum in advance.
It depends on the scenario I guess.
For SBOM, it makes sense to make sure to get exactly what you expect, and make for more idempotent builds.
For testing/experimenting, you don't want to get a checksum beforehand every time.
On the format, I'm not sure. We've retired sha1 a while ago, I don't know when sha256 will. As most of the tools we use are still on sha256 as well, maybe it makes sense to just use that. ...
What are you trying to do?
Assume that I have built an application image with Dagger/Cloak and pushed this to a registry like Docker Hub. As part of my deployment process, I would like to deploy this image from the registry to a K8s cluster. This could be either a local minikube cluster for testing, or a cloud K8s provider like GKE.
Why is this important to you?
Being able to deploy to K8s should be supported in Dagger as many deployments now happen on K8s.
How are you curren...
@vikram-dagger, Kubernetes pulls images by itself. So you are not giving it the image really via dagger. You would only tell it where it can get the image.
The most simple thing you could do would be mounting your local kubeconfig to a kubectl image and apply some manifest referencing your image in some pods container list.
Once you have an action in place to run a command against your cluster, you need to ensure that your cluster is allowed to pull from the registry in case of private ...
@bluebrown could you advise us on what this could look like from Dagger/Cloak to AKS?
Guessing we can start with this example your submitted using kubectl:
https://github.com/dagger/dagger/blob/main/pkg/universe.dagger.io/alpha/azure/test/test.cue
or this one with helm:
https://github.com/dagger/dagger/blob/main/pkg/universe.dagger.io/alpha/azure/aks/helm/test/test.cue
WDYT?
Multiplatform support is coming in cloak, but it will only support architecture emulation and help out users/extensions that want to perform cross-compilation.
However, there are many use cases where cross-compilation is not really a viable option or where binaries targeting non-Linux kernels need to be executed rather than just compiled. Dagger doesn't support those use cases yet.
It's most likely an enormous undertaking, but opening this as a tracking issue for supporting execution on...
From a discord user:
We are talking about building big C++ codebases, where build performance is a top priority.
Also putting aside build performance, I don't see cross-compiling C++ to macOS, having to link to native macOS libraries, as an easy path either... 🙃
I understand the current limitations and I understand the "in the very long term" 🙂
As a data point, I can confirm that there are still companies that, although they follow modern best practices regarding CI/CD, hav...
It would probably be fairly easy to get it updated. I haven't moved my stuff to modules so it might make sense, and why i haven't felt the need to build the dagger codegen for rust.
Summary
Present a warning to the user when using a deprecated API field or argument.
Motivation
Logging a warning makes it more visible whenever you're actually running a pipeline, no matter if you use a smart IDE or consult the reference docs during development. Removing the warning acts as encouragement to migrate to the new behavior.
Rationale
There's two sides to this:
- In each SDK, so it's shown when using the IDE and when browsing the reference documentation.
...
@helderco Is it a priority? I can work on this ASAP
Not a priority, but may be easy to do. We no longer have any deprecated apis for now though. Python has this, only missing in Go and Node.js.
@helderco I think instead of doing the job on the SDK side, we should log warning in our core API using progrock, this would be a generic and durable solution :)
WDYT @vito ?
@vito @helderco Any thought on this so we can make progress?
I think instead of doing the job on the SDK side, we should log warning in our core API using progrock, this would be a generic and durable solution :)
Yeah, been thinking about this because we have pending deprecations. For example:
I added this warning:
The intent was for the warning to show for the user when this API is used, both in the TUI and hopefully in cloud traces as well. Nothing was shown last time I ran this.
I defer to @vito to help point out what needs to be done...
@helderco Yeah, I think it's time to start integrating with OpenTelemetry logging properly, which I take to mean integrating slog with ctx and setting OpenTelemetry's severity levels etc. instead of mimicking stdout/stderr.
I had an idea for a "global logger" that we could use sort of like Progrock's previous logging system:
...but it's half-baked at the moment. I wanted to...
I unassigned myself from the issue since it should be done in the core engine.
@helderco I'm not sure I understand how to implement that, if I just log deprecation warning in the function I'm not sure it's going to be enough
Yes, that's the current state of things. The goal is to make it work. See https://github.com/dagger/dagger/issues/4855#issuecomment-2098721537.
@helderco I'm not sure I understand how to implement that, if I just log deprecation warning in the function I'm not sure it's going to be enough, for example
func (s *socketSchema) Install() {
dagql.Fields[*core.Query]{
dagql.Func("socket", s.socket).
Doc("Loads a socket by its ID.").
Deprecated("Use `loadSocketFromID` instead."),
}.Install(s.srv)
dagql.Fields[*core.Socket]{}.Install(s.srv)
}
type socketArgs struct {
ID core.SocketID
}
func (s *socketSc...
@vito Do you have any hints on where I could add this kind of logic, I see that we configure the TUI in the dagger/main.go
But I do not understand how I could create a static view at the top of the logging, like a permanent span or an extra global logger like you mentionned in https://github.com/dagger/dagger/issues/4855#issuecomment-2098721537
I have an idea but I'm not sure...
I know that we're not yet optimizing for single queries by allowing to select multiple sibling fields but my brain keeps bringing it up and I'm fond of discussing possibilities here if anyone has ideas to add this feature.
Uncached Exec?
The common example that comes to mind for this is when you want to select both stdout and stderr from an exec, although there's a separate issue to attempt to simplify that:
- #3496
In any case, those are two different scalars that need t...
I'm going to self-assign because I'm working on a proposal that can resolve this.
Proposal:
It's not manually selecting which sibling fields you want, but it does that automatically for the most common use case where you might want to use it.
What are you trying to do?
The new WithoutDirectory syntax is great, but I am looking for something closer to .dockerignore syntax.
I don't know the name of all directories I'd like to ignore when I read the host dir, but I know they will all contain a folder foo that will be quite heavy. I'd like to ignore all folders under **/foo
Why is this important to you?
See description. I have many many monorepos of this style.
How are you currently working around this?
Se...
Instead of just the syntax. I think it makes more sense to just use the same docker's .dockerignore logic directly. This way any existing codebase with any docker-related toolings will have higher chance of just working correctly out of the box when switching to dagger.
While defining ignore directly in dagger is great, I'd suggest that the same functionality where Dagger can define a build directly or use a DockerFile would be great here.
Since Dagger might be an incremental adoption for folks, setting WithDockerIgnore(ignorefile) as a method would be fantastic to allow incremental adoption while respecting the incremental adoption of Dagger.
Sending 4.5 GB to the buildkit daemon build context 😅
The intended way to reduce the scope of the context is with the Include/Exclude options in Host.Directory:
source := client.Host().Directory(".", dagger.HostDirectoryOpts{
Exclude: []string{"node_modules/", "ci/"},
})
Full example...
:wave: just published a helper function to deal with this in my Golang dagger-libs project: https://github.com/marcosnils/dagger-libs/blob/main/ddocker/utils.go.
Here's an exmaple on how to use it:
appDir := client.Host().Directory(".", dagger.HostDirectoryOpts{
Exclude: ddocker.DockerIngoreExclude(".dockerignore"),
})
Related #3555
There's been confusion over the "lazy" model, what is sync vs what is async (few discord threads, feedback forum, live YouTube video, ...)
Not only it's confusing, it's one of great advantages of dagger and it's not being understood: write "procedural" code (e.g. container1.Exec, container1.Exec, anotherGraph.mount(container1, container2) and have everything run in parallel, as fast as possible)
I think we should:
- Document in the getting started (it's a major featu...
I agree this is a high-priority DX item. So a general 👍to spending time on all this now.
Embrace the laziness
+1 it's a strength of our compute model. We should embrace it and educate people upfront about it. Of course that is work :)
Handling of IDs
This one feels like a special case, I would like to discuss it a bit more before we cross any one-way doors.
My feeling so far:
- Developers seem to find the ID handling part of our Go API confusing
- Hiding it is probabl...
Update: Need to update the description here. It's currently outdated but it's still much needed.
@slumbering was also thinking that for the TS SDK, where you can start typing functions, but if you just stop there, you're actually running nothing.
I was thinking about maybe some linter that would analyze that and underline some code that would execute nothing.
But I agree with the fact that this way of lazy evaluation is a strength and we should document it more no matter what we decide to do on the other hand.
@vikram-dagger, we need to move this forward. Can you help?
Updated description of the problem in:
- #4668
For the last "Maybe: Force evaluation of "unsolved" nodes at .Close() time?" I have a separate proposal:
- #4928
Continuing the discussion here: https://github.com/dagger/dagger/pull/3421#issuecomment-1296089591
This is all just my interpretation and summary of that discussion, @vito please correct me if I misrepresent anything.
Problem
Buildkit sessions are hard to work with as is. They result in certain state being sticky for the duration of a client connection. But once that connection is closed, you can't resume the session or otherwise reobtain that sticky state.
Examples of state as...
Does this also include the problem of scoping cache volume names, or is that unrelated?
Does this also include the problem of scoping cache volume names, or is that unrelated?
Good question, I think this isn't necessarily tied into that namespacing problem, but there might be potential for them to have overlapping or at least conceptually similar solutions.
Thinking out loud:
For example, if you submit a query that internally gets the ID of a cache volume, then maybe the ID returned to you can be namespaced somehow (very similar to what's described in Solution A abo...
@sipsma I'm guessing this change (https://github.com/moby/buildkit/pull/3332) will be helpful for implementing source pinning? Looks like that dropped in the v0.11.0-rc2 buildkit release
@jlongtine
I'm guessing this change (https://github.com/moby/buildkit/pull/3332) will be helpful for implementing source pinning? Looks like that dropped in the v0.11.0-rc2 buildkit release
Yep! That's the follow up of the PR I linked in the description, glad to see it got in for v0.11. Still need to figure out whether+how we can integrate this w/ dagger, but it's pretty powerful and nice to have that flexibility when needed.
That's awesome! I can see it coming in handy!
Problem
In the documentation, we talk about the Dagger Engine in these terms:
Using the SDK, your program opens a new session to a Dagger Engine: either by connecting to an existing engine, or by provisioning one on-the-fly.
graph LR; subgraph program["Your Go program"] lib["Go library"] end engine["Dagger Engine"] oci["OCI container runtime"] subgraph A["your build pipeline"] A1[" "...
@sipsma Should we wait for Zenith before working on this issue?
I'll open a PR based on #3648 today :)
@gerhard PR closed, we shall wait for all the discussion to be resolved before continuing this one, should I move it back to stuck? Or just in the backlog?
Excellent initiative, but unfortunately bad timing, after 8 months on this architecture we decided to change it based on user feedback. See https://github.com/dagger/dagger/issues/5484
It's hard to figure out which operation logs belong too -- especially with lazy evaluation.
Something I'm discovering as I continue building is that the lazy execution makes debugging tricky -- it's sometimes difficult to tell what code in my build app generated which build instructions as expressed in the output.
Proposal:
- Bring back contextual logging from Europa (e.g. wrap logs with gra...
Proposal: Always dump logs to a file. Wrap errors in "See full logs at `
I think this deserves more discussion. In a production setting it may not be acceptable to have a "secret log file" accumulate somewhere. But maybe there's a way to mitigate this.
That's how npm/yarn does it, don't remember when exactly. You get an error and it says "go look at this file". It's a bit annoying but there's precedent in production.
Switch Engine to use zerolog (like Europa) so Engine / BuildKit logs can be interleaved
Yes please 🙂 I need JSON logs in the SDK to help improve how progress is shown to the user.
From users trying Dagger:
Complaints about the enormous stack trace that's produced. Why have the base64 encoded content in the output? It could use some TLC so that it makes the error you're interested in easy to find.
It's unclear to others why layers are out of order. I presumed this was because it was some sort of multi stage docker build thing, but I don't actually know either 🙂
It's unclear to others why layers are out of order. I presumed this was because it was some sort of multi stage docker build thing, but I don't actually know either 🙂
If that's regarding engine logs getting out of order, I've assumed it's because of the async nature of the engine (concurrency and parallelism). 🙂
While we're at it, there is an active proposal for a structured logging integrated in the stdlib.
https://github.com/golang/proposal/blob/master/design/56345-structured-logging.md
talk: https://opensourcelive.withgoogle.com/events/go-day-2022?talk=talk2
- Proposal: Always dump logs to a file. Wrap errors in "See full logs at `
I think this deserves more discussion. In a production setting it may not be acceptable to have a "secret log file" accumulate somewhere. But maybe there's a way to mitigate this.
IMO it would be better (but perhaps more difficult?) to 1) extract the relevant error message in the error itself, and 2) separately let users configure where and how to log
Sometimes, the code snippets aren't updated from the netlify build, and manual intervention is neccessary:
This hasn't really gone away, and is a bit annoying - we should either:
- Disable the cache entirely, and suffer through the slower deployment times
- Fix the underlying issue (ideally)
Just opening this to track, not 100% sure what's actually going on.
FYI @vikram-dagger
I've noticed this as well and still haven't found an identifiable pattern for when the cache is refreshed vs when not. As best I can see, if there's a change in an include-d file (as opposed to an actual output page), it's not picked up as a change and the cache gets used. However, even this doesn't happen every time.
What are you trying to do?
Browsing the Haxe docs the other day (https://haxe.org/manual/introduction.html) I've found it's commenting system quite friendly which lead me to this GH project https://github.com/utterance that allows enabling native GH issues as comments to docs / blogpost pages.
Since we don't have that in Dagger docs or blogposts I was thinking that it might be a good idea to give it a try
cc @slumbering @gerhard @shykes
Why is this important to you?
Get rap...
What is the issue?
It will be useful to have an example cookbook for adding a docker dind sidecar. It is slightly different from the other service examples in the cookbooks as you have to add the DOCKER_HOST to the consumer for it to work. The only example is in the dagger code here but it is set to invalidate cache every run - https://github.com/dagger/dagger/blob/aacce090406f99fed23c969fcef769d532f2b587/core/integration/container_test.go#L3260
More details in this discussion - h...
Yes, I think so too! cc @vikram-dagger
We should add the feature to resize the editor and response for the embeds manually, as it would improve the UX.
Right now, the feature does not exist and the height of both the editor and the response elements is hard-coded in CSS.
Is this still relevant @crjm @vikram-dagger? If yes, do you want to do anything about it?
What is the issue?
ref: https://discord.com/channels/707636530424053791/1134415015198330981
We have a cookbook that explains how to clone private repositories here https://docs.dagger.io/710884/private-repositories/. Having said that, in some cases like go private modules a bit more tweaking is necessary. Here's an example of how I had to configure my dagger pipeline to make it work:
_, err = client.Pipeline("build").
Container().
From("golang:1.20").
...
@vikram-dagger I can help on this one, any thought? Since it's go specialised I don't know where we should write it
:wave: adding another option by using Githu's fine-grained tokens. ref: https://discord.com/channels/707636530424053791/1275877411497447466
func (m *Lala) Test(src *dagger.Directory, token *dagger.Secret) *dagger.Container {
return dag.
Container().
From("golang:1.23").
WithDirectory("/app", src).
WithWorkdir("/app").
WithSecretVariable("GITHUB_TOKEN", token).
WithExec([]string{"bash", "-c", `git config --global url."https:...
@vikram-dagger I can help on this one, any thought? Since it's go specialised I don't know where we should write it
Thanks for contributing this. It can be written as a Go-specific guide, in the Guides area of the docs. We already have another one which is also Go-specific: https://docs.dagger.io/110632/embed-directories
What is the issue?
We should provide documentation/guidance for effective methods of abstracting + reusing (within a repo or org):
- pipeline components. wrappers for building parts of a container that are reused across multiple parts of a pipeline
- subpipelines. Reusing entire subpipelines across multiple pipelines like a github action
- entire pipelines. Reuse common pipelines across multiple repos without reimplementing
@vikram-dagger a user requested this because they are trying to understand how to fit Dagger into their use case properly. I think this could help many other users understand best practices too.
What?
Create a multi-language guide to cover the importance of thinking about concurrency for improving performance. It can make a significant impact, but many users aren't familiar with it. No need to be exhaustive, just the essential for dagger, an example, and sharing resources to learn more.
### Common
- [ ] Simple concurrency explanation (an analogy and images may help)
### Language specific
- [ ] Example
- [ ] Explanation
- [ ] Lear...
#5833 doesn't resolve this since it's just a cookbook.
The point of the guide is for users to understand that concurrency matters, otherwise you can hit a bottleneck pretty easily without realizing. That's the point of the above examples: it takes much longer to execute tasks in sequence when they can run concurrently.
Additionally, the guide can provide resources to learn more about concurrent programming in each language.
https://github.com/dagger/dagger/pull/5833 doesn't resolve this since it's just a cookbook.
@vikram-dagger asked me to transform it into a cookbook, what was missing for it to be a guide?
I could add a more diagrams and resources by I feared that it would be too overwhelming for the users and make it look really complex to add concurrency to Dagger where it's actually something pretty simple. This is why I focused the PR on code example than theoretical explanations.
That's the how, what's missing is the why. If users don't reach for concurrency when it makes sense it can be a bottleneck.
What happened? What did you expect to happen?
I'm sharing the docker.sock with the go test container.
Locally on docker desktop it works if I add TC_HOST=host.docker.internal but on github actions it does not work.
Hi @vic3lord,
I'm not sure to fully understand 👼 . Can you please detail the issue / paste a repro here so that we can isolate the root cause as fast as possible 😇
Also, could you also reference your github action workflow ?
Hey @grouville,
They issue is that host.docker.internal isn't available for some reason on Github actions but it does exist on "docker for desktop"
- My github action is just calling the go binary dagger workflow.
- It's trying to access the postgres container but it's timing out due to the issue with host networking.
- I setup the postgres container via
_test.gofile and https://golang.testcontainers.org
I moved away from test containers to dagger service containers just for CI (although it's a bit of a pain to manage different versions of code between go test to when it's a dagger workflow)
dagger
Nice, I was to propose that. The other things that should work (I was about to explore tomorrow, as it's easter today), is to rely on Colima as your container runtime.
Following their docs, it totally seems compatible: https://github.com/abiosoft/colima/blob/65ee3d284b81bfebc09783f5e35a186584aa4bc1/docs/FAQ.md?plain=1#L148-L161
It would require some ...
reopening to ensure that we solved for @vic3lord 's problem.
@vic3lord is there anything else that you'd like to see from Dagger to make this experience easier? Is there documentation that you'd expect to see for this workaround?
I moved away from test containers to dagger service containers just for CI (although it's a bit of a pain to manage different versions of code between go test to when it's a dagger workflow)
@vikram-dagger , I am adding a docs tag since I think we should docum...
@mircubed I'm not sure changing the runtime to colima is a good alternative for the basic docker we already get in github actions.
- We either need a way to get the docker gateway using the SDK (which isn't available in docker for linux it's a trick for docker for mac/windows only)
- Or we should be able to run long running containers for development and
dagger servicesalongside those for TDD cycles without killing those at the end
I'm running into this same issue, let me see if I can clarify my use case.
I've got code running with a "testcontainers" container (in my case Vault). While I could probably adjust this to use Dagger service containers, it works currently with go test outside of Dagger. Most importantly to me, that means it works easily through my IDE (where I'd like to get quick response for testing and coverage).
Rearranging the IDE test process to require Dagger and plumbing the coverage results...
If I understand correctly, you want to run integration tests with https://golang.testcontainers.org/ in GitHub Actions using Dagger. This requires for the Docker instance running in GitHub Actions to be available to the container running within Dagger. This diagram captures what I described:
graph TD
subgraph "GitHub Actions"
subgraph "Docker"
socket(unix:///var/run/docker.sock)
subgraph "Dagger"
go-test
end
...
I still think this is still an issue am not able to run testcontainer test inside of dagger runtime, which spawn up postgres and etcd containers.
I am using colima and macOS M4. The error I see is related to cgroups, I tried the approach mentioned here https://github.com/dagger/dagger/issues/5292#issuecomment-1593750070 but for some reason the entrypoint doesn't really get picked up, not sure what am I missing over here
ENTRYPOINT_CGROUP_V2 = """#!/bin/sh
set -o errexit
s...
What are you trying to do?
From https://docs.dagger.io/core-concepts/checks/. The Elixir SDK requires adding checks to the function to annotate that it can be run via dagger check.
Why is this important to you?
Currently, the Elixir SDK cannot run it via dagger check.
How are you currently working around this?
No workaround.
Moved from issue #4684
I played with some tinygo.org a while back, and I wanted to use Dagger with it. After talking with @sipsma, it seems it wasn't supported by buildkit.
This is a request for host device passthrough support (e.g. /dev/ttyUSB0) to enable use cases like flashing microcontrollers from Dagger pipelines.
Originally filed by @dolanor on 2023-03-02
Moved from issue #5621
Buildkit has support for attestations, but Dagger has not yet integrated that into its APIs.
This is a request to expose SBOM and provenance attestation capabilities through Dagger's API.
Originally filed by @sipsma on 2023-08-11
Moved from issue #6476
When working with build results and generating final build artifacts, it's common to need to merge directories. While dag.Directory().WithDirectory("", other) works, a dedicated Merge method would better express intent (similar to Diff).
Originally filed by @sagikazarmark on 2024-01-22
Moved from issue #6883
Proposal: when calling dagger install outside a module, use the home directory as a pseudo-module. This would make dagger install always work regardless of the current working directory.
Benefits:
- Standardize best practices: "install first" is the recommended way
- First call of a module is faster
- Example commands are shorter
Originally filed by @shykes on 2024-03-14
Moved from issue #7357
Dagger is great at reading and executing Dockerfiles, but it would be useful to generate a Dockerfile from Dagger as well. This would help users who rewrite their Dockerfile in Dagger but still need docker-compose compatibility downstream.
Originally filed by @levlaz on 2024-05-10
Moved from issue #8111
Request to support Go's native time.Duration type as a function parameter in the Go SDK, instead of requiring users to accept a string and manually parse it.
Originally filed by @sagikazarmark on 2024-08-06
Moved from issue #8903
Slurm is an HPC scheduler used in large ML training jobs. It integrates with enroot which uses squashfs. Being able to export directly to squashfs would skip the intermediate OCI image export, saving time and disk space for images that are often tens of gigabytes.
Originally filed by @nfisher on 2024-11-08
Moved from issue #9109
Request for a way to express explicit ordering dependencies in the DAG between two containers without requiring an artifact to be passed between them. Current workaround is creating a dummy file in one container and mounting it in the other.
Use case: integration test setups where a service needs to be initialized before other containers can use it.
Originally filed by @joeshaw on 2024-12-04
Moved from issue #9607
Proposal for a deferCache option that would omit caching individual steps and instead aggregate caching onto later steps. This would help with sequences of commands (e.g. installing tools via nvm) where intermediate cache entries are wasteful and the final result is what matters.
Originally filed by @JacobLey on 2025-02-17