artifactory-gradle-plugin icon indicating copy to clipboard operation
artifactory-gradle-plugin copied to clipboard

Publications List Ignored

Open OndraBasler opened this issue 11 months ago • 0 comments

Describe the bug

I have a KMM library in which I define two publications aar and framework. I declare that these two publications should be published by artifactory plugin. The artifactoryPublish task publishes these two publications and additionally publishes .module metadata about publications which are not listed in defaults block.

We used the plugin version 4.33.1 and it worked. It started to happen after migration to 5.2.0.

Current behavior

The :library module is kotlin multiplatform library. According to this article kotlin multiplatform plugin along with maven-publish plugin creates publications for each target.

Configuration of artifactory plugin in root build.gradle.kts

configure<ArtifactoryPluginConvention> {
    val artifactoryContextUrl: String by rootProject
    val artifactoryKeyRelease: String by rootProject
    publish {
        contextUrl = artifactoryContextUrl
        repository {
            repoKey = artifactoryKeyRelease
            username = System.getenv("ARTIFACTORY_LOGIN")
            password = System.getenv("ARTIFACTORY_PASSWORD")
        }
        defaults {
            publications("aar", "framework")
            setPublishIvy(false)
            setProperties(mapOf("q.os" to "kmm", "dev.team" to "xxx"))
        }
    }
}

Declaration of publications that should be published by the artifactory task.

publishing {
    val libraryVersion: String by rootProject
    val artifactoryGroupId: String by rootProject
    val artifactoryArtifactId: String by rootProject
    val artifactoryArtifactIdIos: String by rootProject

    publications {
        register<MavenPublication>("aar") {
            groupId = artifactoryGroupId
            version = libraryVersion
            artifactId = artifactoryArtifactId

            artifact("$buildDir/outputs/aar/library-release.aar")
            pom.withXml {
                val dependencies = asNode().appendNode("dependencies")
                val common = configurations.commonMainImplementation.get().allDependencies
                val android = configurations.implementation.get().allDependencies
                (common + android).forEach {
                    dependencies.appendNode("dependency").apply {
                        appendNode("groupId", it.group)
                        appendNode("artifactId", it.name)
                        appendNode("version", it.version)
                    }
                }
            }
        }
        register<MavenPublication>("framework") {
            groupId = artifactoryGroupId
            version = libraryVersion
            artifactId = artifactoryArtifactIdIos

            artifact("$buildDir/faktory/zip/frameworkarchive.zip")
        }
    }
}

The artifactoryPublish task publishes publications framework, aar and module info about publications defined in KMM. Module info shouldn't be deployed. See enclosed build log.

