Skip to content

Add preliminary job_runs resource#5603

Open
radakam wants to merge 17 commits into
mainfrom
job-runs-resource
Open

Add preliminary job_runs resource#5603
radakam wants to merge 17 commits into
mainfrom
job-runs-resource

Conversation

@radakam

@radakam radakam commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Changes

Add a job_runs bundle resource (direct engine). Deploying it triggers a job run via the Jobs RunNow API and stores the run id in state.

resources:
  job_runs:
    my_run:
      job_id: ${resources.jobs.my_job.id}

Includes the resource + direct CRUD, lifecycle config, generated schema/validation, run_as handling, the run URL in bundle summary, acceptance tests, and updates to the resource-enumeration tests.

Because a run isn't a normal CRUD resource, a few deliberate choices:

  • Create = trigger (RunNow); the run id is the tracked identity.
  • No update: there's no API to modify a run, so all request fields are recreate_on_changes — changes re-trigger a fresh run.
  • No-op delete: a triggered run can't be "undeployed". On recreate the framework calls delete before create, so a no-op delete + RunNow re-triggers the run.
  • Ignore drift: GetRun echoes the run's overriding parameters faithfully, so DoRead maps just those back and the framework diffs them directly. Everything GetRun does not return faithfully is ignore_remote_changes: the request-only inputs (idempotency_token, only, performance_target, queue), the local-only job_settings snapshot, and job_parametersGetRun resolves the job's full parameter set (including defaults the run never overrode), so diffing it directly would look like perpetual drift.
  • run_as: RunNow has no run_as, so a differing bundle run_as is rejected early.

Re-triggering on job changes (job_settings)

RunNow only carries the stable job_id, so a run has no way to notice that the targeted job's definition changed. To support that, the resource has an optional job_settings field that snapshots the job. Point it at a whole-job reference and any change to the job re-triggers the run (the snapshot is recreate_on_changes):

resources:
  job_runs:
    my_run:
      job_id: ${resources.jobs.my_job.id}
      # Snapshot the whole job so any change to it re-triggers the run.
      job_settings: ${resources.jobs.my_job}

The snapshot is a local-only input: GetRun never returns it, so it's ignore_remote_changes to avoid spurious drift.

Run URL in bundle summary

A run's URL is jobs/<job id>/runs/<run id>. The run id comes from state, but the run's job_id is a ${resources.jobs.*.id} reference that's only resolved at deploy, so at summary it reads 0 (rendering jobs/0/...) even after a deploy. We restore the run's job_id from its state blob (like the dashboard etag) and write it back into config like id; JobRun.InitializeURL then builds the URL via workspaceurls.JobRunURL, guarding on both ids so a not-yet-deployed run stays blank. job_runs stays in the noURL test list since its two-id URL can't be a single-id pattern.

Closes DECO-27355.

(Waiting for completion is deferred to a later milestone.)

Why

Today, triggering a job as part of bundle deploy requires custom scripts outside the bundle. This project adds a resources.job_runs section to direct engine so users can declaratively run jobs as part of deployment — e.g. schema migrations, model training, data prep.

Tests

  • Acceptance:
    • job_runs/basic — one run-now, run id stored, redeploy doesn't re-trigger, run URL shown in post-deploy summary, clean destroy.
    • job_runs/redeploy — changing job_parameters re-triggers a second, different run.
    • job_runs/job_parameters — overriding only one of the job's two parameters stays a stable no-op plan, proving the resolved job default isn't read as drift.
    • job_runs/notebook_change — changing the targeted job's notebook_path re-triggers the run via the job_settings snapshot.
  • TestAll/job_runs direct CRUD.
  • workspaceurls.JobRunURL unit test (plain + ?w= workspace-id forms).
  • Testserver RunNow/GetRun now echo the job's resolved parameters and the run's overriding parameters so reads round-trip.
  • Updated/passing: run_as, permissions, target-mode, Terraform lifecycle, bind-support enumeration, workspace-URL completeness (job_runs stays in noURL — two-id URL built in InitializeURL), and StateToBundle enumeration tests.

@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 07:21 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 07:21 — with GitHub Actions Inactive
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: f0427e0

Run: 27827867545

