vivin / gradle-semantic-build-versioning

Gradle plugin to generate version-numbers and tags using semantic versioning
MIT License
85 stars 32 forks source link

Injecting the branch name into preRelease version #74

Closed marcus-held closed 7 years ago

marcus-held commented 7 years ago

Hi,

I'm trying to get your plugin into my project and we have the requirement to append the branch name into our version. The reason is that we develop multiple features simultaneously on different branches. We have the need to deploy them individually without conflicting versions.

Since the plugin changed to the configuration approach I can not execute e.g. grgit in semantic-build-versioning.properties file.

Did I miss something, or is this not possible at all?

Thanks for your help and the great work on this plugin.

Best

vivin commented 7 years ago

@mld-ger Are you talking about using running a task that uses grgit? How were you using it with this plugin before?

marcus-held commented 7 years ago

I didn't used the plugin yet, but I want to. Currently I'm trying to achieve my goal with the 2.x version, but I struggle with ordering problems atm. Anyway the configuration looks like this:

def os = new ByteArrayOutputStream();
exec {
    executable 'git'
    args 'rev-parse', '--abbrev-ref', 'HEAD'
    standardOutput = os;
}
def branch = os.toString().replaceAll("[^A-Za-z0-9 ]|feature", "").trim()

project.version.with {
    tagPrefix = 'v'
    preRelease {
        startingVersion = "${branch}.0"
        bump { String version ->
            int num = Integer.parseInt(version.split(/\./)[1]) + 1
            return "${branch}.${num}"
        }
    }
}

I would like to do sth. similar in the 3.x version as well. What would work for me also is when I can somehow pass a parameter into the configuration.

marcus-held commented 7 years ago

I found a solution to help myself with version 3 now. I did the following:

build.gradle:


def os = new ByteArrayOutputStream();
exec {
    executable 'git'
    args 'rev-parse', '--abbrev-ref', 'HEAD'
    standardOutput = os;
}
def branch = os.toString().replaceAll("[^A-Za-z0-9 ]|feature", "").trim()

allprojects {
    //The same placeholder is used in semantic-build-versioning.gradle
    def stringToReplace = "IWantToBeReplacedAndIShouldNotConflictWithABranchName"
    version = rootProject.version.replace("${stringToReplace}", branch)
}

semantic-build-versioning.gradle

def stringToReplace = "IWantToBeReplacedAndIShouldNotConflictWithABranchName"

preRelease {
    startingVersion = "${stringToReplace}.0"
    bump = {
        int num = Integer.parseInt(version.split(/\./)[1]) + 1
        return "${stringToReplace}.${num}"
    }
}

This solution does work, but I wouldn't consider it as bulletproof. It would be nice to have a better support of the plugin here.

Best

edit: unfortunally with this approach I can not execute the "tag" task with the newPreRelease property anymore because I exchanged the version by a string.

> $ ./gradlew tag -Prelease -PnewPreRelease --stacktrace 

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':tag'.
> No such property: snapshot for class: java.lang.String

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':tag'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:242)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:95)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:235)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:224)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:121)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:77)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:102)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:96)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:612)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:567)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:96)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: groovy.lang.MissingPropertyException: No such property: snapshot for class: java.lang.String
        at net.vivin.gradle.versioning.tasks.TagTask.tag(TagTask.groovy:63)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:711)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:694)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:95)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 27 more

BUILD FAILED in 1s
1 actionable task: 1 executed
vivin commented 7 years ago

@mld-ger So the issue is that you are not able to get access to the branch name within the bump closure, correct?

Oh, and you aren't able to get the branch name when setting the starting version either. Correct?

vivin commented 7 years ago

@mld-ger You can inject the branch name into the pre-release identifier in the following manner:

semantic-build-versioning.gradle:

preRelease {
    startingVersion = "${'git rev-parse --abbrev-ref HEAD'.execute().text.trim()}.0"

    bump = {
        String[] parts = it.split(/\./)
        "${parts[0]}.${Integer.parseInt(parts[1]) + 1}"
    }
}
marcus-held commented 7 years ago

Thanks for your answer @vivin. Your solution did indeed solve my issue.

Keep up the good work :+1:

vivin commented 7 years ago

@mld-ger Glad it worked out! :)