Skip to content

fix(plugin-testops): Send the CI descriptor TestOps actually expects - #888

Closed
todti wants to merge 2 commits into
mainfrom
fix/testops-ci-descriptor
Closed

fix(plugin-testops): Send the CI descriptor TestOps actually expects#888
todti wants to merge 2 commits into
mainfrom
fix/testops-ci-descriptor

Conversation

@todti

@todti todti commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Context

Uploading results from an Azure DevOps pipeline produces a Job in TestOps that

  1. is named <projectGuid>_<definitionId> instead of the pipeline name, and
  2. cannot be triggered back from TestOps — the run fails with "build server is not configured for job".

These look like one bug but are two independent ones.

The job is never bound to a build server. startUpload() sent the CI block as { name: ci.type }, while TestOps identifies the CI by type and endpoint and ignores anything else. With neither of them present it cannot tell which build server integration the job belongs to, so the job is stored without one — and the unknown property is dropped without an error, so the upload succeeds and nothing hints at the problem until someone presses Run. This is not Azure-specific: the endpoint was never sent for any CI, so build server binding never worked anywhere.

The job name was the uid. job.name was set to ci.jobUid, and ci.jobName (Build.DefinitionName on Azure, Release.DefinitionName for classic releases) was never sent. Triggering itself relies on job.uid, which already has the shape TestOps parses — so the name is a display defect rather than the reason runs fail.

What changed

  • ci: { type, endpoint } instead of ci: { name }. The endpoint is the origin of ci.jobUrl — enough for TestOps to recognise the integration, and unlike SYSTEM_COLLECTIONURI it carries no trailing slash.
  • job.name falls back to the uid only when the CI reports no name, and job.url is sent.
  • jobRun.name and jobRun.url are sent; TestOps stores both and refreshes them on every upload.
  • Azure job and job run URLs no longer carry a double slash: SYSTEM_COLLECTIONURI always ends with one, and the URLs were built by concatenation. Harmless while nothing read them, but the job URL is stored once and never refreshed.
  • circle and amazon are reported under the names TestOps uses for those integrations (circleci, aws). The job uids both detectors produce already match what it expects, so the type name was the only thing missing.

Known limitations

  • Not retroactive. TestOps keeps the name and the integration of a job it already knows, so jobs created before this fix keep their name and stay unbound — they have to be re-created there.
  • drone still resolves to no integration type: TestOps has none matching it.

Checklist

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

Allure Report Summary

Name Duration Stats New Flaky Retry Report
Allure 3 Report (plugin-allure2) 43m 13s Passed tests 10151   Skipped tests 15   Unknown tests 24 6 0 33 View
Allure 3 Report 43m 13s Passed tests 10151   Skipped tests 15   Unknown tests 24 6 0 33 View
Allure 3 Report (plugin-classic) 43m 13s Passed tests 10151   Skipped tests 15   Unknown tests 24 6 0 33 View
My Dashboard 43m 13s Passed tests 10151   Skipped tests 15   Unknown tests 24 6 0 33 View
Allure Report 0s 0 0 0

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

Allure perf metrics

Generated at: 2026-09-01T15:55:09.705Z

Phase Count Total Avg Min Max
restoreState.total 1 2733.4 ms 2733.4 ms 2733.4 ms 2733.4 ms
restoreState.dump 3 2732.8 ms 910.9 ms 793.5 ms 976.4 ms
restoreState.attachments 3 2094.7 ms 698.2 ms 609.0 ms 751.6 ms
restoreState.storeRestore 3 189.9 ms 63.3 ms 55.1 ms 72.4 ms
generate.total 1 17287.1 ms 17287.1 ms 17287.1 ms 17287.1 ms
generate.plugins.done 1 16695.7 ms 16695.7 ms 16695.7 ms 16695.7 ms
publish.upload.total 1 443492.3 ms 443492.3 ms 443492.3 ms 443492.3 ms
summary.generate 2 14.0 ms 7.0 ms 7.0 ms 7.0 ms
generate.plugin.done.agent 1 0.1 ms 0.1 ms 0.1 ms 0.1 ms
generate.plugin.done.allure2 1 3872.5 ms 3872.5 ms 3872.5 ms 3872.5 ms
generate.plugin.done.awesome 1 6586.0 ms 6586.0 ms 6586.0 ms 6586.0 ms
generate.plugin.done.classic 1 5290.2 ms 5290.2 ms 5290.2 ms 5290.2 ms
generate.plugin.done.dashboard 1 941.8 ms 941.8 ms 941.8 ms 941.8 ms
generate.plugin.done.log 1 3.7 ms 3.7 ms 3.7 ms 3.7 ms
generate.plugin.done.testops 1 0.3 ms 0.3 ms 0.3 ms 0.3 ms
publish.upload.plugin.allure2 1 135436.6 ms 135436.6 ms 135436.6 ms 135436.6 ms
publish.upload.plugin.awesome 1 145508.9 ms 145508.9 ms 145508.9 ms 145508.9 ms
publish.upload.plugin.classic 1 123085.0 ms 123085.0 ms 123085.0 ms 123085.0 ms
publish.upload.plugin.dashboard 1 21897.1 ms 21897.1 ms 21897.1 ms 21897.1 ms

Artifacts: allure-perf-metrics

Uploading results from an Azure DevOps pipeline produces a Job in TestOps
that is named `<projectGuid>_<definitionId>` instead of the pipeline name,
and that cannot be triggered back from TestOps — the run fails with
"build server is not configured for job". These look like one bug but are
two independent ones.

`startUpload()` sent the CI block as `{ name: ci.type }`, while TestOps
identifies the CI by `type` and `endpoint` and ignores anything else. With
neither of them present it cannot tell which build server integration the
job belongs to, so the job is stored without one — and the unknown property
is dropped without an error, so the upload succeeds and nothing hints at the
problem until someone presses Run. This is not Azure-specific: the endpoint
was never sent for any CI.

The job name is a separate defect: `job.name` was set to `ci.jobUid`, and
`ci.jobName` (`Build.DefinitionName`, or `Release.DefinitionName` for classic
releases) was never sent. Triggering itself relies on `job.uid`, which already
has the shape TestOps parses.

- `ci: { type, endpoint }` instead of `ci: { name }`. The endpoint is the origin
  of `ci.jobUrl` — enough for TestOps to recognise the integration, and unlike
  `SYSTEM_COLLECTIONURI` it carries no trailing slash.
- `job.name` falls back to the uid only when the CI reports no name, and
  `job.url` is sent.
- `jobRun.name` and `jobRun.url` are sent; TestOps stores both and refreshes
  them on every upload.
- `circle` and `amazon` are reported under the names TestOps uses for those
  integrations, `circleci` and `aws`. The job uids both detectors produce
  already match what it expects. `drone` stays unmapped: TestOps has no
  matching integration type.

Jobs TestOps already knows keep their name and their integration, so jobs
created before this fix have to be re-created there.
@todti
todti force-pushed the fix/testops-ci-descriptor branch from 69190b0 to 5169504 Compare August 26, 2026 15:46
@todti todti mentioned this pull request Sep 1, 2026
3 tasks
@todti

todti commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded by #906 — this branch's content is fully merged there (byte-identical for #818/#888; #889's fixes cherry-picked in 52798bf).

@todti todti closed this Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant