Dagger
Search

ci-report

This module aggregates the machine-readable outputs of a pipeline run
(Azure DevOps timeline, Trivy SARIF/SBOM, sanitized plan summary) and asks
an LLM to synthesize a readable execution report (markdown, HTML, or PDF).

Unlike the intel module, there is no web search and no MCP server: the inputs
are read in Go and injected deterministically into the prompt. The LLM model
provider is resolved by the Dagger engine via OPENAI_* environment variables
(works with OpenAI, Azure OpenAI, or a local OpenAI-compatible endpoint).

Installation

dagger install dev.azure.com/dordogne/DAGGER-TEMPLATES/_git/DAGGER-TEMPLATES/llm/ci-report@6f6f022cb5f4f8c0f66a21286e7a7fc118bd4288

Entrypoint

Return Type
CiReport !
Example
dagger -m dev.azure.com/dordogne/DAGGER-TEMPLATES/_git/DAGGER-TEMPLATES/llm/ci-report@6f6f022cb5f4f8c0f66a21286e7a7fc118bd4288 call \
func (m *MyModule) Example() *dagger.CiReport  {
	return dag.
			Cireport()
}
@function
def example() -> dagger.CiReport:
	return (
		dag.ci_report()
	)
@func()
example(): CiReport {
	return dag
		.ciReport()
}

Types

CiReport 🔗

CiReport synthesizes a CI/CD run report from pipeline artifacts.

generateReport() 🔗

GenerateReport aggregates the machine-readable outputs of a CI/CD run into a French execution report.

Inputs are deliberately limited to non-sensitive data: the Azure DevOps timeline (stage/job statuses and durations), Trivy SARIF/SBOM reports, an optional sanitized plan summary (resource addresses + actions only), an optional code-change summary (commit list + diffstat since the previous deployment), and optional failed-step logs for root-cause analysis. The raw Terraform plan (tfplan.json / plan.txt) must NEVER be passed here — it embeds resolved secret values.

The LLM model provider is resolved by the Dagger engine via the OPENAI_* environment variables (OpenAI, Azure OpenAI, or a local endpoint).

The format parameter controls the output (default: “markdown”): - “markdown”: .md file - “html”: standalone .html with inlined CSS (Teams/email friendly) - “pdf”: .pdf generated via Typst

Return Type
File !
Arguments
NameTypeDefault ValueDescription
timelineFile !-

Azure DevOps build timeline JSON (REST API …/builds/{id}/timeline)

pipelineString !-

Pipeline name (e.g. “AD.DORDOGNE.FR”)

environmentString !-

Target environment (e.g. “RC”, “PROD”)

versionString !-

Deployed version / tag

statusString !-

Aggregate run status (e.g. $(Agent.JobStatus))

securityReportsDirectory -

Directory with Trivy reports: *.sarif and/or CycloneDX *.json SBOM

planSummaryFile -

Sanitized Terraform plan summary (address + actions only, NO values)

codeChangesFile -

Code changes since the previous deployment (commit list

failureLogsFile -

Logs of the failed step(s), for root-cause analysis on deployment failure

formatString "markdown"

Output format: markdown, html, pdf

Example
dagger -m dev.azure.com/dordogne/DAGGER-TEMPLATES/_git/DAGGER-TEMPLATES/llm/ci-report@6f6f022cb5f4f8c0f66a21286e7a7fc118bd4288 call \
 generate-report --timeline file:path --pipeline string --environment string --version string --status string
func (m *MyModule) Example(timeline *dagger.File, pipeline string, environment string, version string, status string) *dagger.File  {
	return dag.
			Cireport().
			Generatereport(timeline, pipeline, environment, version, status)
}
@function
def example(timeline: dagger.File, pipeline: str, environment: str, version: str, status: str) -> dagger.File:
	return (
		dag.ci_report()
		.generatereport(timeline, pipeline, environment, version, status)
	)
@func()
example(timeline: File, pipeline: string, environment: string, version: string, status: string): File {
	return dag
		.ciReport()
		.generateReport(timeline, pipeline, environment, version, status)
}