Running sbt release task from cli for sub-project doesn't work

935 Views Asked by At

I have a multi-project sbt where I use sbt-release plugin. Everything works fine if I run release in a sub-project

> project reporter
[info] Set current project to reporter (in build file:/source/storage-integ/)
> release
[info] Starting release process off commit: c069698baf8bb6fca611ab4e7e086398aab473c5
[info] Checking remote [origin] ...

But this doesn't work when I run "sbt reporter/release" from cli. Where as "sbt reporter/compile" or "sbt reporter/assembly" do work.

$ sbt reporter/release
[warn] Executing in batch mode.
[warn]   For better performance, hit [ENTER] to switch to interactive mode, or
[warn]   consider launching sbt without any commands, or explicitly passing 'shell'
[info] Loading global plugins from /home/vagrant/.sbt/0.13/plugins
[info] Loading project definition from /source/storage-integ/project
[info] Set current project to root (in build file:/source/storage-integ/)
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: release (similar: releaseVcs, rpmRelease, rpm-release)
[error] reporter/release

This looks very similar to another SO post. I tried adding releaseSettings to build.sbt as suggested but it throws error

build.sbt:62: error: not found: value releaseSettings

I tried import sbtrelease.Release._ but that throws

error: object Release is not a member of package sbtrelease

At this point I feel the solution mentioned is no longer valid. Also, I don't see any reference to releaseSettings in sbt-release readme. Any idea how to get this working?

sbt.version = 0.13.15 && sbt-release: "1.0.6"

1

There are 1 best solutions below

1
On

The release settings should be only in your root project. So, in order to have that:

First, your build.sbt could be something like this

lazy val root: Project = project.in(file("."))
  .settings(Releases.settings: _*)
  .aggregate(module1, module2)

Then, your project/Releases.scala like:

object Releases {

 // You need to custom these to reflect your actual procedure
 private val releaseProcess = Def.setting {
   Seq[ReleaseStep](
    checkSnapshotDependencies,
    inquireVersions,          
    runClean,                 
    runTest,                  
    setReleaseVersion,        
    commitReleaseVersion,     
    tagRelease,               
    publishArtifacts,         
    setNextVersion,          
    commitNextVersion,       
    pushChanges          
   )
  }

  val settings = Seq(
    releaseCommitMessage := s"Set version to ${(version in ThisBuild).value}",
    releaseTagName := (version in ThisBuild).value,
    releaseProcess := releaseProcess.value
  )
}

By default you need a version.sbt with your current version. Lets say:

version in ThisBuild := "1.0.0-SNAPSHOT"

Then just:

sbt release