-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#1340 Rendering a change log for build using GraphQL
- Loading branch information
1 parent
5ad9ef2
commit 3c50b7b
Showing
12 changed files
with
284 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 39 additions & 0 deletions
39
...ocs/src/docs/asciidoc/templating/sources/templating-source-build-changelog.adoc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
[[templating-source-build-changelog]] | ||
===== Build.changelog | ||
|
||
Renders a change log for this build. | ||
|
||
The "to build" is the one being referred to. | ||
|
||
The "from build" is the build whose ID is set by the "from" parameter. | ||
|
||
If `project` is set to a comma-separated list of strings, the change log will be rendered | ||
for the recursive links, in the order to the projects being set (going deeper and deeper | ||
in the links). | ||
|
||
Applicable for: | ||
|
||
* build | ||
|
||
Configuration: | ||
|
||
* **allQualifiers** - Boolean - required - Loop over all qualifiers for the last level of `dependencies`, including the default one. Qualifiers at `dependencies` take precedence. | ||
|
||
* **commitsOption** - NONE, OPTIONAL, ALWAYS - required - Defines how to render commits for a change log | ||
|
||
* **defaultQualifierFallback** - Boolean - required - If a qualifier has no previous link, uses the default qualifier (empty) qualifier. | ||
|
||
* **dependencies** - List - required - Comma-separated list of project links to follow one by one for a get deep change log. Each item in the list is either a project name, or a project name and qualifier separated by a colon (:). | ||
|
||
* **empty** - String - required - String to use to render an empty or non existent change log | ||
|
||
* **from** - Int - required - ID to the build to get the change log from | ||
|
||
* **title** - Boolean - required - Include a title for the change log | ||
|
||
Example: | ||
|
||
[source] | ||
---- | ||
${build.changelog?from=1} | ||
---- |
4 changes: 2 additions & 2 deletions
4
.../sources/templating-source-changelog.adoc → ...ating-source-promotion-run-changelog.adoc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
...rc/main/java/net/nemerosa/ontrack/extension/scm/service/BuildChangeLogTemplatingSource.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package net.nemerosa.ontrack.extension.scm.service | ||
|
||
import net.nemerosa.ontrack.extension.scm.changelog.ChangeLogTemplatingService | ||
import net.nemerosa.ontrack.extension.scm.changelog.ChangeLogTemplatingServiceConfig | ||
import net.nemerosa.ontrack.model.annotations.APIDescription | ||
import net.nemerosa.ontrack.model.docs.Documentation | ||
import net.nemerosa.ontrack.model.docs.DocumentationExampleCode | ||
import net.nemerosa.ontrack.model.docs.DocumentationQualifier | ||
import net.nemerosa.ontrack.model.events.EventRenderer | ||
import net.nemerosa.ontrack.model.structure.* | ||
import net.nemerosa.ontrack.model.templating.AbstractTemplatingSource | ||
import net.nemerosa.ontrack.model.templating.getRequiredTemplatingParam | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
@APIDescription( | ||
""" | ||
Renders a change log for this build. | ||
The "to build" is the one being referred to. | ||
The "from build" is the build whose ID is set by the "from" parameter. | ||
If `project` is set to a comma-separated list of strings, the change log will be rendered | ||
for the recursive links, in the order to the projects being set (going deeper and deeper | ||
in the links). | ||
""" | ||
) | ||
@Documentation(BuildChangeLogTemplatingSourceConfig::class) | ||
@DocumentationQualifier("build", "Build") | ||
@DocumentationExampleCode("${'$'}{build.changelog?from=1}") | ||
class BuildChangeLogTemplatingSource( | ||
private val changeLogTemplatingService: ChangeLogTemplatingService, | ||
private val structureService: StructureService, | ||
) : AbstractTemplatingSource( | ||
field = "changelog", | ||
type = ProjectEntityType.BUILD, | ||
) { | ||
|
||
override fun render(entity: ProjectEntity, configMap: Map<String, String>, renderer: EventRenderer): String { | ||
val empty = ChangeLogTemplatingServiceConfig.emptyValue(configMap) | ||
return if (entity is Build) { | ||
val fromId = configMap.getRequiredTemplatingParam(BuildChangeLogTemplatingSourceConfig::from.name).toInt() | ||
val from = structureService.getBuild(ID.of(fromId)) | ||
changeLogTemplatingService.render( | ||
fromBuild = entity, | ||
toBuild = from, | ||
configMap = configMap, | ||
renderer = renderer, | ||
) | ||
} else { | ||
empty | ||
} | ||
} | ||
|
||
} |
23 changes: 23 additions & 0 deletions
23
...n/java/net/nemerosa/ontrack/extension/scm/service/BuildChangeLogTemplatingSourceConfig.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package net.nemerosa.ontrack.extension.scm.service | ||
|
||
import net.nemerosa.ontrack.extension.scm.changelog.ChangeLogTemplatingCommitsOption | ||
import net.nemerosa.ontrack.extension.scm.changelog.ChangeLogTemplatingServiceConfig | ||
import net.nemerosa.ontrack.model.annotations.APIDescription | ||
|
||
class BuildChangeLogTemplatingSourceConfig( | ||
empty: String = "", | ||
dependencies: List<String> = emptyList(), | ||
title: Boolean = false, | ||
allQualifiers: Boolean = false, | ||
defaultQualifierFallback: Boolean = false, | ||
commitsOption: ChangeLogTemplatingCommitsOption = ChangeLogTemplatingCommitsOption.NONE, | ||
@APIDescription("ID to the build to get the change log from") | ||
val from: Int, | ||
) : ChangeLogTemplatingServiceConfig( | ||
empty, | ||
dependencies, | ||
title, | ||
allQualifiers, | ||
defaultQualifierFallback, | ||
commitsOption, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 2 additions & 2 deletions
4
...test/java/net/nemerosa/ontrack/extension/scm/changelog/AbstractSCMChangeLogTestSupport.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
...-scm/src/test/java/net/nemerosa/ontrack/extension/scm/changelog/BuildRenderChangeLogIT.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package net.nemerosa.ontrack.extension.scm.changelog | ||
|
||
import org.junit.jupiter.api.Test | ||
import kotlin.test.assertEquals | ||
|
||
class BuildRenderChangeLogIT: AbstractSCMChangeLogTestSupport() { | ||
|
||
/** | ||
* Rendering a change log using the GraphQL Build.render field. | ||
*/ | ||
@Test | ||
fun `Build render change log`() { | ||
prepareChangeLogTestCase { _, from, to -> | ||
run( | ||
""" | ||
query BuildChangeLog( | ||
${'$'}buildToId: Int!, | ||
${'$'}template: String!, | ||
) { | ||
build(id: ${'$'}buildToId) { | ||
render( | ||
format: "plain", | ||
template: ${'$'}template | ||
) | ||
} | ||
} | ||
""", | ||
mapOf( | ||
"buildToId" to to.id(), | ||
"template" to """ | ||
${'$'}{build.changelog?from=${from.id}} | ||
""".trimIndent() | ||
) | ||
) { data -> | ||
val render = data.path("build").path("render").asText() | ||
assertEquals( | ||
""" | ||
* ISS-21 Some new feature | ||
* ISS-22 Some fixes are needed | ||
* ISS-23 Some nicer UI | ||
""".trimIndent(), | ||
render | ||
) | ||
} | ||
} | ||
} | ||
|
||
} |
14 changes: 14 additions & 0 deletions
14
ontrack-model/src/main/java/net/nemerosa/ontrack/model/docs/DocumentationQualifier.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package net.nemerosa.ontrack.model.docs | ||
|
||
/** | ||
* Used by a class (or function, or property) to qualify a documented | ||
* element so that it can distinguished from a similar entry. | ||
*/ | ||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FIELD, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) | ||
@Retention(AnnotationRetention.RUNTIME) | ||
@MustBeDocumented | ||
@Repeatable | ||
annotation class DocumentationQualifier( | ||
val value: String, | ||
val name: String, | ||
) |
68 changes: 68 additions & 0 deletions
68
...c/main/java/net/nemerosa/ontrack/graphql/templating/RenderBuildGraphQLFieldContributor.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package net.nemerosa.ontrack.graphql.templating | ||
|
||
import graphql.Scalars.GraphQLString | ||
import graphql.schema.GraphQLFieldDefinition | ||
import net.nemerosa.ontrack.graphql.schema.GQLProjectEntityFieldContributor | ||
import net.nemerosa.ontrack.graphql.support.stringArgument | ||
import net.nemerosa.ontrack.graphql.support.toNotNull | ||
import net.nemerosa.ontrack.model.events.EventRendererRegistry | ||
import net.nemerosa.ontrack.model.events.PlainEventRenderer | ||
import net.nemerosa.ontrack.model.structure.Build | ||
import net.nemerosa.ontrack.model.structure.ProjectEntity | ||
import net.nemerosa.ontrack.model.structure.ProjectEntityType | ||
import net.nemerosa.ontrack.model.templating.TemplatingService | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
class RenderBuildGraphQLFieldContributor( | ||
private val templatingService: TemplatingService, | ||
private val eventRendererRegistry: EventRendererRegistry | ||
) : GQLProjectEntityFieldContributor { | ||
|
||
override fun getFields( | ||
projectEntityClass: Class<out ProjectEntity>, | ||
projectEntityType: ProjectEntityType | ||
): List<GraphQLFieldDefinition>? = | ||
if (projectEntityType == ProjectEntityType.BUILD) { | ||
listOf( | ||
GraphQLFieldDefinition.newFieldDefinition() | ||
.name("render") | ||
.description("Renders a template for this build") | ||
.type(GraphQLString.toNotNull()) | ||
.argument(stringArgument(ARG_FORMAT, "Format of the rendering")) | ||
.argument(stringArgument(ARG_TEMPLATE, "Template for the rendering")) | ||
.dataFetcher { env -> | ||
val build: Build = env.getSource() | ||
val format: String = env.getArgument(ARG_FORMAT) | ||
val template: String = env.getArgument(ARG_TEMPLATE) | ||
|
||
// Renderer | ||
val renderer = eventRendererRegistry.findEventRendererById(format) | ||
?: PlainEventRenderer.INSTANCE | ||
|
||
// Rendering context | ||
val context = mapOf( | ||
"build" to build, | ||
"branch" to build.branch, | ||
"project" to build.project, | ||
) | ||
|
||
// Rendering | ||
templatingService.render( | ||
template = template, | ||
context = context, | ||
renderer = renderer, | ||
) | ||
} | ||
.build() | ||
) | ||
} else { | ||
null | ||
} | ||
|
||
companion object { | ||
private const val ARG_FORMAT = "format" | ||
private const val ARG_TEMPLATE = "template" | ||
} | ||
|
||
} |
Oops, something went wrong.