Skip to content

Commit 9d72697

Browse files
Switch to my standard Mill publishing workflow
1 parent 82003e6 commit 9d72697

File tree

2 files changed

+147
-15
lines changed

2 files changed

+147
-15
lines changed

Diff for: .github/workflows/ci.yml

+2-3
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,8 @@ jobs:
171171
env:
172172
PGP_SECRET: ${{ secrets.PGP_SECRET }}
173173
- name: Release
174-
run: ./mill -i io.kipp.mill.ci.release.ReleaseModule/publishAll
174+
run: ./mill -i internal.publishSonatype __.publishArtifacts
175175
env:
176-
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
177-
PGP_SECRET: ${{ secrets.PGP_SECRET }}
176+
PGP_PASSWORD: ${{ secrets.PGP_PASSPHRASE }}
178177
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
179178
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}

Diff for: build.sc

+145-12
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import $ivy.`com.lihaoyi::mill-contrib-jmh:$MILL_VERSION`
2-
import $ivy.`io.chris-kipp::mill-ci-release::0.1.9`
2+
import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0`
33
import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.21`
44
import $ivy.`io.github.alexarchambault.mill::mill-native-image-upload:0.1.21`
55

6+
import de.tobiasroeser.mill.vcs.version._
67
import io.github.alexarchambault.millnativeimage.NativeImage
78
import io.github.alexarchambault.millnativeimage.upload.Upload
8-
import io.kipp.mill.ci.release.CiReleaseModule
99
import mill._
1010
import mill.contrib.jmh.JmhModule
1111
import mill.scalalib._
1212
import mill.scalalib.publish.PublishInfo
1313

1414
import java.io.File
1515

