Skip to content

Commit 28f1baf

Browse files
authored
[config.artifactory] Read credential configs for publish (#5871)
Currently, the `publishArtifactory` task requires credentials to be supplied via environment variables or command-line arguments. If these are not provided, the system will fall back to searching for credentials in the Coursier configuration files.
1 parent 008e945 commit 28f1baf

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ object ArtifactoryPublishModule extends ExternalModule {
8383
password <- Task.env.get("ARTIFACTORY_PASSWORD")
8484
} yield {
8585
s"$username:$password"
86-
}).getOrElse(
87-
Task.fail(
88-
"Consider using ARTIFACTORY_USERNAME/ARTIFACTORY_PASSWORD environment variables or passing `credentials` argument"
89-
)
90-
)
86+
}).getOrElse("")
9187
} else {
9288
credentials
9389
}

contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublisher.scala

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package mill.contrib.artifactory
22

3+
import java.net.URI
34
import mill.api.Logger
45
import mill.javalib.publish.Artifact
6+
import mill.util.CoursierConfig
57

68
class ArtifactoryPublisher(
79
releaseUri: String,
@@ -11,8 +13,23 @@ class ArtifactoryPublisher(
1113
connectTimeout: Int,
1214
log: Logger
1315
) {
14-
private val api =
15-
new ArtifactoryHttpApi(credentials, readTimeout = readTimeout, connectTimeout = connectTimeout)
16+
17+
private def prepareCreds(credentials: String, repoUri: String): String = {
18+
if (credentials.isEmpty) {
19+
val hostname = new URI(repoUri).getHost
20+
val coursierCreds = CoursierConfig.default().credentials.map(_.get).flatten
21+
coursierCreds.find(cred =>
22+
cred.host == hostname && cred.usernameOpt.isDefined && cred.passwordOpt.isDefined
23+
) match {
24+
case Some(cred) => s"${cred.usernameOpt.get}:${cred.passwordOpt.get.value}"
25+
case None => throw RuntimeException(
26+
"Consider either using ARTIFACTORY_USERNAME/ARTIFACTORY_PASSWORD environment variables or passing `credentials` argument or setup credential files"
27+
)
28+
}
29+
} else {
30+
credentials
31+
}
32+
}
1633

1734
def publish(fileMapping: Map[os.SubPath, os.Path], artifact: Artifact): Unit = {
1835
publishAll(fileMapping -> artifact)
@@ -46,6 +63,11 @@ class ArtifactoryPublisher(
4663
payloads: Map[os.SubPath, Array[Byte]],
4764
artifacts: Seq[Artifact]
4865
): Unit = {
66+
val api = new ArtifactoryHttpApi(
67+
credentials = prepareCreds(credentials, repoUri),
68+
readTimeout = readTimeout,
69+
connectTimeout = connectTimeout
70+
)
4971
val publishResults = payloads.iterator.map {
5072
case (fileName, data) =>
5173
log.info(s"Uploading $fileName")

libs/util/src/mill/exports.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ export mill.api.Task.Worker
1111
export mill.api.DefaultTaskModule
1212
export mill.api.JsonFormatters.*
1313
export mill.util.TokenReaders.*
14+
export mill.util.CoursierConfig
1415
export upickle.implicits.namedTuples.default.given

0 commit comments

Comments
 (0)