Env 🔄​flaky 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
💚​ aws linux 7 13 265 1015 7:14
💚​ aws windows 7 13 267 1013 8:18
💚​ aws-ucws linux 7 13 361 929 6:13
💚​ aws-ucws windows 7 13 363 927 9:42
💚​ azure linux 1 15 268 1013 5:48
💚​ azure windows 1 15 270 1011 8:22
💚​ azure-ucws linux 1 15 366 925 7:03
🔄​ azure-ucws windows 3 1 15 365 923 12:26
💚​ gcp linux 1 15 264 1016 6:54
💚​ gcp windows 1 15 266 1014 9:08
23 interesting tests: 13 SKIP, 7 RECOVERED, 3 flaky
Test Name aws linux aws windows aws-ucws linux aws-ucws windows azure linux azure windows azure-ucws linux azure-ucws windows gcp linux gcp windows
💚​ TestAccept 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/permissions 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions 💚​R 💚​R 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R 💚​R 💚​R
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R 💚​R 💚​R
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions 💚​R 💚​R 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R 💚​R 💚​R
💚​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/resources/postgres_branches/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/recreate 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/replace_existing 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/update_protected 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/without_branch_id 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_endpoints/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_projects/update_display_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/synced_database_tables/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🔄​ TestFetchRepositoryInfoAPI_FromRepo ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🔄​ TestFetchRepositoryInfoAPI_FromRepo/root ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🔄​ TestFetchRepositoryInfoAPI_FromRepo/subdir ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
Top 26 slowest tests (at least 2 minutes):
duration env testname
4:43 gcp linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
4:40 gcp windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
4:25 gcp windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:59 gcp linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:34 azure windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:33 gcp windows TestAccept
3:33 azure-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:30 aws-ucws windows TestAccept
3:26 azure windows TestAccept
3:25 aws windows TestAccept
3:24 azure-ucws windows TestAccept
3:21 azure-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:19 aws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:17 aws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:15 azure-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:14 aws-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:11 aws-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:06 aws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:03 aws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:59 azure-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:50 azure linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:42 azure windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:42 aws-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:38 aws linux TestSecretsPutSecretStringValue
2:33 aws-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:33 azure linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct

@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 10:55 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 10:55 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:01 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:01 — with GitHub Actions Inactive
@radakam radakam force-pushed the job-runs-resource branch from 63df005 to ff9faea Compare June 15, 2026 12:02
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:03 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:03 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:40 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:40 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:50 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 12:50 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:24 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:24 — with GitHub Actions Inactive
@radakam radakam force-pushed the job-runs-resource branch from a899c09 to 3fb23a7 Compare June 15, 2026 13:24
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:25 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:25 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:45 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 13:45 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 14:29 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 15, 2026 14:29 — with GitHub Actions Inactive
@radakam radakam marked this pull request as ready for review June 15, 2026 18:54
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Approval status: pending

/acceptance/bundle/ - needs approval

21 files changed
Suggested: @pietern
Also eligible: @janniklasrose, @denik, @andrewnester, @shreyas-goenka, @anton-107, @lennartkats-db

/bundle/ - needs approval

22 files changed
Suggested: @pietern
Also eligible: @janniklasrose, @denik, @andrewnester, @shreyas-goenka, @anton-107, @lennartkats-db

General files (require maintainer)

4 files changed
Based on git history:

  • @pietern -- recent work in bundle/direct/dresources/, bundle/internal/validation/generated/, bundle/config/resources/

Any maintainer (@andrewnester, @anton-107, @denik, @pietern, @shreyas-goenka, @simonfaltum, @renaudhartert-db) can approve all areas.
See OWNERS for ownership rules.

Comment thread acceptance/bundle/resources/job_runs/basic/script
Comment thread bundle/direct/dresources/job_run.go Outdated
if err != nil {
return "", nil, err
}
return strconv.FormatInt(wait.RunId, 10), nil, nil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to store job_params and other fields from https://github.com/databricks/databricks-sdk-go/blob/bcf8559242f04e35469cf6fc6eaf77227f06080d/service/jobs/model.go#L3532 in order for framework to be able compute the diff, you can test it with bundle plan command

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done -- DoRead now maps the run's job_id, job_parameters, and overriding params from GetRun back into the RunNow shape, so the framework can diff them. Please let me know if I missed any fields!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DoRead is called when we read the state of the resource in the workspace and then we construct the state out of it.

The state we return here is what we actually created as a resource. We need to record the correct remote state here in order to calculate "out-of-band" diff correctly (aka comparing what DoRead computes and what we saved as part of DoCreate call)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DoCreate now returns the remote state instead of nil: since RunNow only hands back the run id, I reconstruct it from the request we just sent plus the new id. That's now what the out-of-band diff compares against on the next DoRead. The create-vs-read consistency check in all_test.go passes (the input-only bits like job_parameters/job_settings are covered by the ignore filter), and the job_runs acceptance tests stay green.