> Task :library:generateCommonMainxxxDatabaseInterface UP-TO-DATE
> Task :library:androidReleaseSourcesJar UP-TO-DATE
> Task :library:preBuild UP-TO-DATE
> Task :library:preReleaseBuild UP-TO-DATE
> Task :library:mergeReleaseJniLibFolders UP-TO-DATE
> Task :library:mergeReleaseNativeLibs NO-SOURCE
> Task :library:stripReleaseDebugSymbols NO-SOURCE
> Task :library:copyReleaseJniLibsProjectAndLocalJars UP-TO-DATE
> Task :library:generateReleaseResValues UP-TO-DATE
> Task :library:extractDeepLinksForAarRelease UP-TO-DATE
> Task :library:checkKotlinGradlePluginConfigurationErrors
> Task :library:generateReleaseResources UP-TO-DATE
> Task :library:packageReleaseResources UP-TO-DATE
> Task :library:parseReleaseLocalResources UP-TO-DATE
> Task :library:generateReleaseRFile UP-TO-DATE
> Task :library:compileReleaseKotlinAndroid UP-TO-DATE
> Task :library:extractReleaseAnnotations UP-TO-DATE
> Task :library:javaPreCompileRelease UP-TO-DATE
> Task :library:compileReleaseJavaWithJavac NO-SOURCE
> Task :library:mergeReleaseGeneratedProguardFiles UP-TO-DATE
> Task :library:mergeReleaseConsumerProguardFiles UP-TO-DATE
> Task :library:mergeReleaseShaders UP-TO-DATE
> Task :library:compileReleaseShaders NO-SOURCE
> Task :library:generateReleaseAssets UP-TO-DATE
> Task :library:packageReleaseAssets UP-TO-DATE
> Task :library:prepareLintJarForPublish UP-TO-DATE
> Task :library:prepareReleaseArtProfile UP-TO-DATE
> Task :library:processReleaseManifest UP-TO-DATE
> Task :library:processReleaseJavaRes UP-TO-DATE
> Task :library:mergeReleaseJavaResource UP-TO-DATE
> Task :library:syncReleaseLibJars UP-TO-DATE
> Task :library:writeReleaseAarMetadata UP-TO-DATE
> Task :library:bundleReleaseAar UP-TO-DATE
> Task :library:generateMetadataFileForAndroidReleasePublication
> Task :library:kspKotlinIosArm64 UP-TO-DATE
> Task :library:compileKotlinIosArm64 UP-TO-DATE
> Task :commonizeNativeDistribution UP-TO-DATE
> Task :library:transformCommonMainDependenciesMetadata UP-TO-DATE
> Task :library:compileCommonMainKotlinMetadata UP-TO-DATE
> Task :library:metadataCommonMainProcessResources NO-SOURCE
> Task :library:metadataCommonMainClasses UP-TO-DATE
> Task :library:transformNativeMainDependenciesMetadata UP-TO-DATE
> Task :library:compileNativeMainKotlinMetadata NO-SOURCE
> Task :library:metadataNativeMainProcessResources NO-SOURCE
> Task :library:metadataNativeMainClasses UP-TO-DATE
> Task :library:transformAppleMainDependenciesMetadata UP-TO-DATE
> Task :library:compileAppleMainKotlinMetadata NO-SOURCE
> Task :library:metadataAppleMainProcessResources NO-SOURCE
> Task :library:metadataAppleMainClasses UP-TO-DATE
> Task :library:transformIosMainDependenciesMetadata UP-TO-DATE
> Task :library:compileIosMainKotlinMetadata UP-TO-DATE
> Task :library:metadataIosMainProcessResources NO-SOURCE
> Task :library:metadataIosMainClasses UP-TO-DATE
> Task :library:iosArm64MetadataJar UP-TO-DATE
> Task :library:iosArm64SourcesJar UP-TO-DATE
> Task :library:generateMetadataFileForIosArm64Publication
> Task :library:kspKotlinIosSimulatorArm64 UP-TO-DATE
> Task :library:compileKotlinIosSimulatorArm64 UP-TO-DATE
> Task :library:iosSimulatorArm64MetadataJar UP-TO-DATE
> Task :library:iosSimulatorArm64SourcesJar UP-TO-DATE
> Task :library:generateMetadataFileForIosSimulatorArm64Publication
> Task :library:kspKotlinIosX64 UP-TO-DATE
> Task :library:compileKotlinIosX64 UP-TO-DATE
> Task :library:iosX64MetadataJar UP-TO-DATE
> Task :library:iosX64SourcesJar UP-TO-DATE
> Task :library:generateMetadataFileForIosX64Publication
> Task :library:generateProjectStructureMetadata UP-TO-DATE
> Task :library:allMetadataJar UP-TO-DATE
> Task :library:sourcesJar UP-TO-DATE
> Task :library:generateMetadataFileForKotlinMultiplatformPublication
> Task :library:generatePomFileForAarPublication
> Task :library:generatePomFileForAndroidReleasePublication
> Task :library:generatePomFileForFrameworkPublication
> Task :library:generatePomFileForIosArm64Publication
> Task :library:generatePomFileForIosSimulatorArm64Publication
> Task :library:generatePomFileForIosX64Publication
> Task :library:generatePomFileForKMMBridgeFrameworkPublication
> Task :library:generatePomFileForKotlinMultiplatformPublication
> Task :library:artifactoryPublish
> Task :artifactoryPublish
> Task :extractModuleInfo
> Task :library:extractModuleInfo
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/XxxXxxXxx/library-android/unspecified/library-android-unspecified.module
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/XxxXxxXxx/library-iosarm64/unspecified/library-iosarm64-unspecified.module
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/XxxXxxXxx/library-iossimulatorarm64/unspecified/library-iossimulatorarm64-unspecified.module
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/XxxXxxXxx/library-iosx64/unspecified/library-iosx64-unspecified.module
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/XxxXxxXxx/library/unspecified/library-unspecified.module
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/cz/xxx/modules/xxx-android/1.0.5/xxx-android-1.0.5.aar
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/cz/xxx/modules/xxx-ios/1.0.5/xxx-ios-1.0.5.zip
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/cz/xxx/modules/xxx-android/1.0.5/xxx-android-1.0.5.pom
[pool-52-thread-1] Deploying artifact: https://xxx.jfrog.io/xxx/xxx-xxx-xxx/cz/xxx/modules/xxx-ios/1.0.5/xxx-ios-1.0.5.pom

I believe that the issue is in PublicationExtractor in extractModuleInfo. There is a filter on GenerateModuleMetadata tasks with respect to publications. I think there should be included a filter for declared publications. I debugged extractModuleInfo and found out that KMM publication tasks are not filtered out. See screenshot below.

    public void extractModuleInfo() {
        for (GenerateModuleMetadata generateModuleMetadata : artifactoryTask.getProject().getTasks().withType(GenerateModuleMetadata.class)) {
            Publication publication = generateModuleMetadata.getPublication().get();
            if (!isApplicablePublication(publication)) {
                continue;
            }

            File moduleMetadata = generateModuleMetadata.getOutputFile().getAsFile().get();
            if (!moduleMetadata.exists()) {
                continue;
            }

            DeployDetails.Builder builder = createArtifactBuilder(moduleMetadata, generateModuleMetadata.getPublication().get().getName());

            //noinspection unchecked
            ActualPublication actualPublication = (ActualPublication) publication;
            PublishArtifactInfo artifactInfo = new PublishArtifactInfo(getPublicationArtifactId(actualPublication), "module", "module", null, moduleMetadata);
            addArtifactToDeployDetails(actualPublication, builder, artifactInfo);
        }
    }

Publications named androidRelease, iosArm64, iosSimulatorArm64, iosX64, kotlinMultiplatform are filtered. image

Reproduction steps

  • Install KMM plugin to Android Studio.
  • Create a basic KMM library using wizard.
  • Add additional publication in the KMM library that is going to be published to Artifactory.
  • Add artifactory plugin in the version 5.2.0 and configure it so the given publication is the only one to be published.
  • Run artifactory plugin and watch what is published to artifactory.

Expected behavior

I expect that only declared artifacts along with their POM (or other metadata) are published to artifactory.

Artifactory Gradle plugin version

5.2.0

Operating system type and version

macOs 14.3.1 (23D60)

JFrog Artifactory version

No response

Gradle version

8.2.2 / 8.3.0

OndraBasler avatar Mar 12 '24 14:03 OndraBasler