diff --git a/orca-igor/src/main/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTask.java b/orca-igor/src/main/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTask.java index e15db1b436..06cd0a703c 100644 --- a/orca-igor/src/main/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTask.java +++ b/orca-igor/src/main/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTask.java @@ -16,7 +16,6 @@ package com.netflix.spinnaker.orca.igor.tasks; -import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.spinnaker.kork.artifacts.model.Artifact; import com.netflix.spinnaker.kork.core.RetrySupport; import com.netflix.spinnaker.orca.ExecutionStatus; @@ -28,6 +27,7 @@ import com.netflix.spinnaker.orca.igor.model.GoogleCloudBuildStageDefinition; import com.netflix.spinnaker.orca.pipeline.model.Stage; import com.netflix.spinnaker.orca.pipeline.util.ArtifactResolver; +import com.netflix.spinnaker.orca.pipeline.util.ContextParameterProcessor; import java.io.IOException; import java.util.Map; import javax.annotation.Nonnull; @@ -43,8 +43,8 @@ public class StartGoogleCloudBuildTask implements Task { private final IgorService igorService; private final OortService oortService; private final ArtifactResolver artifactResolver; + private final ContextParameterProcessor contextParameterProcessor; - private final ObjectMapper objectMapper = new ObjectMapper(); private final RetrySupport retrySupport = new RetrySupport(); private static final ThreadLocal yamlParser = ThreadLocal.withInitial(() -> new Yaml(new SafeConstructor())); @@ -90,18 +90,22 @@ private Map getBuildDefinitionFromArtifact( throw new IllegalArgumentException("No manifest artifact account was specified."); } - return retrySupport.retry( - () -> { - try { - Response buildText = oortService.fetchArtifact(buildDefinitionArtifact); - Object result = yamlParser.get().load(buildText.getBody().in()); - return (Map) result; - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - 10, - 200, - false); + Map buildDefinition = + retrySupport.retry( + () -> { + try { + Response buildText = oortService.fetchArtifact(buildDefinitionArtifact); + Object result = yamlParser.get().load(buildText.getBody().in()); + return (Map) result; + } catch (IOException e) { + throw new RuntimeException(e); + } + }, + 10, + 200, + false); + + return contextParameterProcessor.process( + buildDefinition, contextParameterProcessor.buildExecutionContext(stage), true); } } diff --git a/orca-igor/src/test/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTaskSpec.groovy b/orca-igor/src/test/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTaskSpec.groovy index 0b8f2e7533..f33f5ecbf3 100644 --- a/orca-igor/src/test/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTaskSpec.groovy +++ b/orca-igor/src/test/groovy/com/netflix/spinnaker/orca/igor/tasks/StartGoogleCloudBuildTaskSpec.groovy @@ -25,6 +25,7 @@ import com.netflix.spinnaker.orca.igor.model.GoogleCloudBuild import com.netflix.spinnaker.orca.pipeline.model.Execution import com.netflix.spinnaker.orca.pipeline.model.Stage import com.netflix.spinnaker.orca.pipeline.util.ArtifactResolver +import com.netflix.spinnaker.orca.pipeline.util.ContextParameterProcessor import retrofit.client.Response import retrofit.mime.TypedString import spock.lang.Specification @@ -32,8 +33,27 @@ import spock.lang.Subject class StartGoogleCloudBuildTaskSpec extends Specification { def ACCOUNT = "my-account" + def RAW_BUILD = [ + steps: [ + [ + args: [ + "bin/echo", + '${#currentStage()["name"].toString()}' + ], + name: "debian" + ] + ] + ] def BUILD = [ - steps: [] + steps: [ + [ + args: [ + "bin/echo", + "My GCB Stage" + ], + name: "debian" + ] + ] ] def objectMapper = new ObjectMapper() @@ -41,9 +61,10 @@ class StartGoogleCloudBuildTaskSpec extends Specification { IgorService igorService = Mock(IgorService) OortService oortService = Mock(OortService) ArtifactResolver artifactResolver = Mock(ArtifactResolver) + ContextParameterProcessor contextParameterProcessor = Mock(ContextParameterProcessor) @Subject - StartGoogleCloudBuildTask task = new StartGoogleCloudBuildTask(igorService, oortService, artifactResolver) + StartGoogleCloudBuildTask task = new StartGoogleCloudBuildTask(igorService, oortService, artifactResolver, contextParameterProcessor) def "starts a build defined inline"() { given: @@ -74,7 +95,8 @@ class StartGoogleCloudBuildTaskSpec extends Specification { buildDefinitionSource: "artifact", buildDefinitionArtifact: [ artifact: artifact - ] + ], + name: "My GCB Stage" ]) when: @@ -82,7 +104,8 @@ class StartGoogleCloudBuildTaskSpec extends Specification { then: artifactResolver.getBoundArtifactForStage(stage, null, artifact) >> artifact - oortService.fetchArtifact(artifact) >> new Response("", 200, "", Collections.emptyList(), new TypedString(objectMapper.writeValueAsString(BUILD))) + oortService.fetchArtifact(artifact) >> new Response("", 200, "", Collections.emptyList(), new TypedString(objectMapper.writeValueAsString(RAW_BUILD))) + 1 * contextParameterProcessor.process(RAW_BUILD, _, _) >> BUILD 1 * igorService.createGoogleCloudBuild(ACCOUNT, BUILD) >> igorResponse result.context.buildInfo == igorResponse