diff --git a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala index 562c13941e72..369846cf44e1 100644 --- a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala +++ b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublishModule.scala @@ -83,11 +83,7 @@ object ArtifactoryPublishModule extends ExternalModule { password <- Task.env.get("ARTIFACTORY_PASSWORD") } yield { s"$username:$password" - }).getOrElse( - Task.fail( - "Consider using ARTIFACTORY_USERNAME/ARTIFACTORY_PASSWORD environment variables or passing `credentials` argument" - ) - ) + }).getOrElse("") } else { credentials } diff --git a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublisher.scala b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublisher.scala index 2c9013938682..3bee0121f20c 100644 --- a/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublisher.scala +++ b/contrib/artifactory/src/mill/contrib/artifactory/ArtifactoryPublisher.scala @@ -1,7 +1,9 @@ package mill.contrib.artifactory +import java.net.URI import mill.api.Logger import mill.javalib.publish.Artifact +import mill.util.CoursierConfig class ArtifactoryPublisher( releaseUri: String, @@ -11,8 +13,23 @@ class ArtifactoryPublisher( connectTimeout: Int, log: Logger ) { - private val api = - new ArtifactoryHttpApi(credentials, readTimeout = readTimeout, connectTimeout = connectTimeout) + + private def prepareCreds(credentials: String, repoUri: String): String = { + if (credentials.isEmpty) { + val hostname = new URI(repoUri).getHost + val coursierCreds = CoursierConfig.default().credentials.map(_.get).flatten + coursierCreds.find(cred => + cred.host == hostname && cred.usernameOpt.isDefined && cred.passwordOpt.isDefined + ) match { + case Some(cred) => s"${cred.usernameOpt.get}:${cred.passwordOpt.get.value}" + case None => throw RuntimeException( + "Consider either using ARTIFACTORY_USERNAME/ARTIFACTORY_PASSWORD environment variables or passing `credentials` argument or setup credential files" + ) + } + } else { + credentials + } + } def publish(fileMapping: Map[os.SubPath, os.Path], artifact: Artifact): Unit = { publishAll(fileMapping -> artifact) @@ -46,6 +63,11 @@ class ArtifactoryPublisher( payloads: Map[os.SubPath, Array[Byte]], artifacts: Seq[Artifact] ): Unit = { + val api = new ArtifactoryHttpApi( + credentials = prepareCreds(credentials, repoUri), + readTimeout = readTimeout, + connectTimeout = connectTimeout + ) val publishResults = payloads.iterator.map { case (fileName, data) => log.info(s"Uploading $fileName") diff --git a/libs/util/src/mill/exports.scala b/libs/util/src/mill/exports.scala index 14c83bfbd07c..06b76c4c2cbe 100644 --- a/libs/util/src/mill/exports.scala +++ b/libs/util/src/mill/exports.scala @@ -11,4 +11,5 @@ export mill.api.Task.Worker export mill.api.DefaultTaskModule export mill.api.JsonFormatters.* export mill.util.TokenReaders.* +export mill.util.CoursierConfig export upickle.implicits.namedTuples.default.given