16+
import scala.concurrent.duration.{Duration, DurationInt}
17+
1618
object Dependencies {
1719
def scala212 = "2.12.18"
1820
def scala213 = "2.13.12"
@@ -83,8 +85,138 @@ object Dependencies {
8385
def graalVmId = s"graalvm-java17:$graalvmVersion"
8486
}
8587

86-
trait PublishModule extends CiReleaseModule with PublishLocalNoFluff {
87-
import io.kipp.mill.ci.release.SonatypeHost
88+
object internal extends Module {
89+
private def computePublishVersion(state: VcsState, simple: Boolean): String =
90+
if (state.commitsSinceLastTag > 0)
91+
if (simple) {
92+
val versionOrEmpty = state.lastTag
93+
.filter(_ != "latest")
94+
.filter(_ != "nightly")
95+
.map(_.stripPrefix("v"))
96+
.flatMap { tag =>
97+
if (simple) {
98+
val idx = tag.lastIndexOf(".")
99+
if (idx >= 0) {
100+
val (num, rest) = {
101+
val incrPart = tag.drop(idx + 1)
102+
val idx0 = incrPart.indexWhere(!_.isDigit)
103+
assert(idx0 > 0)
104+
(incrPart.take(idx0).toInt, incrPart.drop(idx0))
105+
}
106+
Some(tag.take(idx + 1) + (num + 1).toString + rest + "-SNAPSHOT")
107+
}
108+
else
109+
None
110+
}
111+
else {
112+
val idx = tag.indexOf("-")
113+
if (idx >= 0) Some(tag.take(idx) + "+" + tag.drop(idx + 1) + "-SNAPSHOT")
114+
else None
115+
}
116+
}
117+
.getOrElse("0.0.1-SNAPSHOT")
118+
Some(versionOrEmpty)
119+
.filter(_.nonEmpty)
120+
.getOrElse(state.format())
121+
}
122+
else {
123+
val rawVersion = os.proc("git", "describe", "--tags").call().out.text().trim
124+
.stripPrefix("v")
125+
.replace("latest", "0.0.0")
126+
.replace("nightly", "0.0.0")
127+
val idx = rawVersion.indexOf("-")
128+
if (idx >= 0) rawVersion.take(idx) + "+" + rawVersion.drop(idx + 1) + "-SNAPSHOT"
129+
else rawVersion
130+
}
131+
else {
132+
val fromTag = state
133+
.lastTag
134+
.getOrElse(state.format())
135+
.stripPrefix("v")
136+
if (fromTag == "0.0.0") "0.0.1-SNAPSHOT"
137+
else fromTag
138+
}
139+
140+
def finalPublishVersion = {
141+
val isCI = System.getenv("CI") != null
142+
if (isCI)
143+
T.persistent {
144+
val state = VcsVersion.vcsState()
145+
computePublishVersion(state, simple = false)
146+
}
147+
else
148+
T {
149+
val state = VcsVersion.vcsState()
150+
computePublishVersion(state, simple = true)
151+
}
152+
}
153+
154+
def publishSonatype(tasks: mill.main.Tasks[PublishModule.PublishData]) =
155+
T.command {
156+
val timeout = 10.minutes
157+
val credentials = sys.env("SONATYPE_USERNAME") + ":" + sys.env("SONATYPE_PASSWORD")
158+
val pgpPassword = sys.env("PGP_PASSWORD")
159+
val data = define.Target.sequence(tasks.value)()
160+
161+
doPublishSonatype(
162+
credentials = credentials,
163+
pgpPassword = pgpPassword,
164+
data = data,
165+
timeout = timeout,
166+
log = T.ctx().log
167+
)
168+
}
169+
170+
private def doPublishSonatype(
171+
credentials: String,
172+
pgpPassword: String,
173+
data: Seq[PublishModule.PublishData],
174+
timeout: Duration,
175+
log: mill.api.Logger
176+
): Unit = {
177+
178+
val artifacts = data.map {
179+
case PublishModule.PublishData(a, s) =>
180+
(s.map { case (p, f) => (p.path, f) }, a)
181+
}
182+
183+
val isRelease = {
184+
val versions = artifacts.map(_._2.version).toSet
185+
val set = versions.map(!_.endsWith("-SNAPSHOT"))
186+
assert(
187+
set.size == 1,
188+
s"Found both snapshot and non-snapshot versions: ${versions.toVector.sorted.mkString(", ")}"
189+
)
190+
set.head
191+
}
192+
val publisher = new publish.SonatypePublisher(
193+
uri = "https://oss.sonatype.org/service/local",
194+
snapshotUri = "https://oss.sonatype.org/content/repositories/snapshots",
195+
credentials = credentials,
196+
signed = true,
197+
gpgArgs = Seq(
198+
"--detach-sign",
199+
"--batch=true",
200+
"--yes",
201+
"--pinentry-mode",
202+
"loopback",
203+
"--passphrase",
204+
pgpPassword,
205+
"--armor",
206+
"--use-agent"
207+
),
208+
readTimeout = timeout.toMillis.toInt,
209+
connectTimeout = timeout.toMillis.toInt,
210+
log = log,
211+
awaitTimeout = timeout.toMillis.toInt,
212+
stagingRelease = isRelease
213+
)
214+
215+
publisher.publishAll(isRelease, artifacts: _*)
216+
}
217+
}
218+
219+
trait BloopPublish extends PublishModule with PublishLocalNoFluff {
88220
import mill.scalalib.publish._
89221
def pomSettings = PomSettings(
90222
description = artifactName(),
@@ -96,7 +228,8 @@ trait PublishModule extends CiReleaseModule with PublishLocalNoFluff {
96228
Developer("alexarchambault", "Alex Archambault", "https://github.com/alexarchambault")
97229
)
98230
)
99-
override def sonatypeHost = Some(SonatypeHost.s01)
231+
def publishVersion =
232+
internal.finalPublishVersion()
100233
}
101234

102235
trait BloopCrossSbtModule extends CrossSbtModule {
@@ -150,7 +283,7 @@ trait PublishLocalNoFluff extends mill.scalalib.PublishModule {
150283
}
151284

152285
object shared extends Cross[Shared](Dependencies.scalaVersions: _*)
153-
class Shared(val crossScalaVersion: String) extends BloopCrossSbtModule with PublishModule {
286+
class Shared(val crossScalaVersion: String) extends BloopCrossSbtModule with BloopPublish {
154287
def artifactName = "bloop-shared"
155288
def compileIvyDeps = super.compileIvyDeps() ++ Agg(
156289
Dependencies.jsoniterMacros
@@ -175,7 +308,7 @@ class Shared(val crossScalaVersion: String) extends BloopCrossSbtModule with Pub
175308
}
176309

177310
object backend extends Cross[Backend](Dependencies.scalaVersions: _*)
178-
class Backend(val crossScalaVersion: String) extends BloopCrossSbtModule with PublishModule {
311+
class Backend(val crossScalaVersion: String) extends BloopCrossSbtModule with BloopPublish {
179312
def artifactName = "bloop-backend"
180313
def moduleDeps = super.moduleDeps ++ Seq(
181314
shared()
@@ -231,7 +364,7 @@ def escapePath(path: os.Path): String =
231364
path.toString.replace("\\", "\\\\")
232365

233366
object frontend extends Cross[Frontend](Dependencies.scalaVersions: _*)
234-
class Frontend(val crossScalaVersion: String) extends BloopCrossSbtModule with PublishModule {
367+
class Frontend(val crossScalaVersion: String) extends BloopCrossSbtModule with BloopPublish {
235368
def artifactName = "bloop-frontend"
236369
def moduleDeps = super.moduleDeps ++ Seq(
237370
backend()
@@ -358,7 +491,7 @@ class Frontend(val crossScalaVersion: String) extends BloopCrossSbtModule with P
358491
object `buildpress-config` extends Cross[BuildpressConfig](Dependencies.scalaVersions: _*)
359492
class BuildpressConfig(val crossScalaVersion: String)
360493
extends BloopCrossSbtModule
361-
with PublishModule {
494+
with BloopPublish {
362495
def compileIvyDeps = super.compileIvyDeps() ++ Agg(
363496
Dependencies.jsoniterMacros
364497
)
@@ -377,7 +510,7 @@ class BuildpressConfig(val crossScalaVersion: String)
377510

378511
object bridges extends Module {
379512
object `scalajs-1` extends Cross[Scalajs1](Dependencies.scalaVersions: _*)
380-
class Scalajs1(val crossScalaVersion: String) extends BloopCrossSbtModule with PublishModule {
513+
class Scalajs1(val crossScalaVersion: String) extends BloopCrossSbtModule with BloopPublish {
381514
def artifactName = "bloop-js-bridge-1"
382515
def compileModuleDeps = super.compileModuleDeps ++ Seq(
383516
frontend(),
@@ -408,7 +541,7 @@ object bridges extends Module {
408541
object `scala-native-04` extends Cross[ScalaNative04](Dependencies.scalaVersions: _*)
409542
class ScalaNative04(val crossScalaVersion: String)
410543
extends BloopCrossSbtModule
411-
with PublishModule {
544+
with BloopPublish {
412545
def artifactName = "bloop-native-bridge-0-4"
413546

414547
private def updateSources(originalSources: Seq[PathRef]): Seq[PathRef] =
@@ -507,7 +640,7 @@ class Benchmarks(val crossScalaVersion: String) extends BloopCrossSbtModule with
507640
}
508641
}
509642

510-
trait BloopCliModule extends ScalaModule with PublishModule {
643+
trait BloopCliModule extends ScalaModule with BloopPublish {
511644
def javacOptions = super.javacOptions() ++ Seq(
512645
"--release",
513646
"16"

0 commit comments

Comments
 (0)