Skip to content

Commit

Permalink
[#4] Force version in commit message - WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
szpak committed Jun 15, 2017
1 parent f3ed39f commit 3e16ee5
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@ package info.solidsoft.gradle.cdeliveryboy

import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
import info.solidsoft.gradle.cdeliveryboy.infra.AxionReleaseVersionSetter
import info.solidsoft.gradle.cdeliveryboy.infra.DependantPluginsConfigurer
import info.solidsoft.gradle.cdeliveryboy.infra.EnvironmentVariableReader
import info.solidsoft.gradle.cdeliveryboy.infra.ProjectPropertyReader
import info.solidsoft.gradle.cdeliveryboy.infra.PropertyReader
import info.solidsoft.gradle.cdeliveryboy.infra.ReleaseVersionDeterminer
import info.solidsoft.gradle.cdeliveryboy.infra.config.DefaultProjectConfig
import info.solidsoft.gradle.cdeliveryboy.logic.BuildConditionEvaluator
import info.solidsoft.gradle.cdeliveryboy.logic.PropertyOverrider
import info.solidsoft.gradle.cdeliveryboy.logic.config.CDeliveryBoyPluginConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.CiVariablesConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.CiVariablesValidator
import info.solidsoft.gradle.cdeliveryboy.logic.config.DryRunTaskConfig
import info.solidsoft.gradle.cdeliveryboy.logic.PropertyOverrider
import info.solidsoft.gradle.cdeliveryboy.logic.config.ProjectConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.TaskConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.TravisVariablesConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.CDeliveryBoyPluginConfig
import info.solidsoft.gradle.cdeliveryboy.logic.config.ProjectConfig
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
Expand Down Expand Up @@ -60,6 +62,7 @@ class CDeliveryBoyPlugin implements Plugin<Project> {
PropertyOverrider propertyOverrider = new PropertyOverrider(new ProjectPropertyReader(project))
propertyOverrider.applyCommandLineProperties(pluginConfig)

//TODO: Move objects creation to uber factory/context which (as the whole) could be injected in integration tests (as mock/spu and stubbed as needed)
TaskConfig taskConfig = createTaskConfigOrFail(pluginConfig) //TODO: Make it a part of public configuration?
CiVariablesConfig ciVariablesConfig = createCiVariablesConfigOrFail(pluginConfig)
PropertyReader envVariableReader = new EnvironmentVariableReader()
Expand All @@ -68,7 +71,9 @@ class CDeliveryBoyPlugin implements Plugin<Project> {
projectConfig)
CiVariablesValidator ciVariablesValidator = initializeCiVariablesValidator(envVariableReader, ciVariablesConfig)

setDependantTasksForPrepareTask(prepareTask, taskConfig, buildConditionEvaluator, ciVariablesValidator) //TODO: Maybe create some common object to keep plugin configuration?
ReleaseVersionDeterminer releaseVersionDeterminer = new ReleaseVersionDeterminer(AxionReleaseVersionSetter.forProject(project))

setDependantTasksForPrepareTask(prepareTask, taskConfig, buildConditionEvaluator, ciVariablesValidator, releaseVersionDeterminer) //TODO: Maybe create some common object to keep plugin configuration?
setDependantTasksForBuildTask(pluginConfig, buildTask, taskConfig, buildConditionEvaluator, ciVariablesValidator)

configurePushRelease2Task(pushRelease2Task, pluginConfig, ciVariablesConfig, envVariableReader)
Expand Down Expand Up @@ -127,13 +132,15 @@ class CDeliveryBoyPlugin implements Plugin<Project> {
}

private void setDependantTasksForPrepareTask(CDeliveryBoyCiPrepareTask prepareTask, TaskConfig taskConfig,
BuildConditionEvaluator buildConditionEvaluator, CiVariablesValidator ciVariablesValidator) {
BuildConditionEvaluator buildConditionEvaluator, CiVariablesValidator ciVariablesValidator,
ReleaseVersionDeterminer releaseVersionDeterminer) {

if (isGivenTaskExpectedToBeExecuted(prepareTask)) {
ciVariablesValidator.checkExistence()
prepareTask.modeConditions = buildConditionEvaluator.releaseConditionsAsString

if (buildConditionEvaluator.isInReleaseBranch() && buildConditionEvaluator.isReleaseTriggered()) {
releaseVersionDeterminer.determineAndForceReleaseVersionIfRequested(buildConditionEvaluator.forcedVersion())
prepareTask.dependsOn(getJustOneTaskByNameOrFail(taskConfig.createReleaseTask))
prepareTask.isInReleaseMode = true
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package info.solidsoft.gradle.cdeliveryboy.infra

import com.github.zafarkhaja.semver.Version
import groovy.transform.CompileStatic
import org.gradle.api.Project
import pl.allegro.tech.build.axion.release.domain.VersionConfig
import pl.allegro.tech.build.axion.release.domain.VersionIncrementerContext

@CompileStatic
class AxionReleaseVersionSetter implements ReleaseVersionSetter {

private final VersionConfig axionConfig

private AxionReleaseVersionSetter(VersionConfig axionConfig) {
this.axionConfig = axionConfig
}

@Override
void setReleaseVersion(String forcedVersion) {
axionConfig.versionIncrementer = { VersionIncrementerContext context ->
return Version.valueOf(forcedVersion)
}
}

static AxionReleaseVersionSetter forProject(Project project) {
VersionConfig axionConfig = project.extensions.getByType(VersionConfig)
return new AxionReleaseVersionSetter(axionConfig)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package info.solidsoft.gradle.cdeliveryboy.infra

import groovy.transform.CompileStatic
import info.solidsoft.gradle.cdeliveryboy.logic.ForcedVersion

@CompileStatic
class ReleaseVersionDeterminer {

private final ReleaseVersionSetter releaseVersionSetter

ReleaseVersionDeterminer(ReleaseVersionSetter releaseVersionSetter) {
this.releaseVersionSetter = releaseVersionSetter
}

void determineAndForceReleaseVersionIfRequested(ForcedVersion forcedVersion) {
if (!forcedVersion.isForced) {
return
}
releaseVersionSetter.setReleaseVersion(forcedVersion.forcedValue)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package info.solidsoft.gradle.cdeliveryboy.infra

interface ReleaseVersionSetter {

void setReleaseVersion(String forcedVersion)
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,19 @@ class BuildConditionEvaluator {
return (pluginConfig.dryRun || projectConfig.globalDryRun) && pluginConfig.dryRunForceNonSnapshotVersion
}

ForcedVersion forcedVersion() {
//TODO: Not implemented
return ForcedVersion.noVersionForced()
}

String getReleaseConditionsAsString() {
//TODO: Maybe on lifecycle display only not satisfied conditions (how to do it in a clearly way)?
//TODO: Move information about being a snapshot version here
return "Branch name: ${environmentVariableReader.findByName(ciConfig.branchNameName)} (configured: ${pluginConfig.git.releaseBranch}), " +
"is PR: ${environmentVariableReader.findByName(ciConfig.isPrName)}, " +
"release on demand: ${pluginConfig.trigger.releaseOnDemand}, " +
"on demand trigger command: '${environmentVariableReader.findByName(ciConfig.commitMessageName)}' " +
"(configured: '${pluginConfig.trigger.onDemandReleaseTriggerCommand}', " +
"is SNAPSHOT: '${isSnapshotVersion()}')"
//TODO: forcedVersion
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package info.solidsoft.gradle.cdeliveryboy.logic

import groovy.transform.CompileStatic

@CompileStatic
class ForcedVersion {

private static final ForcedVersion noForcedVersion = new ForcedVersion(false, null)

final boolean isForced
final String forcedValue

private ForcedVersion(boolean isForced, String forcedValue) {
this.isForced = isForced
this.forcedValue = forcedValue
}

static ForcedVersion noVersionForced() {
return noForcedVersion;
}

static ForcedVersion forcedVersionWithValue(String forcedValue) {
return new ForcedVersion(true, forcedValue)
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package info.solidsoft.gradle.cdeliveryboy

import com.github.zafarkhaja.semver.Version
import info.solidsoft.gradle.cdeliveryboy.logic.BuildConditionEvaluator
import pl.allegro.tech.build.axion.release.domain.VersionConfig
import pl.allegro.tech.build.axion.release.domain.VersionIncrementerContext
import pl.allegro.tech.build.axion.release.domain.scm.ScmPosition
import spock.lang.PendingFeature

import static info.solidsoft.gradle.cdeliveryboy.logic.ForcedVersion.forcedVersionWithValue

class OverriddenVersionITSpec extends BasicProjectBuilderITSpec {

private VersionIncrementerContext versionIncrementerContextStub = Stub()
Expand All @@ -27,12 +30,35 @@ class OverriddenVersionITSpec extends BasicProjectBuilderITSpec {
releaseVersion == "0.6.0"
}

@PendingFeature
def "should increase configured version number"() {
def "should allow to override in Axion configuration default version incrementer"() {
given:
getAxionConfiguration().versionIncrementer('incrementMajor')
and:
triggerEvaluate()
Closure versionIncrementer = getAxionConfiguration().versionIncrementer
when:
String releaseVersion = versionIncrementer.call(versionIncrementerContextStub)
then:
releaseVersion == "1.0.0"
}

@PendingFeature
@PendingFeature //Cannot be easily implemented as afterEvaluate is executed after Axion configuration is resolved
def "should increase configured version number"() {}

def "should use direct release version configured in commit message"() {
given:
String forcedVersion = "0.7.7"
and:
BuildConditionEvaluator buildConditionEvaluatorStub = Stub()
buildConditionEvaluatorStub.forcedVersion() >> forcedVersionWithValue(forcedVersion)
project.plugins.getPlugin(CDeliveryBoyPlugin).buildConditionEvaluatorIntegrationTestingHack = buildConditionEvaluatorStub
and:
triggerEvaluate() //TODO: Extract those lines to asserting method
Closure versionIncrementer = getAxionConfiguration().versionIncrementer
when:
String releaseVersion = versionIncrementer.call(versionIncrementerContextStub)
then:
releaseVersion == forcedVersion
}

@PendingFeature
Expand All @@ -41,6 +67,6 @@ class OverriddenVersionITSpec extends BasicProjectBuilderITSpec {

//TODO: Move to a separate trait?
private VersionConfig getAxionConfiguration() {
project.getExtensions().getByType(VersionConfig)
return project.getExtensions().getByType(VersionConfig)
}
}

0 comments on commit 3e16ee5

Please sign in to comment.