mill icon indicating copy to clipboard operation
mill copied to clipboard

Local build + install workflow is broken

Open lefou opened this issue 1 month ago • 1 comments

My workflow to locally build and install Mill is broken with the latest main.

> just install
MILL_STABLE_VERSION=1 mill dist.installLocalCache + dist.installLocal
[6024/7957] libs.javalib.testrunner.entrypoint.compile
[6024] [info] compiling 1 Java source to /home/lefou/work/opensource/mill/out/libs/javalib/testrunner/entrypoint/compile.dest/classes ...
[6024] [info] done compiling
[6242/7957] core.constants.compile
[6242] [info] compiling 1 Java source to /home/lefou/work/opensource/mill/out/core/constants/compile.dest/classes ...
[6242] [info] done compiling
[6453/7957] libs.init.gradle.api.publishLocal
[6454/7957] libs.init.gradle.api.publishLocal
[6453] Publishing Artifact(com.lihaoyi,mill-libs-init-gradle-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6454] Publishing Artifact(com.lihaoyi,mill-libs-init-gradle-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6508/7957] libs.javalib.testrunner.entrypoint.publishLocal
[6510/7957] contrib.scoverage.api.publishLocal
[6507/7957] libs.javalib.testrunner.entrypoint.publishLocal
[6508] Publishing Artifact(com.lihaoyi,mill-libs-javalib-testrunner-entrypoint,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6510] Publishing Artifact(com.lihaoyi,mill-contrib-scoverage-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6511/7957] contrib.scoverage.api.publishLocal
[6507] Publishing Artifact(com.lihaoyi,mill-libs-javalib-testrunner-entrypoint,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6511] Publishing Artifact(com.lihaoyi,mill-contrib-scoverage-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6521/7957] libs.javalib.backgroundwrapper.publishLocal
[6521] Publishing Artifact(com.lihaoyi,mill-libs-javalib-backgroundwrapper,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6522/7957] libs.javalib.backgroundwrapper.publishLocal
[6522] Publishing Artifact(com.lihaoyi,mill-libs-javalib-backgroundwrapper,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6559/7957] contrib.playlib.api.publishLocal
[6558/7957] contrib.playlib.api.publishLocal
[6559] Publishing Artifact(com.lihaoyi,mill-contrib-playlib-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6558] Publishing Artifact(com.lihaoyi,mill-contrib-playlib-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[7957/7957, 1 failed] ============================== dist.installLocalCache + dist.installLocal ============================== 3s
1 tasks failed
[6558] contrib.playlib.api.publishLocal java.nio.file.FileAlreadyExistsException: /home/lefou/.ivy2/local/com.lihaoyi/mill-contrib-playlib-api/1.1.0-RC1-93-a14736/poms/mill-contrib-playlib-api.pom
    java.base/sun.nio.fs.UnixFileSystem.copy(UnixFileSystem.java:1044)
    java.base/sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:300)
    java.base/java.nio.file.Files.copy(Files.java:1305)
    os.copy$.copyOne$1(FileOps.scala:208)
    os.copy$.apply(FileOps.scala:212)
    os.copy$over$.apply(FileOps.scala:308)
    mill.util.FileSetContents$.writeTo$$anonfun$1(FileSetContents.scala:19)
    scala.collection.Iterator$$anon$9.next(Iterator.scala:584)
    scala.collection.mutable.Growable.addAll(Growable.scala:62)
    scala.collection.mutable.Growable.addAll$(Growable.scala:57)
    scala.collection.immutable.VectorBuilder.addAll(Vector.scala:1825)
    scala.collection.immutable.Vector$.from(Vector.scala:1397)
    scala.collection.IterableOnceOps.toVector(IterableOnce.scala:1452)
    scala.collection.IterableOnceOps.toVector$(IterableOnce.scala:1452)
    scala.collection.AbstractIterator.toVector(Iterator.scala:1306)
    mill.util.FileSetContents$.writeTo(FileSetContents.scala:14)
    mill.javalib.publish.LocalIvyPublisher.publishLocal(LocalIvyPublisher.scala:44)
    mill.javalib.PublishModule.publishLocalTask$$anonfun$3(PublishModule.scala:392)
    mill.api.Task$Anon.evaluate(Task.scala:455)

Not sure, why we can end up with running the same task (contrib.playlib.api.publishLocal, as [6559] and [6558]) twice, but it doesn't look right.

This isn't self-fixing by just retrying, but gets worse.

> just install
MILL_STABLE_VERSION=1 mill dist.installLocalCache + dist.installLocal
[6465/7957] libs.init.gradle.api.publishLocal
[6467/7957] libs.init.gradle.api.publishLocal
[6474/7957] libs.javalib.testrunner.entrypoint.publishLocal
[6475/7957] libs.javalib.testrunner.entrypoint.publishLocal
[6465] Publishing Artifact(com.lihaoyi,mill-libs-init-gradle-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6467] Publishing Artifact(com.lihaoyi,mill-libs-init-gradle-api,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6474] Publishing Artifact(com.lihaoyi,mill-libs-javalib-testrunner-entrypoint,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[6475] Publishing Artifact(com.lihaoyi,mill-libs-javalib-testrunner-entrypoint,1.1.0-RC1-93-a14736) to ivy repo /home/lefou/.ivy2/local
[7957/7957, 1 failed] ============================== dist.installLocalCache + dist.installLocal ============================== 1s
1 tasks failed
[6465] libs.init.gradle.api.publishLocal java.nio.file.NoSuchFileException: /home/lefou/.ivy2/local/com.lihaoyi/mill-libs-init-gradle-api/1.1.0-RC1-93-a14736/poms/mill-libs-init-gradle-api.pom
    java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
    java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
    java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    java.base/sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:291)
    java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
    java.base/java.nio.file.Files.delete(Files.java:1153)
    os.remove$all$.apply(FileOps.scala:345)
    os.remove$all$.apply(FileOps.scala:332)
    os.copy$over$.apply(FileOps.scala:300)
    mill.util.FileSetContents$.writeTo$$anonfun$1(FileSetContents.scala:19)
    scala.collection.Iterator$$anon$9.next(Iterator.scala:584)
    scala.collection.mutable.Growable.addAll(Growable.scala:62)
    scala.collection.mutable.Growable.addAll$(Growable.scala:57)
    scala.collection.immutable.VectorBuilder.addAll(Vector.scala:1825)
    scala.collection.immutable.Vector$.from(Vector.scala:1397)
    scala.collection.IterableOnceOps.toVector(IterableOnce.scala:1452)
    scala.collection.IterableOnceOps.toVector$(IterableOnce.scala:1452)
    scala.collection.AbstractIterator.toVector(Iterator.scala:1306)
    mill.util.FileSetContents$.writeTo(FileSetContents.scala:14)
    mill.javalib.publish.LocalIvyPublisher.publishLocal(LocalIvyPublisher.scala:44)
    mill.javalib.PublishModule.publishLocalTask$$anonfun$3(PublishModule.scala:392)
    mill.api.Task$Anon.evaluate(Task.scala:455)

lefou avatar Nov 07 '25 14:11 lefou

Might be introduced by #6070, but that's just a guess.

Edit: confirmed by git bisecting it.

b0890189e8f4df18522f6f573e1de1e24081c044 is the first bad commit
commit b0890189e8f4df18522f6f573e1de1e24081c044
Author: Alexandre Archambault <[email protected]>
Date:   Fri Oct 31 14:49:34 2025 +0100

    Run examples with local repo under out/ rather than ~/.ivy2/local (#6070)

lefou avatar Nov 09 '25 22:11 lefou