Comment thread acceptance/bundle/resources/job_runs/basic/script
Comment thread bundle/direct/dresources/job_run.go Outdated
// remote identity lives in RunId. Drift on the embedded request fields is
// suppressed via ignore_remote_changes in resources.yml.
type JobRunRemote struct {
jobs.RunNow

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it's better to embed jobs.Run here because this is what GetRun returns

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DoRead now maps the GetRun result back into RunNow shape. It seems that embedding jobs.Run would make the diff not line up as the remote needs to share field paths with the state (which is RunNow-shaped). Do you think it makes sense?

Comment thread acceptance/bundle/resources/job_runs/redeploy/script
Comment thread acceptance/bundle/resources/job_runs/basic/databricks.yml
@radakam radakam force-pushed the job-runs-resource branch from d6b00f5 to f7ec335 Compare June 17, 2026 14:32
@radakam radakam temporarily deployed to test-trigger-is June 17, 2026 14:33 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 17, 2026 14:33 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 17, 2026 15:05 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 08:08 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 08:21 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 08:21 — with GitHub Actions Inactive
radakam added 15 commits June 19, 2026 08:27
Introduce the job_runs bundle resource backed by the Jobs RunNow API.
This is a preliminary skeleton: it wires up the config type, the direct
engine resource, registration, and drift handling. Generated schema,
validation output, and tests are intentionally left for follow-ups.
Run the schema generator for the new job_runs resource and add real
descriptions for the job_runs map, JobRun.lifecycle, and
JobRun.python_named_params so the required-annotations guard test passes.
Regenerate the validation rules so job_runs picks up its required field
(job_id) and the performance_target enum. Missing required fields surface
as warnings via the existing validate:required mutator.
Deploy a bundle with a job and a job_run referencing it, and assert that
exactly one RunNow request is made and the returned run id is stored in
state. Restricted to the direct engine since job_runs has no Terraform
equivalent.
Verify that changing a job_run's configuration re-triggers the run: after
the initial deploy, a config change (job_parameters) causes a second,
distinct RunNow request on redeploy via the recreate-on-change path.
Several reflection/enumeration tests iterate or hardcode the full resource
set and were not updated when the job_runs resource was added, leaving CI
red. Add job_runs to each: the run_as allResourceTypes list, the permissions
unsupportedResources list, the target-mode mock bundle, the Terraform
lifecycle skip list (direct-only), a bind fixture + GetRun mock, and a direct
CRUD fixture that triggers a run against a newly created job. The CRUD test
also treats job_runs as a no-op delete, since a triggered run cannot be
undeployed and stays readable afterward.
Fully populate the GetRunRequest and JobRunRemote literals in job_run.go to
satisfy exhaustruct, and regenerate the schema/refschema/apitypes artifacts so
the committed job_runs generated files match their generators.
Add job_runs coverage to the two reflection-driven completeness tests:
add "job_runs" to the noURL set in TestBundleResourcePluralNamesResolveInWorkspaceURLs
(no stable workspace URL yet) and exercise Resources.JobRuns in the
StateToBundle test suite.
Add a notebook_change acceptance test that verifies editing a job's
notebook_path updates the job (jobs/reset) without re-triggering the run,
confirming the run only recreates when its own RunNow config changes.

Also extend the basic and redeploy tests with plan/summary/validate traces
to make the deploy lifecycle visible in the recorded output.
Map GetRun fields (job_id, job_parameters, overriding parameters) back into
the RunNow shape in DoRead instead of returning an empty RunNow, so the
framework can compute a real diff for the run config.

Add a job_settings snapshot to the job_run config and state: setting
job_settings to a whole-job reference (e.g. ${resources.jobs.my_job}) lets a
change to the targeted job re-trigger the run, since the snapshot is marked
recreate_on_changes. The notebook_change acceptance test now asserts a
notebook_path edit re-triggers the run via this snapshot.

Regenerate schema/validation artifacts for the new job_settings field.
Avoid partial struct literals in job_run DoRead so exhaustruct passes,
and raise the config.Root field-count upper bound now that job_runs
snapshots a full job_settings.
DoRead now records the run's remote state as what we actually created: the
job_id and the overriding parameters GetRun echoes back. It no longer maps
run.JobParameters, which GetRun resolves to the job's full parameter set
(including defaults the run never overrode) and which therefore does not
represent what we created; that field is handled via ignore_remote_changes.

The local diff (config vs saved state) still re-triggers a run on any
job_parameters change via recreate_on_changes, independent of DoRead. The
testserver now resolves the full parameter set like the real GetRun, and a
new acceptance test asserts the resolved default does not look like drift.
RunNow's response only carries the new run id, so DoCreate previously
returned nil remote state. Reconstruct it from the request we just sent
plus the run id, giving the framework a faithful record of what we
created to compute the out-of-band diff against DoRead.
Regenerate out.fields.txt after rebasing onto main, which bumped
databricks-sdk-go to v0.147.0. The new SDK adds
azure_attributes.capacity_reservation_group, which the validate-generated
job picks up when generating against the PR-merged-with-main commit.
@radakam radakam force-pushed the job-runs-resource branch from 9df3417 to 8a71c9e Compare June 19, 2026 08:30
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 08:30 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 08:30 — with GitHub Actions Inactive
@andrewnester andrewnester requested review from denik and pietern June 19, 2026 10:34
Comment thread python/codegen/uv.lock Outdated
These pypi-proxy registry rewrites in python/uv.lock and
python/codegen/uv.lock were environment artifacts unrelated to the
job_runs resource. Restore both lockfiles to match main.
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 10:43 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 10:43 — with GitHub Actions Inactive
A run's URL needs both its run id and its parent job id. The run id is
restored from state like any resource, but the job id in config comes from
a ${resources.jobs.*.id} reference that is only resolved at deploy, so at
read time it is 0 and the URL would render as jobs/0/runs/<runid>.

Restore the run's resolved job_id from state at load time (same mechanism
as id and the dashboard etag), then build the URL in JobRun.InitializeURL.
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 13:13 — with GitHub Actions Inactive
@radakam radakam temporarily deployed to test-trigger-is June 19, 2026 13:13 — with GitHub Actions Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants