@Override public String getRevisionUrl() { return getRevision(); }
@Override public MaterialInstance createMaterialInstance() { return new PluggableSCMMaterialInstance(JsonHelper.toJsonString(this), UUID.randomUUID().toString()); }
private SCMPropertyConfiguration buildSCMPropertyConfigurations(SCM scmConfig) { SCMPropertyConfiguration scmPropertyConfiguration = new SCMPropertyConfiguration(); populateConfiguration(scmConfig.getConfiguration(), scmPropertyConfiguration); return scmPropertyConfiguration; }
@Override public void checkout(PluggableSCMMaterial material, File baseDir, Revision revision, SubprocessExecutionContext execCtx) { SCMPropertyConfiguration scmPropertyConfiguration = buildSCMPropertyConfigurations(material.getScmConfig()); MaterialInstance materialInstance = materialRepository.findMaterialInstance(material); PluggableSCMMaterialRevision pluggableSCMMaterialRevision = (PluggableSCMMaterialRevision) revision; SCMRevision scmRevision = new SCMRevision( pluggableSCMMaterialRevision.getRevision(), pluggableSCMMaterialRevision.getTimestamp(), null, null, pluggableSCMMaterialRevision.getData(), null); Result result = scmExtension.checkout(material.getPluginId(), scmPropertyConfiguration, baseDir.getAbsolutePath(), scmRevision); if(!result.isSuccessful()) throw new RuntimeException("Failed to perform checkout on pluggable SCM"); }
@Override public void insertLatestOrNewModifications(final Material material, MaterialInstance materialInstance, File folder, Modifications list) { final PluggableSCMMaterialInstance currentMaterialInstance = (PluggableSCMMaterialInstance) materialInstance; final PluggableSCMMaterialInstance latestMaterialInstance = (PluggableSCMMaterialInstance) material.createMaterialInstance(); if (currentMaterialInstance.shouldUpgradeTo(latestMaterialInstance)) { transactionTemplate.execute((TransactionCallback) transactionStatus -> { PluggableSCMMaterialInstance materialInstance1 = (PluggableSCMMaterialInstance) materialRepository.find(currentMaterialInstance.getId()); materialInstance1.upgradeTo(latestMaterialInstance); materialRepository.saveOrUpdate(materialInstance1); return materialInstance1; }); } scmMaterialUpdater.insertLatestOrNewModifications(material, currentMaterialInstance, folder, list); }
@Test public void shouldCorrectlyCopyConfigurationValue() { PluggableSCMMaterialInstance materialInstance = (PluggableSCMMaterialInstance) MaterialsMother.pluggableSCMMaterial().createMaterialInstance(); materialInstance.setId(10L); PluggableSCMMaterial latestMaterial = MaterialsMother.pluggableSCMMaterial("scm-id", "scm-name", ConfigurationPropertyMother.create("key1", false, "value1")); PluggableSCMMaterialInstance newPluggableSCMMaterialInstance = (PluggableSCMMaterialInstance) latestMaterial.createMaterialInstance(); materialInstance.upgradeTo(newPluggableSCMMaterialInstance); assertThat(materialInstance.getId(), is(10L)); assertThat(materialInstance.getConfiguration(), is(newPluggableSCMMaterialInstance.getConfiguration())); }
@Test public void shouldSetFingerprintWhenConvertingMaterialInstanceToMaterial() { String fingerprint = "fingerprint"; PluggableSCMMaterial material = MaterialsMother.pluggableSCMMaterial(); PluggableSCMMaterialInstance materialInstance = new PluggableSCMMaterialInstance(JsonHelper.toJsonString(material), "flyweight"); ReflectionUtil.setField(materialInstance, "fingerprint", fingerprint); materialInstance.setId(1L); PluggableSCMMaterial constructedMaterial = (PluggableSCMMaterial) materialInstance.toOldMaterial(null, null, null); assertThat(constructedMaterial.getFingerprint(), is(fingerprint)); } }
@Override public Revision oldestRevision(Modifications modifications) { if (modifications.isEmpty()) { return new NullRevision(); } Modification modification = modifications.get(modifications.size() - 1); return new PluggableSCMMaterialRevision(modification.getRevision(), modification.getModifiedTime()); }
@Test public void shouldFindSCMMaterialRevisionEqual() { Date now = new Date(); PluggableSCMMaterialRevision revisionOne = new PluggableSCMMaterialRevision("go-agent-12.1.0", now); PluggableSCMMaterialRevision revisionTwo = new PluggableSCMMaterialRevision("go-agent-12.1.0", now); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND, 5); Date later = calendar.getTime(); PluggableSCMMaterialRevision revisionThree = new PluggableSCMMaterialRevision("go-agent-12.1.0", later); assertThat(revisionOne.equals(revisionTwo), is(true)); assertThat(revisionOne.equals(revisionThree), is(false)); } }
@Test public void shouldCorrectlyCheckIfUpgradeIsNecessary() { PluggableSCMMaterial material = MaterialsMother.pluggableSCMMaterial("scm-id", "scm-name", ConfigurationPropertyMother.create("key1", false, "value1")); PluggableSCMMaterialInstance materialInstance = (PluggableSCMMaterialInstance) material.createMaterialInstance(); materialInstance.setId(10L); PluggableSCMMaterialInstance materialInstanceCopy = (PluggableSCMMaterialInstance) material.createMaterialInstance(); material.getScmConfig().getConfiguration().add(ConfigurationPropertyMother.create("key2", false, "value2")); PluggableSCMMaterialInstance newMaterialInstance = (PluggableSCMMaterialInstance) material.createMaterialInstance(); assertThat(materialInstance.shouldUpgradeTo(materialInstanceCopy), is(false)); assertThat(materialInstance.shouldUpgradeTo(newMaterialInstance), is(true)); }
@Test(expected = RuntimeException.class) public void shouldLogToErrorOutputWhenPluginSendsErrorResponse() { SCM scmConfig = SCMMother.create("scm-id", "scm-name", "pluginid", "version", new Configuration()); PluggableSCMMaterial pluggableSCMMaterial = MaterialsMother.pluggableSCMMaterial(); pluggableSCMMaterial.setFolder("destination-folder"); pluggableSCMMaterial.setSCMConfig(scmConfig); Modification modification = ModificationsMother.oneModifiedFile("r1"); Map<String, String> additionalData = new HashMap<>(); additionalData.put("a1", "v1"); additionalData.put("a2", "v2"); modification.setAdditionalData(new Gson().toJson(additionalData)); MaterialRevision revision = new MaterialRevision(pluggableSCMMaterial, modification); String pipelineFolder = new File(System.getProperty("java.io.tmpdir")).getAbsolutePath(); String destinationFolder = new File(pipelineFolder, "destination-folder").getAbsolutePath(); PluggableSCMMaterialAgent pluggableSCMMaterialAgent = new PluggableSCMMaterialAgent(scmExtension, revision, new File(pipelineFolder), consumer); when(scmExtension.checkout(eq("pluginid"), any(), eq(destinationFolder), any())) .thenThrow(new RuntimeException("some message from plugin")); pluggableSCMMaterialAgent.prepare(); verify(consumer, times(1)).errOutput("Material scm-name checkout failed: some message from plugin"); } }
public MaterialAgent createAgent(MaterialRevision revision) { Material material = revision.getMaterial(); if (material instanceof DependencyMaterial) { return MaterialAgent.NO_OP; } else if (material instanceof PackageMaterial) { return MaterialAgent.NO_OP; } else if (material instanceof PluggableSCMMaterial) { return new PluggableSCMMaterialAgent(scmExtension, revision, workingDirectory, consumer); } else if (material instanceof ScmMaterial) { String destFolderPath = ((ScmMaterial) material).workingdir(workingDirectory).getAbsolutePath(); return new AbstractMaterialAgent(revision, consumer, workingDirectory, new AgentSubprocessExecutionContext(agentIdentifier, destFolderPath)); } throw new RuntimeException("Could not find MaterialChecker for material = " + material); }
@Test public void shouldCreatePluggableSCMMaterialInstance() { PluggableSCMMaterial material = MaterialsMother.pluggableSCMMaterial(); PluggableSCMMaterialInstance materialInstance = (PluggableSCMMaterialInstance) material.createMaterialInstance(); assertThat(materialInstance, is(notNullValue())); assertThat(materialInstance.getFlyweightName(), is(notNullValue())); assertThat(materialInstance.getConfiguration(), is(JsonHelper.toJsonString(material))); }
@Override public void prepare() { try { PluggableSCMMaterial material = (PluggableSCMMaterial) revision.getMaterial(); Modification latestModification = revision.getLatestModification(); SCMRevision scmRevision = new SCMRevision(latestModification.getRevision(), latestModification.getModifiedTime(), null, null, latestModification.getAdditionalDataMap(), null); File destinationFolder = material.workingDirectory(workingDirectory); Result result = scmExtension.checkout(material.getScmConfig().getPluginConfiguration().getId(), buildSCMPropertyConfigurations(material.getScmConfig()), destinationFolder.getAbsolutePath(), scmRevision); handleCheckoutResult(material, result); } catch (Exception e) { consumer.taggedErrOutput(PREP_ERR, String.format("Material %s checkout failed: %s", revision.getMaterial().getDisplayName(), e.getMessage())); throw e; } }
@Override public Material toOldMaterial(String name, String folder, String password) { PluggableSCMMaterial pluggableSCMMaterial = JsonHelper.fromJson(configuration, PluggableSCMMaterial.class); pluggableSCMMaterial.setName(new CaseInsensitiveString(name)); pluggableSCMMaterial.setId(id); pluggableSCMMaterial.setFolder(folder); pluggableSCMMaterial.setFingerprint(getFingerprint()); return pluggableSCMMaterial; }
@Override public List<Modification> modificationsSince(final PluggableSCMMaterial material, File baseDir, final Revision revision, SubprocessExecutionContext execCtx) { SCMPropertyConfiguration scmPropertyConfiguration = buildSCMPropertyConfigurations(material.getScmConfig()); MaterialInstance materialInstance = materialRepository.findMaterialInstance(material); PluggableSCMMaterialRevision pluggableSCMMaterialRevision = (PluggableSCMMaterialRevision) revision; SCMRevision previouslyKnownRevision = new SCMRevision(pluggableSCMMaterialRevision.getRevision(), pluggableSCMMaterialRevision.getTimestamp(), null, null, pluggableSCMMaterialRevision.getData(), null); MaterialPollResult pollResult = scmExtension.latestModificationSince(material.getPluginId(), scmPropertyConfiguration, materialInstance.getAdditionalDataMap(), baseDir.getAbsolutePath(), previouslyKnownRevision); final Map<String, String> materialData = pollResult.getMaterialData(); if (materialInstance.requiresUpdate(materialData)) { updateAdditionalData(materialInstance.getId(), materialData); } List<SCMRevision> scmRevisions = pollResult.getRevisions(); return getModifications(scmRevisions); }
@Test public void shouldConvertMaterialInstanceToMaterial() { PluggableSCMMaterial material = MaterialsMother.pluggableSCMMaterial(); SCM scmConfig = material.getScmConfig(); PluggableSCMMaterialInstance materialInstance = new PluggableSCMMaterialInstance(JsonHelper.toJsonString(material), "flyweight"); materialInstance.setId(1L); PluggableSCMMaterial constructedMaterial = (PluggableSCMMaterial) materialInstance.toOldMaterial(null, null, null); assertThat(constructedMaterial.getId(), is(1L)); assertThat(constructedMaterial.getScmConfig().getPluginConfiguration().getId(), is(scmConfig.getPluginConfiguration().getId())); assertThat(constructedMaterial.getScmConfig().getConfiguration(), is(scmConfig.getConfiguration())); }
@Test public void shouldGetJsonRepresentationForPluggableSCMMaterial() { ConfigurationProperty k1 = create("k1", false, "v1"); SCM scmConfig = SCMMother.create("scm-id", "scm-name", "pluginid", "version", new Configuration(k1)); PluggableSCMMaterial material = new PluggableSCMMaterial(); material.setSCMConfig(scmConfig); material.setFolder("folder"); Map<String, String> jsonMap = new LinkedHashMap<>(); material.toJson(jsonMap, new PluggableSCMMaterialRevision("rev123", new Date())); assertThat(jsonMap.get("scmType"), is("SCM")); assertThat(jsonMap.get("materialName"), is("scm-name")); assertThat(jsonMap.get("location"), is(material.getUriForDisplay())); assertThat(jsonMap.get("folder"), is("folder")); assertThat(jsonMap.get("action"), is("Modified")); }
@Test public void shouldGetLatestModificationsForPluggableSCMMaterial() { String revisionString = "123"; Date timestamp = new Date(); HashMap<String, String> data = new HashMap<>(); data.put("1", "one"); data.put("2", "two"); Modification modification = new Modification(null, null, null, timestamp, revisionString, JsonHelper.toJsonString(data)); Modifications modifications = new Modifications(modification); Revision revision = modifications.latestRevision(new PluggableSCMMaterial()); assertThat(revision instanceof PluggableSCMMaterialRevision, is(true)); PluggableSCMMaterialRevision pluggableSCMMaterialRevision = (PluggableSCMMaterialRevision) revision; assertThat(pluggableSCMMaterialRevision.getRevision(), is(revisionString)); assertThat(pluggableSCMMaterialRevision.getTimestamp(), is(timestamp)); assertThat(pluggableSCMMaterialRevision.getData().size(), is(data.size())); assertThat(pluggableSCMMaterialRevision.getData().get("1"), is(data.get("1"))); assertThat(pluggableSCMMaterialRevision.getData().get("2"), is(data.get("2"))); }
public Revision latestRevision(Material material) { if (material instanceof SvnMaterial) { String revision = Modification.latestRevision(this).getRevision(); return new SubversionRevision(revision); } if (material instanceof DependencyMaterial) { Modification latestModification = this.get(0); String revision = latestModification.getRevision(); return DependencyMaterialRevision.create(revision, latestModification.getPipelineLabel()); } if (material instanceof PackageMaterial) { Modification latestModification = this.get(0); return new PackageMaterialRevision(latestModification.getRevision(), latestModification.getModifiedTime(), latestModification.getAdditionalDataMap()); } if (material instanceof PluggableSCMMaterial) { Modification latestModification = this.get(0); return new PluggableSCMMaterialRevision(latestModification.getRevision(), latestModification.getModifiedTime(), latestModification.getAdditionalDataMap()); } return Modification.latestRevision(this); }