Skip to content

Commit ab777a1

Browse files
committed
feat: [CI-7817]: CI output vars as env (#49008)
* feat: [CI-7817]: CI output vars as env * added ff
1 parent 5683bde commit ab777a1

File tree

20 files changed

+379
-3
lines changed

20 files changed

+379
-3
lines changed

332-ci-manager/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
build.majorVersion=1
22
build.minorVersion=0
3-
build.number=4101
3+
build.number=4102
44
build.patch=000

332-ci-manager/service/src/main/java/io/harness/ci/execution/execution/PipelineExecutionUpdateEventHandler.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import io.harness.pms.sdk.core.resolver.RefObjectUtils;
4747
import io.harness.pms.sdk.core.resolver.outcome.OutcomeService;
4848
import io.harness.repositories.CIAccountExecutionMetadataRepository;
49+
import io.harness.repositories.CIStageOutputRepository;
4950
import io.harness.repositories.CITaskDetailsRepository;
5051
import io.harness.service.DelegateGrpcClientWrapper;
5152
import io.harness.steps.StepUtils;
@@ -90,6 +91,7 @@ public class PipelineExecutionUpdateEventHandler implements OrchestrationEventHa
9091
@Inject @Named("ciEventHandlerExecutor") private ExecutorService executorService;
9192
@Inject @Named("ciRatelimitHandlerExecutor") private ExecutorService ciRatelimitHandlerExecutor;
9293
@Inject private DelegateGrpcClientWrapper delegateGrpcClientWrapper;
94+
@Inject CIStageOutputRepository ciStageOutputRepository;
9395

9496
@Override
9597
public void handleEvent(OrchestrationEvent event) {
@@ -105,6 +107,15 @@ public void handleEvent(OrchestrationEvent event) {
105107
});
106108
}
107109

110+
private void deleteCIStageOutputs(Ambiance ambiance) {
111+
String stageExecutionId = ambiance.getStageExecutionId();
112+
try {
113+
ciStageOutputRepository.deleteFirstByStageExecutionId(stageExecutionId);
114+
} catch (Exception e) {
115+
log.error("Error while deleting CI outputs for stageExecutionId " + stageExecutionId, e);
116+
}
117+
}
118+
108119
private void sendCleanupRequest(Level level, Ambiance ambiance, Status status, String accountId) {
109120
try {
110121
RetryPolicy<Object> retryPolicy = getRetryPolicy(format("[Retrying failed call to clean pod attempt: {}"),
@@ -131,6 +142,7 @@ private void sendCleanupRequest(Level level, Ambiance ambiance, Status status, S
131142
log.info("failed to remove execution record from db", ex);
132143
}
133144

145+
deleteCIStageOutputs(ambiance);
134146
CICleanupTaskParams ciCleanupTaskParams = stageCleanupUtility.buildAndfetchCleanUpParameters(ambiance);
135147

136148
log.info("Received event with status {} to clean planExecutionId {}, stage {}", status,

332-ci-manager/service/src/main/java/io/harness/ci/execution/states/AbstractStepExecutable.java

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
import static java.util.Collections.singletonList;
1818

1919
import io.harness.annotations.dev.OwnedBy;
20+
import io.harness.beans.FeatureName;
2021
import io.harness.beans.outcomes.VmDetailsOutcome;
2122
import io.harness.beans.plugin.compatible.PluginCompatibleStep;
2223
import io.harness.beans.steps.CIStepInfo;
2324
import io.harness.beans.steps.CIStepInfoType;
2425
import io.harness.beans.steps.outcome.CIStepArtifactOutcome;
2526
import io.harness.beans.steps.outcome.CIStepOutcome;
2627
import io.harness.beans.steps.outcome.StepArtifacts;
28+
import io.harness.beans.steps.output.CIStageOutput;
2729
import io.harness.beans.steps.stepinfo.BackgroundStepInfo;
2830
import io.harness.beans.steps.stepinfo.PluginStepInfo;
2931
import io.harness.beans.steps.stepinfo.RunStepInfo;
@@ -57,6 +59,10 @@
5759
import io.harness.delegate.beans.ci.vm.CIVmInitializeTaskParams;
5860
import io.harness.delegate.beans.ci.vm.VmTaskExecutionResponse;
5961
import io.harness.delegate.beans.ci.vm.dlite.DliteVmExecuteStepTaskParams;
62+
import io.harness.delegate.beans.ci.vm.steps.VmBackgroundStep;
63+
import io.harness.delegate.beans.ci.vm.steps.VmPluginStep;
64+
import io.harness.delegate.beans.ci.vm.steps.VmRunStep;
65+
import io.harness.delegate.beans.ci.vm.steps.VmRunTestStep;
6066
import io.harness.delegate.beans.ci.vm.steps.VmStepInfo;
6167
import io.harness.delegate.task.HDelegateTask;
6268
import io.harness.delegate.task.stepstatus.StepStatusTaskResponseData;
@@ -101,6 +107,8 @@
101107
import java.util.EnumSet;
102108
import java.util.List;
103109
import java.util.Map;
110+
import java.util.Objects;
111+
import java.util.Optional;
104112
import java.util.Set;
105113
import lombok.extern.slf4j.Slf4j;
106114

@@ -168,11 +176,12 @@ public AsyncExecutableResponse executeVmAsyncAfterRbac(Ambiance ambiance, String
168176
VmStepInfo vmStepInfo = vmStepSerializer.serialize(ambiance, ciStepInfo, stageInfraDetails, stepIdentifier,
169177
ParameterField.createValueField(Timeout.fromString(stringTimeout)), stageDetails.getRegistries(),
170178
stageDetails.getExecutionSource(), vmDetailsOutcome.getDelegateId());
179+
injectOutputVarsAsEnvVars(vmStepInfo, accountId, ambiance.getStageExecutionId());
180+
171181
Set<String> secrets = vmStepSerializer.getStepSecrets(vmStepInfo, ambiance);
172182
secrets.addAll(stepPreProcessSecrets);
173183
CIExecuteStepTaskParams params = getVmTaskParams(ambiance, vmStepInfo, secrets, stageInfraDetails, stageDetails,
174184
vmDetailsOutcome, runtimeId, stepIdentifier, logKey);
175-
176185
List<String> eligibleToExecuteDelegateIds = new ArrayList<>();
177186
if (isNotEmpty(vmDetailsOutcome.getDelegateId())) {
178187
eligibleToExecuteDelegateIds.add(vmDetailsOutcome.getDelegateId());
@@ -188,6 +197,47 @@ public AsyncExecutableResponse executeVmAsyncAfterRbac(Ambiance ambiance, String
188197
.build();
189198
}
190199

200+
public void injectOutputVarsAsEnvVars(VmStepInfo stepInfo, String accountId, String stageExecutionId) {
201+
if (!featureFlagService.isEnabled(FeatureName.CI_OUTPUT_VARIABLES_AS_ENV, accountId)) {
202+
return;
203+
}
204+
205+
Optional<CIStageOutput> ciStageOutputResponse =
206+
ciStageOutputRepository.findFirstByStageExecutionId(stageExecutionId);
207+
if (ciStageOutputResponse.isPresent()) {
208+
CIStageOutput ciStageOutput = ciStageOutputResponse.get();
209+
Map<String, String> outputs = ciStageOutput.getOutputs();
210+
if (Objects.isNull(outputs) || outputs.isEmpty()) {
211+
return;
212+
}
213+
214+
switch (stepInfo.getType()) {
215+
case RUN:
216+
VmRunStep runStep = (VmRunStep) stepInfo;
217+
outputs.putAll(runStep.getEnvVariables());
218+
runStep.getEnvVariables().putAll(outputs);
219+
break;
220+
case PLUGIN:
221+
VmPluginStep pluginStep = (VmPluginStep) stepInfo;
222+
outputs.putAll(pluginStep.getEnvVariables());
223+
pluginStep.getEnvVariables().putAll(outputs);
224+
break;
225+
case RUN_TEST:
226+
VmRunTestStep runTestStep = (VmRunTestStep) stepInfo;
227+
outputs.putAll(runTestStep.getEnvVariables());
228+
runTestStep.getEnvVariables().putAll(outputs);
229+
break;
230+
case BACKGROUND:
231+
VmBackgroundStep vmBackgroundStep = (VmBackgroundStep) stepInfo;
232+
outputs.putAll(vmBackgroundStep.getEnvVariables());
233+
vmBackgroundStep.getEnvVariables().putAll(outputs);
234+
break;
235+
default:
236+
break;
237+
}
238+
}
239+
}
240+
191241
private CIExecuteStepTaskParams getVmTaskParams(Ambiance ambiance, VmStepInfo vmStepInfo, Set<String> secrets,
192242
StageInfraDetails stageInfraDetails, StageDetails stageDetails, VmDetailsOutcome vmDetailsOutcome,
193243
String runtimeId, String stepIdentifier, String logKey) {
@@ -300,6 +350,8 @@ public StepResponse handleVmStepResponse(Ambiance ambiance, String stepIdentifie
300350
}
301351

302352
if (taskResponse.getCommandExecutionStatus() == CommandExecutionStatus.SUCCESS) {
353+
populateCIStageOutputs(
354+
taskResponse.getOutputVars(), AmbianceUtils.getAccountId(ambiance), ambiance.getStageExecutionId());
303355
if (isNotEmpty(taskResponse.getOutputVars())) {
304356
StepResponse.StepOutcome stepOutcome =
305357
StepResponse.StepOutcome.builder()

332-ci-manager/service/src/main/java/io/harness/ci/serializer/morphia/CIBeansMorphiaRegistrar.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.harness.app.beans.entities.PluginMetadataConfig;
1313
import io.harness.app.beans.entities.PluginMetadataStatus;
1414
import io.harness.beans.outcomes.VmDetailsOutcome;
15+
import io.harness.beans.steps.output.CIStageOutput;
1516
import io.harness.beans.sweepingoutputs.ContextElement;
1617
import io.harness.beans.sweepingoutputs.DliteVmStageInfraDetails;
1718
import io.harness.beans.sweepingoutputs.K8PodDetails;
@@ -54,6 +55,7 @@ public void registerClasses(Set<Class> set) {
5455
set.add(CIExecutionMetadata.class);
5556
set.add(PluginMetadataConfig.class);
5657
set.add(PluginMetadataStatus.class);
58+
set.add(CIStageOutput.class);
5759
}
5860

5961
@Override

332-ci-manager/service/src/test/java/io/harness/ci/states/BackgroundStepTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import io.harness.ci.buildstate.ConnectorUtils;
4242
import io.harness.ci.config.CIExecutionServiceConfig;
4343
import io.harness.ci.executionplan.CIExecutionTestBase;
44+
import io.harness.ci.ff.CIFeatureFlagService;
4445
import io.harness.ci.serializer.BackgroundStepProtobufSerializer;
4546
import io.harness.ci.serializer.vm.VmStepSerializer;
4647
import io.harness.delegate.beans.ci.vm.steps.VmBackgroundStep;
@@ -60,6 +61,7 @@
6061
import io.harness.pms.sdk.core.steps.io.StepInputPackage;
6162
import io.harness.pms.yaml.ParameterField;
6263
import io.harness.product.ci.engine.proto.UnitStep;
64+
import io.harness.repositories.CIStageOutputRepository;
6365
import io.harness.rule.Owner;
6466

6567
import java.util.ArrayList;
@@ -87,6 +89,8 @@ public class BackgroundStepTest extends CIExecutionTestBase {
8789
@Mock private OutcomeService outcomeService;
8890
@Mock private ConnectorUtils connectorUtils;
8991
@Mock private VmStepSerializer vmStepSerializer;
92+
@Mock protected CIFeatureFlagService featureFlagService;
93+
@Mock protected CIStageOutputRepository ciStageOutputRepository;
9094
@InjectMocks BackgroundStep backgroundStep;
9195
private Ambiance ambiance;
9296
private BackgroundStepInfo stepInfo;

332-ci-manager/service/src/test/java/io/harness/ci/states/DockerStepTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.harness.beans.sweepingoutputs.K8StageInfraDetails;
2626
import io.harness.category.element.UnitTests;
2727
import io.harness.ci.executionplan.CIExecutionTestBase;
28+
import io.harness.ci.ff.CIFeatureFlagService;
2829
import io.harness.ci.integrationstage.K8InitializeStepUtilsHelper;
2930
import io.harness.delegate.beans.ci.vm.VmTaskExecutionResponse;
3031
import io.harness.delegate.task.stepstatus.StepExecutionStatus;
@@ -48,6 +49,7 @@
4849
import io.harness.pms.sdk.core.resolver.outputs.ExecutionSweepingOutputService;
4950
import io.harness.pms.sdk.core.steps.io.StepResponse;
5051
import io.harness.pms.yaml.ParameterField;
52+
import io.harness.repositories.CIStageOutputRepository;
5153
import io.harness.rule.Owner;
5254
import io.harness.tasks.ResponseData;
5355

@@ -72,6 +74,8 @@ public class DockerStepTest extends CIExecutionTestBase {
7274
@InjectMocks DockerStep dockerStep;
7375
@Mock SerializedResponseDataHelper serializedResponseDataHelper;
7476
@Mock private ExecutionSweepingOutputService executionSweepingOutputResolver;
77+
@Mock protected CIFeatureFlagService featureFlagService;
78+
@Mock protected CIStageOutputRepository ciStageOutputRepository;
7579
private Ambiance ambiance;
7680
private StepElementParameters stepElementParameters;
7781
private HashMap<String, String> setupAbstractions = new HashMap<>();

332-ci-manager/service/src/test/java/io/harness/ci/states/ECRStepTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.harness.beans.sweepingoutputs.DliteVmStageInfraDetails;
2424
import io.harness.category.element.UnitTests;
2525
import io.harness.ci.executionplan.CIExecutionTestBase;
26+
import io.harness.ci.ff.CIFeatureFlagService;
2627
import io.harness.ci.integrationstage.K8InitializeStepUtilsHelper;
2728
import io.harness.delegate.beans.ci.vm.VmTaskExecutionResponse;
2829
import io.harness.delegate.task.stepstatus.artifact.ArtifactMetadata;
@@ -42,6 +43,7 @@
4243
import io.harness.pms.sdk.core.resolver.outputs.ExecutionSweepingOutputService;
4344
import io.harness.pms.sdk.core.steps.io.StepResponse;
4445
import io.harness.pms.yaml.ParameterField;
46+
import io.harness.repositories.CIStageOutputRepository;
4547
import io.harness.rule.Owner;
4648
import io.harness.tasks.ResponseData;
4749

@@ -60,6 +62,8 @@ public class ECRStepTest extends CIExecutionTestBase {
6062
@InjectMocks ECRStep ecrStep;
6163
@Mock SerializedResponseDataHelper serializedResponseDataHelper;
6264
@Mock private ExecutionSweepingOutputService executionSweepingOutputResolver;
65+
@Mock protected CIFeatureFlagService featureFlagService;
66+
@Mock protected CIStageOutputRepository ciStageOutputRepository;
6367

6468
public static final String STEP_ID = "ecrStepID";
6569
private Ambiance ambiance;

332-ci-manager/service/src/test/java/io/harness/ci/states/GCRStepTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.harness.beans.sweepingoutputs.DliteVmStageInfraDetails;
2424
import io.harness.category.element.UnitTests;
2525
import io.harness.ci.executionplan.CIExecutionTestBase;
26+
import io.harness.ci.ff.CIFeatureFlagService;
2627
import io.harness.ci.integrationstage.K8InitializeStepUtilsHelper;
2728
import io.harness.delegate.beans.ci.vm.VmTaskExecutionResponse;
2829
import io.harness.delegate.task.stepstatus.artifact.ArtifactMetadata;
@@ -42,6 +43,7 @@
4243
import io.harness.pms.sdk.core.resolver.outputs.ExecutionSweepingOutputService;
4344
import io.harness.pms.sdk.core.steps.io.StepResponse;
4445
import io.harness.pms.yaml.ParameterField;
46+
import io.harness.repositories.CIStageOutputRepository;
4547
import io.harness.rule.Owner;
4648
import io.harness.tasks.ResponseData;
4749

@@ -60,6 +62,8 @@ public class GCRStepTest extends CIExecutionTestBase {
6062
@InjectMocks GCRStep gcrStep;
6163
@Mock SerializedResponseDataHelper serializedResponseDataHelper;
6264
@Mock private ExecutionSweepingOutputService executionSweepingOutputResolver;
65+
@Mock protected CIFeatureFlagService featureFlagService;
66+
@Mock protected CIStageOutputRepository ciStageOutputRepository;
6367

6468
public static final String STEP_ID = "gcrStepID";
6569
private Ambiance ambiance;

0 commit comments

Comments
 (0)