jfrog / artifactory-gradle-plugin

JFrog Gradle plugin for Build Info extraction and Artifactory publishing.
Apache License 2.0
20 stars 15 forks source link

Publications List Ignored #108

Open OndraBasler opened 4 months ago

OndraBasler commented 4 months ago

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

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