-
-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[bug] Dependency chains are not respected in moon ci
#1624
Comments
@kikones34 This is by design at the moment. The "run dependents" logic only applies to direct dependents of affected tasks, and not the entire tree. It was built this way as a simple regression testing mechanism and ensuring a change in a project didn't affect it's immediate consumers. However, we can probably add an option to control the depth. |
@milesj Oh, I see. The problem is that this breaks the way we're managing inter-project dependencies. In the real-world use case, what we actually have is:
This has worked perfectly as far as caching goes, but I'm finding it impossible to replicate with the CI feature. |
@kikones34 Yah that makes sense. Are you able to use |
Yeah for now we're using |
I'll look into supporting deep dependents in the next release. |
I've made some changes in v1.29, can you give that a shot? |
I've been checking out the new tracker logs and CLI options |
Yeah |
@milesj can you please elaborate on why this is the intended behavior of moon ci? We could put the outputs of a dependency as an inputs for the task like so: # app1
tasks:
build:
command: build
inputs:
- 'src/**/*'
outputs:
- bin/main # app2
tasks:
build:
deps:
- app1:build
command: build
inputs:
- 'src/**/*'
- /app1/bin/main
outputs:
- bin/main # app3
tasks:
build:
deps:
- app2:build
command: build
inputs:
- 'src/**/*'
- /app2/bin/main
outputs:
- bin/main However, moon generates the graph before the outputs are generated so this doesn't work. So it seems that at the current state |
@dudicoco Why are the outputs of dep task used as inputs for the owning task? This shouldn't be necessary, since the dep task itself is considered an "input". |
@kikones34 v1.30 now properly supports tasks in the affected tracker, so |
@milesj if my dep task produces an artifact which the next task needs to use as input for its build then this is neccessary. If you look at how bazel works this happens everywhere basically, for example:
|
@dudicoco Yes I've used Bazel many times. In moon however, inputs are pretty much only used to generate the task hash (for caching). We do this by running each input through Because of this, you don't need the output of another task (A) as the input of a task (B). Because if that other task (A) generates a new output (a binary in your example), its new task hash will trigger a recomputed task hash in the downstream task (B). Here's an example of the hash manifest: [
{
"command": "packemon",
"args": [
"--addExports",
"--addFiles",
"--declaration",
"build"
],
"deps": {
"types:build": "051aee1254b3632bed9a24881ee7b9d8291fb64c301827241f442e005f2e6fe2"
},
"env": {
"NODE_ENV": "production"
},
"inputs": {
".moon/tasks/node.yml": "0d12b1661063be4206079ee064ddae38ccd1c828",
".moon/toolchain.yml": "a22995b47346668753102ec84334da6284263140",
".moon/workspace.yml": "c49cd7311e1fb927f533deafb811bbce8c1b617b",
"packages/nx-compat/package.json": "de182d2331dd91e282cd8e96ca7d71759d87b29f",
"packages/nx-compat/src/bin.ts": "928e5165417cb29e9905c9434d035054e25f32c3",
"packages/nx-compat/src/execute.ts": "5bbb9d24cdcc14acc9f83544c0236366f25aa9b8",
"packages/nx-compat/src/helpers.ts": "45746a7465117d5987fe10182cd5382e123d5278",
"packages/nx-compat/src/index.ts": "cff9946dfbb065ba98b08c87977da2efa6ccc2b6",
"packages/nx-compat/src/moon.ts": "ac0e3496c4b6d885983b9240df2883c528278328",
"packages/nx-compat/src/nx.ts": "247193c029bc2bf75657ec5dfe5072370b75081d",
"packages/nx-compat/tsconfig.json": "a11ef0030ba77f737a945aa9caa4796e1656f07f",
"packages/nx-compat/tsconfig.mjs.json": "fea3aa02bbc1d48e15c06a178279d60b35461adc",
"tsconfig.options.json": "720b9c8f7dc0b6c38c33f4a6e26fff5fb5fc95d0"
},
"inputEnv": {},
"outputs": [
"mjs"
],
"platform": "node",
"projectDeps": [
"types"
],
"script": null,
"target": "nx-compat:build",
"version": "2"
},
} As you can see, |
@milesj i'll try to illustrate what I believe is the problem:
As you can see in this example, app3 needs the output of of app2 as its input in order to produce output, app2 in turn needs the output of app1 as input in order to produce output. |
@kikones34 This should work much better in v1.30. We have a test case that does exactly that: https://github.com/moonrepo/moon/blob/master/crates/affected/tests/affected_tracker_test.rs#L733 |
So this was resolved in v1.30, but it introduced another undesired behavior, see #1736 |
Awesome, I'll close this for now. |
Describe the bug
If you have a dependency chain task1 -> task2 -> task3, when task1 is touched,
moon ci
will only execute task2 and it will not propagate to task3.Steps to reproduce
Configure three tasks as follows:
Commit everything to the default git branch.
moon ci
shouldn't execute anything.Now, modify the file
dependency-input.txt
and executemoon ci
. Thedependency-checker
task is run, but thedependent
is not:Expected behavior
The task
dependent
should also be executed since it depends ondependency-checker
.Additional context
Note that these dependency chains behave correctly regarding the cache logic (so if
dependency
is dirty, it will propagate the dirty state up todependent
). The issue only occurs inmoon ci
.The text was updated successfully, but these errors were encountered: