Giter VIP home page Giter VIP logo

artifactory-gradle-plugin's People

Contributors

attiasas avatar legnoh avatar or-geva avatar sverdlov93 avatar talarian1 avatar tomfi avatar yahavi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

artifactory-gradle-plugin's Issues

Publishing build info fails with 400 “Could not insert build” when dependency is referenced by a lot of tasks

Describe the bug

When a dependency of a module is referenced by a lot of tasks, publishing build info fails with

{
  "errors" : [ {
    "status" : 400,
    "message" : "Could not insert build BuildWrapper(build=Build{…}, buildRepo=artifactory-build-info)"
  } ]
}

The problem is that dependency scopes can get very large, in our case some are over 1200 characters. Artifactory fails to insert such dependencies into the database with

Caused by: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(1024)
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2676)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2366)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:356)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:496)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:413)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:152)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at org.jfrog.storage.JdbcHelper.executeUpdate(JdbcHelper.java:267)
at org.jfrog.storage.JdbcHelper.executeUpdate(JdbcHelper.java:244)
at org.artifactory.storage.db.build.dao.BuildDependenciesDao.createBuildDependency(BuildDependenciesDao.java:60)
at org.artifactory.storage.db.build.dao.BuildDependenciesDao.createBuildDependencies(BuildDependenciesDao.java:54)
at org.artifactory.storage.db.build.service.BuildStoreServiceImpl.insertModules(BuildStoreServiceImpl.java:224)
at org.artifactory.storage.db.build.service.BuildStoreServiceImpl.addBuild(BuildStoreServiceImpl.java:149)

We have Android modules that have multiple product flavours and also unit and instrumented tests. There are 28 tasks (scopes) listed in our build info JSON for some dependencies. Some of the tasks are Android Gradle Plugin's internal tasks prefixed with _agp_internal_.

Some solutions on the side of the Artifactory Gradle Plugin would be:

  1. an option to disable or filter dependency scopes (task names)
  2. an option to disable or filter dependencies, especially third-party ones

Current behavior

Publishing build info fails due to a PSQL exception

Reproduction steps

No response

Expected behavior

Publishing build info succeeds

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Debian Linux 12.2

JFrog Artifactory version

7.68.7

Gradle version

8.3

Cannot resolve artifacts after upgrading from version 4.9.7

How can we help?

I need help configuring my gradle build script. Under version 4.9.7 of the plug-in, this configuration worked:

artifactory {

    def artifactoryUser = 'redacted'
    def artifactoryPassword = 'redacted'

    contextUrl = 'https://redacted.jfrog.io/redacted'
    publish {
        repository {
            repoKey = 'redacted-snapshot'
            username = "${artifactoryUser}"
            password = "${artifactoryPassword}"
            maven = true
        }

        defaults {
            publications('mavenJava')
        }
    }
    resolve {
        repository {
            repoKey = 'redacted-release'
            username = "${artifactoryUser}"
            password = "${artifactoryPassword}"
            maven = true
        }
    }
}

After upgrading to version 5.1.6, I have tried to move the resolving functionality to the repositories closure, as directed in the upgrade instructions:

repositories {
    mavenCentral()  // primary repository for 3rd party dependencies
    mavenLocal()    // repository for local publishing via Maven
    maven {
        url "https://redacted.jfrog.io/artifactory/redacted-release/"
        credentials {
            username = "redacted"
            password = "redacted"
        }
    }
}

However, this does not work. I cannot resolve any of our artifacts. I additionally tried adding "artifactUrls" statements to the repository configuration, but these do not work either.

What am I missing here?

Unable to apply com.jfrog.artifactory plugin in a build-logic included build gradle.kts precompiled build script

Describe the bug

Specifying the dependency in a root-level build.gradle.kts with a version directly or via version catalog and not applying it but instead opting to apply it inside build-logic convention plugin produces the following error log

* Where:
Precompiled script plugin '***/build-logic/src/main/kotlin/artifactory-publishing.gradle.kts' line: 1

* What went wrong:
Plugin [id: 'com.jfrog.artifactory'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)

Current behavior

Unable to apply com.jfrog.artifactory plugin to lift out the publishing logic into a convention plugin

Reproduction steps

No response

Expected behavior

Being able to set up publishing from a convention plugin inside an included build

Artifactory Gradle plugin version

5.1.13 or any

Operating system type and version

MacOS

JFrog Artifactory version

No response

Gradle version

8.2.0

v5.1.10 doesn't support confuration cache

Is your feature request related to a problem? Please describe.

image

Describe the solution you'd like to see

support confuration cache.

Describe alternatives you've considered

No response

Additional context

No response

Artifactory doesn't meet configuration cache requirements

Describe the bug

No ability to enable configuration cache while using artifactory as well as the fact artifactory makes use of cross configuration killing gains possible by configureondemand Gradle feature

Current behavior

Cross configuration and use of Project in task actions, implicit input/outputs instead of specified explicitly

Reproduction steps

Use artifactory gradle plugin

Expected behavior

Artifactory plugins adhere to best practices for Gradle plugins, avoid cross configuration, use lazy APIs, migrate all configuration cache incompatible code to new APIs
https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements

Artifactory Gradle plugin version

5.1.13

Operating system type and version

MacOS

JFrog Artifactory version

No response

Gradle version

No response

Each call `artifactory.publish` method creates a new publication configuration

Each time the artifactory.publish method is called, a completely new publication configuration is created. This behavior prevents the implementation of convention plugins that preconfigure the artifactory extension, giving you the opportunity to reconfigure it at the project level. The culprit for this is the call that should be in the constructor:

publisherConfig = project.getObjects().newInstance(PublisherConfig.class, project.getObjects(), this);

How can I define two repo keys for snapshot and release?

How can we help?

Hi,

We have two repo URLs for snapshots and releases:

http://artifactory.movio.co/artifactory/libs-release-local
http://artifactory.movio.co/artifactory/libs-snapshot-local

I tried searching through the examples, and even the code, but couldn't figure out how I should configure it.

Seems that the logic is implemented here: https://github.com/jfrog/artifactory-gradle-plugin/blob/main/src/main/java/org/jfrog/gradle/plugin/artifactory/utils/PublicationUtils.java#L177

I thought the following would work, but it doesn't recognize releaseRepoKey and snapshotRepoKey.

plugins {
    id "com.jfrog.artifactory" version "5.+"
}


artifactory {
  publish {
    // Define the Artifactory URL for publishing artifacts
    contextUrl = 'http://artifactory.movio.co/artifactory'
    // Define the project repository to which the artifacts will be published
    repository {
        // Set the Artifactory repository key
        releaseRepoKey = 'libs-release-local'
        snapshotRepoKey = 'libs-snapshot-local'
    }

    // Include all configured publications for all the modules
    defaults {
        publications('ALL_PUBLICATIONS')
    }
  }
}

The error is:

Could not set unknown property 'releaseRepoKey' for object of type org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig$Repository

I'm using Gradle 8.5.

Thanks!

Artifactory plugin pulls in outdated Jackson version

Describe the bug

The plugin pulls in the outdated Jackson version 2.14.1 https://github.com/jfrog/artifactory-gradle-plugin/blob/2576ef39a4a8a5e6a523a00a4e3be1ec1e1a18d2/build.gradle.kts#L48C71-L48C77.

This causes errors in other plugins.

Current behavior

Gradle build fails with errors.

java.lang.NoSuchFieldError: Class com.fasterxml.jackson.annotation.JsonFormat$Feature does not have member
 field 'com.fasterxml.jackson.annotation.JsonFormat$Feature READ_DATE_TIMESTAMPS_AS_NANOSECONDS'

Reproduction steps

Go to https://github.com/veita/gradle-plugin-dependency-bug and follow the steps described there.

Expected behavior

The Artifactory should play nicely with other plugins.

Artifactory Gradle plugin version

5.1.1

Operating system type and version

Linux

JFrog Artifactory version

Any.

Gradle version

8.6

Looks like publishBuildInfo became read-only after update to 5.1.0

Describe the bug

Have the following section in my gradle file

defaults {
    publishBuildInfo = false
    publishArtifacts = true
    publishPom = true
    publications('debugapk','testapk', 'apk')
}

Changed artifactory plugin version from 4.7.x to 5.1.0.
Gradle sync bringing errors now.

Current behavior

Failed to notify build listener.

> Cannot set the value of read-only property 'publishBuildInfo' for object of type org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig.

> Cannot set the value of read-only property 'publishBuildInfo' for object of type org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig.

> Cannot set the value of read-only property 'publishBuildInfo' for object of type org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig.

 

* Try:

> Run with --info or --debug option to get more log output.

> Run with --scan to get full insights.

 

* Exception is:

org.gradle.internal.event.ListenerNotificationException: Failed to notify build listener.

            at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:89)

            at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)

            at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)

            at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)

            at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)

            at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)

            at jdk.proxy1/jdk.proxy1.$Proxy27.projectsEvaluated(Unknown Source)

            at org.gradle.initialization.ProjectsEvaluatedNotifier$NotifyProjectsEvaluatedListeners.run(ProjectsEvaluatedNotifier.java:47)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)

            at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)

            at org.gradle.initialization.ProjectsEvaluatedNotifier.notify(ProjectsEvaluatedNotifier.java:35)

            at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:51)

            at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)

            at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)

            at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)

            at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)

            at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$3(VintageBuildModelController.java:89)

            at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:227)

            at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)

            at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:226)

            at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:201)

            at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)

            at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:197)

            at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:89)

            at org.gradle.initialization.VintageBuildModelController.getConfiguredModel(VintageBuildModelController.java:64)

            at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$withProjectsConfigured$1(DefaultBuildLifecycleController.java:121)

            at org.gradle.internal.model.StateTransitionController.lambda$notInState$4(StateTransitionController.java:143)

            at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)

            at org.gradle.internal.model.StateTransitionController.notInState(StateTransitionController.java:139)

            at org.gradle.internal.build.DefaultBuildLifecycleController.withProjectsConfigured(DefaultBuildLifecycleController.java:121)

            at org.gradle.internal.build.DefaultBuildToolingModelController.locateBuilderForTarget(DefaultBuildToolingModelController.java:57)

            at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.lambda$locateBuilderForTarget$0(DefaultBuildTreeModelCreator.java:73)

            at org.gradle.internal.build.DefaultBuildLifecycleController.withToolingModels(DefaultBuildLifecycleController.java:178)

            at org.gradle.internal.build.AbstractBuildState.withToolingModels(AbstractBuildState.java:111)

            at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForTarget(DefaultBuildTreeModelCreator.java:73)

            at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForDefaultTarget(DefaultBuildTreeModelCreator.java:68)

            at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getTarget(DefaultBuildController.java:157)

            at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getModel(DefaultBuildController.java:101)

            at org.gradle.tooling.internal.consumer.connection.ParameterAwareBuildControllerAdapter.getModel(ParameterAwareBuildControllerAdapter.java:39)

            at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.getModel(UnparameterizedBuildController.java:113)

            at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.getModel(NestedActionAwareBuildControllerAdapter.java:31)

            at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:97)

            at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31)

            at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:81)

            at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31)

            at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:66)

            at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31)

            at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:125)

            at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:42)

            at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:64)

            at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.runAction(AbstractClientProvidedBuildActionRunner.java:131)

            at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.beforeTasks(AbstractClientProvidedBuildActionRunner.java:99)

            at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator.beforeTasks(DefaultBuildTreeModelCreator.java:52)

            at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$fromBuildModel$1(DefaultBuildTreeLifecycleController.java:75)

            at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:106)

            at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)

            at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)

            at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:166)

            at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)

            at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)

            at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:103)

            at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.fromBuildModel(DefaultBuildTreeLifecycleController.java:74)

            at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:43)

            at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:53)

            at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)

            at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)

            at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:69)

            at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:119)

            at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)

            at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)

            at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:128)

            at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)

            at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)

            at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)

            at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)

            at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)

            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)

            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)

            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)

            at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)

            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)

            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)

            at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)

            at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)

            at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:119)

            at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)

            at org.gradle.tooling.internal.provider.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:103)

            at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)

            at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)

            at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)

            at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)

            at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)

            at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)

            at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)

            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)

            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)

            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)

            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)

            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)

            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)

            at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)

            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)

            at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)

            at org.gradle.util.internal.Swapper.swap(Swapper.java:38)

            at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)

            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)

            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)

            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)

            at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)

            at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)

            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)

            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)

Cause 1: groovy.lang.GroovyRuntimeException: Cannot set the value of read-only property 'publishBuildInfo' for object of type org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig.

            at org.gradle.internal.metaobject.AbstractDynamicObject.setReadOnlyProperty(AbstractDynamicObject.java:137)

            at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.setProperty(BeanDynamicObject.java:372)

            at org.gradle.internal.metaobject.BeanDynamicObject.trySetProperty(BeanDynamicObject.java:181)

            at org.gradle.internal.metaobject.ConfigureDelegate.setProperty(ConfigureDelegate.java:94)

            at org.gradle.internal.metaobject.BeanDynamicObject$GroovyObjectAdapter.setOpaqueProperty(BeanDynamicObject.java:569)

            at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.setProperty(BeanDynamicObject.java:415)

            at org.gradle.internal.metaobject.BeanDynamicObject.trySetProperty(BeanDynamicObject.java:181)

            at org.gradle.internal.metaobject.ConfigureDelegate.setProperty(ConfigureDelegate.java:99)

           

Reproduction steps

Changed artifactory plugin version from 4.7.x to 5.1.0.

Expected behavior

Gradle sync completes without errors. Default value for publishBuildInfo can be set.

Artifactory Gradle plugin version

5.1.0

Operating system type and version

Mac OS X

JFrog Artifactory version

No response

Gradle version

7.4

No environment variables in build info JSON

Describe the bug

With clientConfig.isIncludeEnvVars = true set, there are no environment variables in the generated build info JSON. Custom properties added with buildInfo.addEnvironmentProperty are not there either. I suspect that the issue is that the environment is not stored in org.jfrog.build.api.Build but its parent BaseBuildBean's properties.

Current behavior

There are no environment variables in the generated build info JSON

Reproduction steps

No response

Expected behavior

Environment variables are in the generated build info JSON

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Debian Linux 12.2

JFrog Artifactory version

7.68.7

Gradle version

8.3

The Project.getConvention() method has been deprecated

Describe the bug

When building on Gradle 8.2 I get the following warning

The Project.getConvention() method has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.2.1/userguide/upgrading_version_8.html#deprecated_access_to_conventions
        at org.gradle.api.internal.project.DefaultProject.getConvention(DefaultProject.java:593)
        at org.jfrog.gradle.plugin.artifactory.utils.ConventionUtils.getOrCreateArtifactoryConvention(ConventionUtils.java:28)
        at org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin.apply(ArtifactoryPlugin.java:27)
        at org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin.apply(ArtifactoryPlugin.java:17)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)

Project.getConvention() is deprecated for removal in Gradle 9.0

Current behavior

The Artifactory plugin in version 5.0.3 emits warnings about using deprecated Gradle features.

Reproduction steps

No response

Expected behavior

No response

Artifactory Gradle plugin version

5.0.3

Operating system type and version

MacOS aarch64

JFrog Artifactory version

N/A

Gradle version

8.2.1

Ivy publication publishing does not work anymore since Gradle 8.4

Describe the bug

It is no longer possible to publish Ivy publications with Gradle 8.4: the artifactoryPublish task fails with the exception stack given below.

Using the same version of Artifactory Gradle plugin ans same build script configuration the publishing works fine with Gradle 8.3

This issue comes from some internal Gradle api/method used by Artifactory plugin, that were removed in Gradle 8.4.
Especially this one:

IvyPublicationIdentity projectIdentity = ivyNormalizedPublication.getProjectIdentity();

is using a method removed in IvyNormalizedPublication : https://github.com/gradle/gradle/blob/bb3bc9e4593cd4938f5bad3329163e4e8b4a3281/subprojects/ivy/src/main/java/org/gradle/api/publish/ivy/internal/publisher/IvyNormalizedPublication.java#L25C14-L25C39

Current behavior

Trying to publish an ivy publication fails with the following stack trace:

$ ./gradlew artifactoryPublish


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':artifactoryPublish'.
> 'org.gradle.api.publish.ivy.internal.publisher.IvyPublicationIdentity org.gradle.api.publish.ivy.internal.publisher.IvyNormalizedPublication.getProjectIdentity()'

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':artifactoryPublish'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:148)
	
Caused by: java.lang.NoSuchMethodError: 'org.gradle.api.publish.ivy.internal.publisher.IvyPublicationIdentity org.gradle.api.publish.ivy.internal.publisher.IvyNormalizedPublication.getProjectIdentity()'
	at org.jfrog.gradle.plugin.artifactory.utils.PublicationUtils.extractIvyDeployDetails(PublicationUtils.java:145)
	at org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask.collectDetailsFromIvyPublications(ArtifactoryTask.java:142)
	at org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask.collectDeployDetails(ArtifactoryTask.java:125)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
    [ ... ]

Reproduction steps

Using a simple build configuration with Artifactory gradle plugin and Ivy Publish plugin applied, try to publish the ivy publication by executing task artifactoryPublish

Exemple of simple build setup to reproduce easily: https://gist.github.com/mricciuti/6d7f3c15383ba07747fca6cb661f7f55

Expected behavior

The publish task should work as expected, and the ivy publication deployed to the target Artifactory without error.

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Windows 11

JFrog Artifactory version

7.49.10

Gradle version

8.4

Bug with getPublisherConfig()

Describe the bug

I am not sure if this is a usage issue on my end, but when I attempt to use GradleRunner.build() I get an UnexpectedBuildError from Gradle

Current behavior

When running functional tests on my software, using GradleRunner.build(), I get the following error:

Cannot invoke "org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig.repository(org.gradle.api.Action)" because the return value of "org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention.getPublisherConfig()" is null

Reproduction steps

No response

Expected behavior

That the tests will pass

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Ubuntu Linux 20.04.6

JFrog Artifactory version

No response

Gradle version

8.4

How does the plugin get configuration information from the JFrog CLI?

How can we help?

I have a question about the JFrog CLI in respect to how it's integrated with Gradle. When I'm executing a GitHub Action, I am running the steps shown here:

image

My question: When I'm executing the "jf gradle" command, do I have access inside Gradle (in an extension or something) to what is set via the "--repo-deploy" switch passed to the "jf gradle-config" command? I'm trying to get access to this information for an in-house plugin that I'm currently working on.

I've launched both the JFrog CLI and Gradle with debug logging and nothing is really jumping out at me.

Thanks for your time!

Cannot access class 'org.jfrog.build.extractor.clientConfiguration.ArtifactoryClientConfiguration'

Describe the bug

I'm upgrading from v4 to v5, my setup looks like the following (omitting some internal things):

buildSrc/build.gradle.kts

import java.util.Properties

plugins {
  `kotlin-dsl`
}

repositories {
  mavenCentral()
  mavenLocal()
  gradlePluginPortal()
}

Properties().apply {
  val props = this
  rootDir.toPath().resolveSibling(Project.GRADLE_PROPERTIES).toFile().apply {
    val file = this
    file.inputStream().use {
      props.load(it)
    }
  }
}.forEach { key, value -> project.extra.set(key as String, value) }

dependencies {
  ...
  val artifactoryGradlePluginVerison: String by project
  implementation("org.jfrog.buildinfo:build-info-extractor-gradle:$artifactoryGradlePluginVerison")
}

Than in a convention:
buildSrc/src/main/kotlin/foo.conventions.gradle.kts

plugins {
  ...
  id("com.jfrog.artifactory")
}

...

configure<org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention> {
  // general
  clientConfig.isIncludeEnvVars = true
  clientConfig.envVarsExcludePatterns = "*password*,*secret*,*key*,*token*,*passphrase*"
  clientConfig.timeout = 3600

  // publisher
  clientConfig.publisher.isMaven = true
  clientConfig.publisher.username = artifactoryUsername
  clientConfig.publisher.password = artifactoryPassword
  clientConfig.publisher.repoKey = "..."

  // build info
  clientConfig.info.buildName = artifactoryBuildName
  clientConfig.info.buildNumber = buildNumber

  publish {
    contextUrl = "..."
    defaults {
      publications("ALL_PUBLICATIONS")
      setProperties(
        mapOf(
          "build.name" to artifactoryBuildName,
          "build.number" to buildNumber,
        )
      )
    }
  }
}

When trying to build, I'm getting:

e: file:///... Cannot access class 'org.jfrog.build.extractor.clientConfiguration.ArtifactoryClientConfiguration'. Check your module classpath for missing or conflicting dependencies

After digging a bit, i found that you import dependencies in your repositories using implementation(...), this makes the internal libraries you import not accesibble for people that import your plugins (see api(...) and implementation(...) in gradle https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration)

After importing your transative libraries manually:

  implementation("org.jfrog.buildinfo:build-info-extractor:2.39.8")
  implementation("org.jfrog.buildinfo:build-info-client:2.39.8")

It works as expected.

Please change the scope of your imports to api instead of implementation so the plugin/library will work as expected without workarounds

Current behavior

Using the plugin as-is does not allow to use transitive jfrog dependencies without explicitly stating them in the build

Reproduction steps

See details in the description. create a project, use the plugin, try to access classes that should arrive transitively, get an exception

Expected behavior

Transitive libraries that should be exposed to the consumer should be imported with api scope instead of implementation scope so consumers can set properties on those classes (like shown in the documentation)

Artifactory Gradle plugin version

5.0.3

Operating system type and version

macOS 13.3

JFrog Artifactory version

cloud

Gradle version

8.2.1

After upgrading from 5.1.10 to 5.1.11 jar file is not published

Describe the bug

After mentioned upgrade publish command publishes pom file only. No jar files are published.

Current behavior

Only pom is published.

Reproduction steps

It is probably hard to reproduce this issue as we are using our own custom wrapper and we are using Nebulas pusblishing plugins etc. But I have narrowed it down that only changeing org.jfrog.buildinfo:build-info-extractor-gradle:5.1.10 to 5.1.11 causes this issue. Its also visible from debug script:

allprojects{
    afterEvaluate {
        println("Publications:")
        project.publishing.publications.each{publication->
            println(">>: ${publication.groupId}:${publication.artifactId}:${publication.version}")
            publication.artifacts.each{artifact->
                println("\t${artifact.classifier}:${artifact.extension}")
            }
        }
    }
}

5.1.10 produces:

Configure project :
Publications:

: group.demo:demo:1.0.1-local
javadoc:jar
sources:jar
null:jar

5.1.11 produces:

Configure project :
Publications:

: group.demo:demo:1.0.1-local

Expected behavior

I expect it to keep uploading all artifacts. But as I can understand how hard it is to troubleshoot an issue that you can't reproduce, maybe you can provide additional tips and hints how to narrow it down.

Artifactory Gradle plugin version

5.1.11

Operating system type and version

Ubuntu 22.04

JFrog Artifactory version

Not important, reproducable in Maven Local

Gradle version

8.4

5.0.0 bump question

How can we help?

Hi, im trying to bump to the newest version but I cant seem to figure out how to deal with the resolve part.

This is how it used to look in 4.32.0

artifactory {
    contextUrl = "${project.properties['artifactory_contextUrl'] ?: System.env.ARTIFACTORY_URL}"
    resolve {
        repository {
            repoKey = version.endsWith('SNAPSHOT') ? 'snapshot-standard' : 'release-standard'
            username = "${project.properties['artifactory_user'] ?: System.env.ARTIFACTORY_USER}"
            password = "${project.properties['artifactory_password'] ?: System.env.ARTIFACTORY_PASSWORD}"
            maven = true
        }
    }
}

I cant figure out how resolve is supposed to be handled in the new version

build-info-extractor-gradle version 5.1.4 fails with "compileSdkVersion is not specified"

Describe the bug

build.gradle configured with classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release" fails when pulling latest JFrog Gradle plugin version 5.1.4.

Current behavior

Downloading /artifactory/ext-maven-remote/org/jfrog/buildinfo/build-info-extractor-gradle/5.1.4/build-info-extractor-gradle-5.1.4.jar to /home/gitlab-runner/.gradle/.tmp/gradle_download10827744017953461929bin
Compiling build file '/home/gitlab-runner/builds/saYMexgh/0/exercise/build.gradle' using BuildScriptTransformer.

Configure project :app
Compiling build file '/home/gitlab-runner/builds/saYMexgh/0/exercise/app/build.gradle' using BuildScriptTransformer.
FAILURE: Build completed with 2 failures.
1: Task failed with an exception.


  • Where:
    Build file '/home/gitlab-runner/builds/saYMexgh/0/exercise/app/build.gradle' line: 5
  • What went wrong:
    A problem occurred evaluating project ':app'.

Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
Cannot run Project.afterEvaluate(Action) when the project is already evaluated.

  • Try:

Run with --stacktrace option to get the stack trace.
Run with --debug option to get more log output.
Run with --scan to get full insights.
==============================================================================
2: Task failed with an exception.


  • What went wrong:
    A problem occurred configuring project ':app'.

compileSdkVersion is not specified. Please add it to build.gradle

Reproduction steps

  1. Configure build.gradle to use JFrog plugin version 5.1.2. For example: classpath "org.jfrog.buildinfo:build-info-extractor-gradle:5.1.2"
  2. Build will resolve the dependency and compile as expected.
  3. Configure build.gradle to use JFrog plugin version 5.1.4. For example: classpath "org.jfrog.buildinfo:build-info-extractor-gradle:5.1.4"
  4. Build now fails with "compileSdkVersion is not specified. Please add it to build.gradle"

Note that we are specifying compileSdkVersion in the same buidl.gradle file that specifies the Jfrog plugin....

android {
compileSdkVersion 33
....
}

Expected behavior

No response

Artifactory Gradle plugin version

6.1.4

Operating system type and version

Ubuntu

JFrog Artifactory version

7.46.10

Gradle version

7.4.1

'ArtifactoryTask' property 'artifactSpecs' doesn't have a configured value

How can we help?

I recently upgraded my gradle version from 6.5 to 8.1.1 , while running artifactoryPublish command getting the issue as,

A problem was found with the configuration of task ':artifactoryPublish' (type 'ArtifactoryTask').

  • Type 'org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask' property 'artifactSpecs' doesn't have a configured value.

    Reason: This property isn't marked as optional and no value has been configured.

    Possible solutions:

    1. Assign a value to 'artifactSpecs'.
    2. Mark property 'artifactSpecs' as optional.

It was working fine in gradle 6.5 with jfrog version 4.32.0.
I tried updating the jfrog version to 5.1.1, even after that issue persists.

Q1. Where do I need to specify artifactSpecs value? any example would help me to understand better.
Q2. How can I make it optional ?

JDK version 17
Compile SDK version 33

Add type="cpp" for build artifacts that are of native type

Describe the bug

Create a new Gradle project with a few sub-projects

  1. Project A applies the "cpp-library" plugin
  2. Project B applies the "cpp-application" plugin, adds a dependency on project B

Add a few stub C++ code snippets, e.g. main() { cout << hello world << endl; } and call a function in the dependent library.

Apply the "com.jfrog.artifactory" plugin, add boiler plate artifactory publish configuration in root projects build.gradle and apply the artifactory plugin and "maven-publish" plugin in each sub-project. Run the ./gradlew artifactoryPublish task and confirm that you are able to publish the native artifacts to your artifactory server.

Enable publishing of build info:

artifactory {
    publish {
        ...
        setPublishBuildInfo(true)
   } 
}

Current behavior

Open up the build/build-info.json file, none of the dependencies you've added is specifying the type="cpp" for native builds. Even the gradle project may need to be of type "cpp".

By the way, build/build-info.json should be in the root project's target directory not in static "build/build-info.json". That in itself is also a bug

Reproduction steps

I could write you a gist to demonstrate that, but am out of time .

Expected behavior

When you publish the build-info to the artifactory server, the documentation says to search and replace both module's type="cpp" and dependency type="cpp" in order for X-Ray to detect the presence of native dependencies and to flag these as such.

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Ubuntu 22.04

JFrog Artifactory version

7.41.14

Gradle version

7.6.2

artifactory plugin usage with conventions plugin (buildSrc)

How can we help?

Hello!

I am working on different projects with multiple artifacts (usually war and jar) which I all have configured similarly as multi module projects with a root project. And we are using artifactory plugin. In a recent question in Gradle Forum recommendations were to use conventions plugin to share logic between subprojects instead of allprojects { ... } or subprojects { ... } blocks. But I cannot get the artifactory configuration to work within the buildSrc-setup.

My Setup before adding buildSrc module was like:

root
build.xml
settings.gradle
-- warproject
    build.xml
    settings.gradle
-- jarproject
    build.xml
    settings.gradle
...

So my initial working setup for the artifactory plugin was:

in root project build.xml I have somethings like:

plugins {
  id 'com.jfrog.artifactory' version 5.+ apply true
}
artifactoryPublish.skip = true
artifactory {
    contextUrl = settings_url
    publish {
        repository {
            username = settings_user
            password = settings_pwd
        }
        defaults {
            publications('mavenJava')
            publishPom = true
        }
       version = version.replaceAll('SNAPSHOT', LocalDateTime.now().format('yyyyMMddHHmmss'))
    }

One problem I had with this was, that setting the version this way (last line in the script) did not work for the subprojects. version always endet up as "SNAPSHOT".
Now my solution in suprojects basically was overriding the version setting in subprojects:

plugins {
  id 'com.jfrog.artifactory' apply true
}

artifactory {
  publish {
    version = version.replaceAll(...)
  }
}

So one question (out of context) would be: is there a better solution to set the version?

But to the point:
I set up a buildSrc module with some working configurations. I then wanted to move artifactory closure to the myproject.conventions.gradle file. There is no error upon running artifactoryPublish, but it is also not deploying any artifacts.

So my core question: What would be the recommended way of or is there some example how to setup artifactory plugin with conventions plugin mechanism?

Thx.
Rob

Support for Android publishing artifacts w/Gradle 8+ and AGP 8.1.2

Describe the bug

The use of the 'maven-publish' plugin is being deprecated for Android builds in favor of using Android's

android 
{
     publishing {
           multipleVariants {
                 allVariants()
           }
     }
}

See here: https://developer.android.com/build/publish-library/configure-pub-variants#groovy

Current behavior

I've looked at the examples by git clone https://github.com/jfrog/project-examples.git, and following the gradle example: gradle-android-library-example-ci-server/app/build.gradle

This unfortunately doesn't seem to work at all. I am in lack of a better example / guidance for how to integrate Artifactory into our Android build.

Reproduction steps

git clone https://github.com/jfrog/project-examples.git
cd into the android-library-example-ci-server

Do necessary upgrades to run example with Android 8.1.2 and Gradle 8.4

Here is a patch for getting it to comple:

diff --git a/gradle-examples/gradle-android-library-example-ci-server/app/build.gradle b/gradle-examples/gradle-android-library-example-ci-server/app/build.gradle
index dafe38e..ea24999 100644
--- a/gradle-examples/gradle-android-library-example-ci-server/app/build.gradle
+++ b/gradle-examples/gradle-android-library-example-ci-server/app/build.gradle
@@ -1,13 +1,16 @@
-apply plugin: 'com.android.library'
-apply plugin: 'maven-publish'
+plugins {
+    id 'com.android.library' version "8.1.2"
+    id 'maven-publish'
+}
 
 android {
-    compileSdkVersion 30
-    buildToolsVersion "30.0.3"
+    compileSdkVersion 34
+    buildToolsVersion "34.0.0"
 
+    namespace "com.example.testlibrary"
     defaultConfig {
-        minSdkVersion 23
-        targetSdkVersion 30
+        minSdkVersion 30
+        targetSdkVersion 34
         versionCode 1
         versionName "1.1s"
 
@@ -20,10 +23,6 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
 
     // How to Rename the output AAR file:
     //      - https://stackoverflow.com/questions/24728591/how-to-set-name-of-aar-output-from-gradle
@@ -60,4 +59,4 @@ dependencies {
     testImplementation 'junit:junit:4.+'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
-}
\ No newline at end of file
+}
diff --git a/gradle-examples/gradle-android-library-example-ci-server/build.gradle b/gradle-examples/gradle-android-library-example-ci-server/build.gradle
index 5a7c7fc..a9d6b10 100644
--- a/gradle-examples/gradle-android-library-example-ci-server/build.gradle
+++ b/gradle-examples/gradle-android-library-example-ci-server/build.gradle
@@ -1,25 +1,10 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
-    repositories {
-        google()
-        mavenCentral()
-    }
-    dependencies {
-        classpath "com.android.tools.build:gradle:4.2.2"
-
-        // NOTE: Do not place your application dependencies here; they belong
-        // in the individual module build.gradle files
-    }
-}
-
 allprojects {
     repositories {
         google()
         mavenCentral()
-        jcenter() // Warning: this repository is going to shut down soon
     }
 }
 
 task clean(type: Delete) {
     delete rootProject.buildDir
-}
\ No newline at end of file
+}
diff --git a/gradle-examples/gradle-android-library-example-ci-server/gradle/wrapper/gradle-wrapper.properties b/gradle-examples/gradle-android-library-example-ci-server/gradle/wrapper/gradle-wrapper.properties
index 92b8e57..aba2543 100644
--- a/gradle-examples/gradle-android-library-example-ci-server/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle-examples/gradle-android-library-example-ci-server/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
 #Wed Aug 11 17:23:15 ART 2021
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
diff --git a/gradle-examples/gradle-android-library-example-ci-server/settings.gradle b/gradle-examples/gradle-android-library-example-ci-server/settings.gradle
index a52a854..e10870b 100644
--- a/gradle-examples/gradle-android-library-example-ci-server/settings.gradle
+++ b/gradle-examples/gradle-android-library-example-ci-server/settings.gradle
@@ -1,2 +1,9 @@
+pluginManagement {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
 rootProject.name = "test-library-name"
 include ':app'

Produces the following error:

* What went wrong:
A problem occurred configuring project ':app'.
> Failed to notify project evaluation listener.
   > Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
      > Namespace not specified. Specify a namespace in the module's build file. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about setting the namespace.
        
        If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to the namespace value in the build file. Refer to https://d.android.com/r/tools/upgrade-assistant/agp-upgrade-assistant for general information about using the AGP Upgrade Assistant.
   > Could not get unknown property 'release' for SoftwareComponent container of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

Expected behavior

Should work

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Ubuntu 22.04 Linux

JFrog Artifactory version

7.41.14

Gradle version

8.4

Gradle 8.6 reports deprecation warnings with plugin version 5.2.0

Describe the bug

After upgrading to plugin version 5.2.0, we started receiving deprecation warnings from Gradle 8.6 that were not present with version 5.1.14. After downgrading back to 5.1.14, the deprecation warnings went away.

> Configure project :
The Project.getConvention() method has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#deprecated_access_to_conventions
The org.gradle.api.plugins.Convention type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#deprecated_access_to_conventions
The org.gradle.util.ConfigureUtil type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#org_gradle_util_reports_deprecations
	at build_1tda8vsatwmul6fo6fllw61ss.run(build.gradle:159)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
Build file 'build.gradle': line 160
The org.gradle.util.ConfigureUtil type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#org_gradle_util_reports_deprecations
	at build_1tda8vsatwmul6fo6fllw61ss$_run_closure11.doCall$original(build.gradle:160)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
	at build_1tda8vsatwmul6fo6fllw61ss.run(build.gradle:159)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
Build file 'build.gradle': line 162
The org.gradle.util.ConfigureUtil type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#org_gradle_util_reports_deprecations
	at build_1tda8vsatwmul6fo6fllw61ss$_run_closure11$_closure31.doCall$original(build.gradle:162)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
	at build_1tda8vsatwmul6fo6fllw61ss$_run_closure11.doCall$original(build.gradle:160)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
Build file 'build.gradle': line 168
The org.gradle.util.ConfigureUtil type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#org_gradle_util_reports_deprecations
	at build_1tda8vsatwmul6fo6fllw61ss$_run_closure11$_closure31.doCall$original(build.gradle:168)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
	at build_1tda8vsatwmul6fo6fllw61ss$_run_closure11.doCall$original(build.gradle:160)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)
Build file 'build.gradle': line 159
The org.gradle.api.plugins.Convention type has been deprecated. This is scheduled to be removed in Gradle 9.0. Consult the upgrading guide for further information: https://docs.gradle.org/8.6/userguide/upgrading_version_8.html#deprecated_access_to_conventions
	at build_1tda8vsatwmul6fo6fllw61ss.run(build.gradle:159)
	(Run with --stacktrace to get the full stack trace of this deprecation warning.)

Current behavior

Deprecation warnings are present, a regression from the previous version.

Reproduction steps

Artifactory configuration block in build.gradle file:

artifactory {
    publish {
        contextUrl = artifactoryUrl
        repository {
            repoKey = isRelease ? releaseKey : snapshotKey
            username = artifactory_user
            password = artifactory_password
        }
        defaults {
            publications ('ALL_PUBLICATIONS')
        }
    }
}

Expected behavior

no depreciation warnings surfaced by Gradle

Artifactory Gradle plugin version

5.2.0

Operating system type and version

Linux 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

JFrog Artifactory version

N/A

Gradle version

8.6

Migrating from CLI to Gradle Plugin

How can we help?

I'm currently uploading an EAR file (after building it with Gradle) using the following commands:

SET APP_NAME=my-app

REM Set JFrog variables from Jenkins variables.
SET JFROG_CLI_BUILD_NAME=%JOB_NAME:/= :: %
SET JFROG_CLI_BUILD_NUMBER=%BUILD_NUMBER%
SET JFROG_CLI_BUILD_URL=%BUILD_URL%

jf config add artifactory --overwrite --url=https://artifactory.xxx.yyy --user="%ART_USER%" --password="%ART_PASS%"
jf rt upload ".gradle_build\distributions\*.ear" "zzz/yyy/xxx/zz/%APP_NAME%/%RELEASE%-SNAPSHOT/%APP_NAME%-%RELEASE%-SNAPSHOT.ear"
jf rt build-publish

I've been looking into using the Gradle plugin instead, but I'm not sure what all needs to be set. This is what I have right now:

artifactory {
    publish {
        contextUrl = 'https://artifactory.xxx.zzz'
        repository {
            username = System.getenv('ART_USER')
            password = System.getenv('ART_PASS')
        }
        buildInfo {
            buildName = System.getenv('JOB_NAME').replace('/',' :: ')
            buildNumber = System.getenv('BUILD_NUMBER')
            buildUrl = System.getenv('BUILD_URL' )
        }
    }
}

What am I missing to get the plugin configured to work the same as the CLI commands?

Cannot run Project.afterEvaluate(Action) when the project is already evaluated.

Describe the bug

After upgrade from 5.1.2 to 5.1.5 (5.1.3 is also affected) following error is thrown:

An exception occurred applying plugin request [id: 'dqf.java-conventions']
> Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
   > Cannot run Project.afterEvaluate(Action) when the project is already evaluated.

Current behavior

An exception occurred applying plugin request [id: 'dqf.java-conventions']
> Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
   > Cannot run Project.afterEvaluate(Action) when the project is already evaluated.

Reproduction steps

I am applying artifactory plugin via convention plugin:

plugins {
    id("com.jfrog.artifactory")
}

artifactory {
 // bug is present even without this section
}

However I was not able to reproduce this behavior similarly configured empty project.
Other plugins used in project:

org.gradle.maven-publish
org.owasp.dependencycheck
com.diffplug.spotless

Same issue mentioned on SO https://stackoverflow.com/questions/77021002/jfrog-artifactory-stopped-working-in-android-studio-apply-plugin-com-jfrog-ar

Expected behavior

Project should build successfully like when 5.1.2 is used.

Artifactory Gradle plugin version

5.1.5

Operating system type and version

Linux Ubuntu 22.04.3 LTS

JFrog Artifactory version

No response

Gradle version

8.3 - Kotlin DSL

Remove usage of System.getProperties() during Gradle configuration phase

Describe the bug

JFrog plugin calls BuildInfoExtractorUtils.mergePropertiesWithSystemAndPropertyFile, which in turn calls props.putAll(System.getProperties()); at Gradle configuration phase when configuration caching is enabled.

This makes every system property a configuration cache input, so if any property changes and the rest of the configuration does not read this value, configuration cache entry will be invalidated anyway.

For example, in certain cases Gradle sets idea.io.use.nio2 property, nothing in the configuration phase reads this value except 'com.jfrog.artifactory' plugin and that means if that property changes, configuration cache is invalidated.

Unfortunately Gradle does change the property idea.io.use.nio2 every time it re-compiles build.gradle.kts, which means that configuration cache is not usable for a second run.

Current behavior

Clip of configuration cache report:
image

On first run

$ ./gradlew tasks --configuration-cache
Calculating task graph as configuration cache cannot be reused because file 'build.gradle.kts' has changed.
..

On second run

$ ./gradlew tasks --configuration-cache
Calculating task graph as configuration cache cannot be reused because system property 'idea.io.use.nio2' has changed.
..

Reproduction steps

In a project with jfrog artifactory plugin configured:

  • Modify build.gradle.kts to force Gradle to recompile it.
  • Run ./gradlew tasks --configuration-cache twice.
    • First run ends with Configuration cache entry stored. output from Gradle.

Expected behavior

Second run of Gradle command, the Configuration cache entry reused. output is expected.

Artifactory Gradle plugin version

5.2.0

Operating system type and version

Ubuntu 22

JFrog Artifactory version

No response

Gradle version

8.6

Error on artifactory plugin when applying artifactory separately on subprojects of multi-module project

How can we help?

I am not sure whether this is an artifactory issue or I am doing something wrong. Hope to clarify this.

TLDR
In a multi-module project should it be possible to apply a plugin separately to each subproject like

./app/webapp/build.gradle
plugins {
    id "war"
    id "com.jfrog.artifactory" version "5.1.10"
}
dependencies {
    implementation project(':library')
}

./app/library/build.gradle
plugins {
    id "java"
    id "com.jfrog.artifactory" version "5.1.10"
}

./app/settings.gradle
rootProject.name = 'app'
include 'webapp'
include 'library'

or is it necessary to predefine it in the root project with apply true|false?
Because applying artifactory separately on each subproject without predefining it in root-project seems to work but applying additional plugin on one subproject yields

An exception occurred applying plugin request [id: 'com.jfrog.artifactory', version: '5.1.10']
> Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
   > Cannot add extension with name 'artifactory', as there is an extension already registered with that name.

IN DETAIL
Initially I encountered this situation when applying custum plugins in a multi-module java project and adding one other dependency (which was not used in the custom plugins) on only one of the subprojects.

For easier reproduction I have created a small project without custom plugins like this:

rootproject
- lib-project
  build.gradle
- webapp-project
  build.gradle
settings.gradle

Usually when creating such a project with gradle init it is basically this result. So there is a settings.gradle in root (no build.gradle) and build.gradle files in the modules.
I understand from different discussions in gradle forums that it is usually not good practice to have a build.gradle in root project.

So avoiding build.gradle in root project I have this in modules build.gradle

./webapp/build.gradle
plugins {
    id "war"
    id "com.jfrog.artifactory" version "5.1.10"
}

./lib/build.gradle
plugins {
    id "java"
    id "com.jfrog.artifactory" version "5.1.10"
}

Everything seems to be ok, it is building. But I wonder whether it is right to do so or if there should definitely be some single point of entry like e.g. root build.gradle with something like

plugins {
    id "com.jfrog.artifactory" version "5.1.10" apply false
}

and eventually omitting the version in the modules build.gradle files.

Reason why I am asking is that doing it like shown in above example applying it separately in each subproject yields an error as soon as I add an additional other plugin to only one of the subprojects.

So something like

./webapp/build.gradle
plugins {
    id "war"
    id "com.liferay.source.formatter" version "5.2.58"
    id "com.jfrog.artifactory" version "5.1.10"
}

./lib/build.gradle
plugins {
    id "java"
    id "com.jfrog.artifactory" version "5.1.10"
}

issues

An exception occurred applying plugin request [id: 'com.jfrog.artifactory', version: '5.1.10']
> Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
   > Cannot add extension with name 'artifactory', as there is an extension already registered with that name.

during build/refresh/etc. processes.

In contrast when adding the additional plugin to both subprojects build is working again.

./webapp/build.gradle
plugins {
    id "war"
    id "com.liferay.source.formatter" version "5.2.58"
    id "com.jfrog.artifactory" version "5.1.10"
}

./lib/build.gradle
plugins {
    id "java"
    id "com.liferay.source.formatter" version "5.2.58"
    id "com.jfrog.artifactory" version "5.1.10"
}

This one builds. Also predefining artifactory in root build.gradle with apply false seems to solve the problem.

Reason for asking is that I am using some own convention plugins, say

./main/src/groovy/common-conventions.gradle
plugins {
  id "at.bxm.svntools" version "3.1"
  id "com.jfrog.artifactory" version "5.1.10"
}

./main/src/groovy/web-conventions.gradle
plugins {
  id "war"
  id "common-conventions"
}

./main/src/groovy/lib-conventions.gradle
plugins {
  id "java"
  id "common-conventions"

Basically using this plugin in my project works and artifactory is available. And for sure I want to use web-conventions on web-project and lib-conventions on lib-project so there is nothing preapplied or so in root.
But doing this issues the same error as soon as I add additional library directly to my projects.

E.g.

./webapp/build.gradle
plugins {
    id "com.liferay.source.formatter" version "5.2.58"
    id "web-conventions" version "1.0"
}

./lib/build.gradle
plugins {
    id "lib-conventions" version "1.0"
}

also yields

An exception occurred applying plugin request [id: 'com.jfrog.artifactory', version: '5.1.10']
> Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
   > Cannot add extension with name 'artifactory', as there is an extension already registered with that name.

As I honestly do not fully understand what is going on I created the simple reproducer without any convention plugins included only using artifactory plugin and some other random plugin. Tested this on the simple project with one or two other random plugins (instead of com.liferay.source.formatter) and I see the same error again.

So I wonder if I am wrong in the way the plugins are applied here then I would have to rethink the custom plugins again or if this is indeed an issue with artifactory or the way artifactory plugin is working.

If artifactory plugin requires to be preconfigured in root project then I wonder how I can do this and still use my plugins then?

And I am curious, concerning the approach to apply plugin separately on each subproject:

./webapp/build.gradle
plugins {
    id "war"
    id "com.jfrog.artifactory" version "5.1.10"
}

./lib/build.gradle
plugins {
    id "java"
    id "com.jfrog.artifactory" version "5.1.10"
}

Is this a "valid" way to apply a plugin or is it necessary to have the plugin preconfigured in some root plugins section? To maintain the version I am also using a published version-catalog and I would simply use alias(libs.plugins.jfrog.artifactory) on all the subprojects that need the plugin without even bothering to declare it in root somehow.

Thx.
Rob

lack of v4 documentation

How can we help?

Hi there.

I have the project with artifactory-gradle-plugin 4.21.0 version with resolve section in the plugin configuration, but there is no any documentation on the logic of this parameter and syntax in this repo or on JFrog website. I understand that this version is pretty old a this parameter was thrown out of v5 plugin, but I need this information. Could you provide it?

Unable to build the build-info object while running artifactoryDeploy

Describe the bug

Deploying of artifacts works as expected but failing to deploy build-info

Current behavior

Getting the following error while trying to do artifactoryPublish

Task :artifactoryDeploy FAILED
FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':artifactoryDeploy'.
    java.io.IOException: JFrog service failed. Received 400: {
    "errors" : [ {
    "status" : 400,
    "message" : "Could not insert build BuildWrapper..
    }]

Reproduction steps

No response

Expected behavior

No response

Artifactory Gradle plugin version

5.1.13

Operating system type and version

Ubuntu

JFrog Artifactory version

7.77.1

Gradle version

8.3

Publications List Ignored

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

Provide a way to override the 'id' of the build-info file

Describe the bug

Pretty much a vanilla java multi-project configuration

Apply a configuration at the root project's build.gradle file

artifactoryPublish.skip = true
artifactory {
    contextUrl = 'my-artifactory-server'
    publish {
        repository {
            repoKey = "proj-repo-local"
            username = "${ArtifactoryUsername}"
            password = "${ArtifactoryPassword}"
        }
        defaults {
            publications 'ALL_PUBLICATIONS'
            properties = [ 
                'build.changelist': "${System.env.P4_CHANGELIST ?: '10000'}",
                'build.branch': "${System.env.BRANCH_NAME ?: 'MyBranch'}"
                ]
        }
    }
    clientConfig.setIncludeEnvVars(true)
    clientConfig.info.setProject('proj')
}

Then apply the artifactory plugin in a sub-project; however, because of the structure of these projects; I will have to individually configure the maven publication with an artifactId and a groupId

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId "org.company.group"
            artifactId "my-artifact-id"
            from components.java
            pom {
                properties = [ 
                    "build.changelist": "${System.env.P4_CHANGELIST ?: '10000'}",
                    "build.branch": "${System.env.BRANCH_NAME ?: 'MyBranch'}"
                ]
            }    
        }
    }   
}

Current behavior

Now the resulting moduleInfo.json will take the project name descriptor (project-id) for module-id when publishing the build-info, and module type is GRADLE.

Because of how the projects are organized, there is no way of overriding the module-id (or even group-id) that forms the "id" when you look at moduleInfo.json that is being uploaded to Artifactory as a part of the module-id. It's directly tied to the resolved Gradle's project-id: {group}-{project-name}-{version}.

I would have to restructure how the Gradle projects works to alter this behavior. That isn't going to fly when you have lots of engineers working on a project.

Reproduction steps

No response

Expected behavior

It would be much simpler to be able to change the module/id in the .json file with a simple override; or use the basename of the publication for the module instead.

{
  "type" : "gradle",
  "id" : "PROJECT_NAME.path.to.application:1.00.10000",
  "repository" : "proj-gradle-dev",
  "artifacts" : [ {
    "type" : "jar",
    "sha1" : "....",
    "sha256" : "....",
    "md5" : "...",
    "name" : "application-1.00.10000.jar",
    "path" : "com/mycompany/group/application/1.00.10000/application-1.00.10000.jar"
  }],
  "dependencies" : [ {
    "type" : "",
    "id" : "PROJECT_NAME.path.to.dependency.lib:1.00.10000",
    "scopes" : [ "compileClasspath"],
    "requestedBy" : [ [ "PROJECT_NAME.path.to.application:1.00.10000" ] ]
  }, {

When I look in artifactory, it seems like it is unable to fully resolve the paths to the artifacts within the build itself.

No path found (externally resolved or deleted/overwritten)

Even though the "PROJECT_NAME.path.to.dependency.lib:1.00.10000" is present in the build info file.

While that may be an entirely separate / different problem to how Artifactory manages the links to the various artifacts uploaded. The ability to at least name modules according to your custom layout should still exist (e.g. I'd like to be able to override module-id= ${project.id}-${group}-${version}.

Artifactory Gradle plugin version

5.1.10

Operating system type and version

Ubuntu 22.04

JFrog Artifactory version

7.41.14

Gradle version

N/A

Apache Log4j Vulnerability issue - Black Duck

How can we help?

Our product is using build-info-extractor-gradle for publishing artifacts to JFrog artifactory repository. Couple of months back our team introduced vulnerability scanning tools. One of them is Black Duck. We are getting multiple critical warnings from that tool due to the internal dependency with Apache Log4j . We upgraded the build-info-extractor-gradle to the latest 5.1. 4. But still we are getting the same warning. Now it became a compliance issue for our product. Could you please advise how to solve this?

Please find more details below :-

build.gradle -> -gradle -> org.jfrog.buildinfo:build-info-extractor-gradle:5.1.3 -> org.jfrog.buildinfo:build-info-extractor:2.41.4 -> commons-logging:commons-logging:1.2 -> log4j:log4j:1.2.17

https://mvnrepository.com/artifact/org.jfrog.buildinfo/build-info-extractor-gradle/5.1.4

Published on: 12/20/19
Updated on: 1/3/23
Base score: 9.8
Exploitability: 3.9

Description: Apache Log4j is vulnerable to remote code execution (RCE). This allows a remote attacker to send a crafted serialized payload that, when processed by Log4j, will execute arbitrary code. This can occur if Log4j is deserializing untrusted network traffic.

https://nvd.nist.gov/vuln/detail/CVE-2019-17571
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17571

Version 5 Artifactory Configuration Documentation Missing

Describe the bug

Trying to update to v5 plugin for kotlin syntax build.gradle.kts.

Here is where the old docs are, and there isn't any info on v5 configuration. Here is an example for v4 kts. None exist for v5

Old ResolverConfig can't be found with v5 plugin. Ex:

import org.jfrog.gradle.plugin.artifactory.dsl.ResolverConfig

allprojects {
    artifactory {
        setContextUrl("https://artifactory.something.zz/artifactory")
        resolve(
            delegateClosureOf<ResolverConfig> {
                repository {
                    setProperty("repoKey", "maven")
                    setProperty("username", System.getenv("UN"))
                    setProperty("password", System.getenv("PW"))
                    setProperty("maven", true)
                }
            },
        )
    }
}

Current behavior

Docs exist for v4, but not v5

Reproduction steps

Look around for documentation for kts format... not really any out there.

Expected behavior

Docs should be released with breaking changes please

Artifactory Gradle plugin version

v5

Operating system type and version

mac

JFrog Artifactory version

No response

Gradle version

No response

Cannot publish Gradle plugins with Artifactory plugin since version 5.1.11

Describe the bug

Latest plugin version 5.1.11 introduced some changes in artefact publication descriptor handling to get rid of Gradle deprecated/deleted internal APIs, in order to support Gradle 8.4+ version. (see #75) .

A side effect is that it's no longer possible to publish multiple Maven publication artefacts from a single Gradle project: the POM publishing is not correctly handled which makes the artifactoryDeploy task fail.

A example of scenario which now fails with this new plugin version: trying to publish Gradle plugin to a custom repository

  • Gradle plugins publication consist of two publications: one for the plugin "marker" ( a single POM file ) and one for the plugin library itselft
  • with latest version, publication of the main library fails due to wrong POM descriptor/coordinates

Current behavior

When trying to publish a Gradle plugin to a custom Artifactory server (see below for a sample gradle projet setup to reproduce the isssue):

$ ./gradlew artifactoryPublish

> Task :artifactoryPublish
> Task :extractModuleInfo
[pool-22-thread-1] Deploying artifact: https://******/maven-snapshot/org/example/gradle/publishing/sample-plugin-publish/1.0.0-SNAPSHOT/sample-plugin-publish-1.0.0-SNAPSHOT.jar
[pool-22-thread-1] Deploying artifact: https://*******/maven-snapshot/greeting/greeting.gradle.plugin/1.0.0-SNAPSHOT/greeting.gradle.plugin-1.0.0-SNAPSHOT.pom
[pool-22-thread-1] Deploying artifact: https://*******/maven-snapshot/org/example/gradle/publishing/sample-plugin-publish/1.0.0-SNAPSHOT/sample-plugin-publish-1.0.0-SNAPSHOT.pom
Failed to upload file

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':artifactoryDeploy'.
> java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.io.IOException: JFrog service failed. Received 409: {
    "errors" : [ {
      "status" : 409,
      "message" : "The target deployment path 'org/example/gradle/publishing/sample-plugin-publish/1.0.0-SNAPSHOT/sample-plugin-publish-1.0.0-20231121.103222-1.pom' does not match the POM's expected path prefix 'greeting/greeting.gradle.plugin/1.0.0-SNAPSHOT'. Please verify your POM content for correctness and make sure the source path is a valid Maven repository root path."
    } ]
  }

It looks like POM descriptor for the plugin library is not computed properly: POM details are taken from the plugin marker artefact, the coordinates are not the expected ones.

Reproduction steps

Example of project setup to reproduce the error:

/src/main/java/org/gradle/sample/plugin/GreetingPlugin.java

package org.gradle.sample.plugin;

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class GreetingPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        project.getLogger().quiet("applying greeting plugin");

        project.getTasks().register("hello", task -> {
            task.doLast(t -> {
                project.getLogger().quiet(" Hi Bob!");
            });
        });
    }
}

Expected behavior

The Artifactory plugin should publish all expected artefacts and/or corresponding POM descriptors without error.

Artifactory Gradle plugin version

5.1.11

Operating system type and version

Windows 11

JFrog Artifactory version

7.49.10

Gradle version

8.4

ArtifactoryPlublish unable to publish version-catalog correctly

Describe the bug

I'm trying to publish the version-catalog to jfrog.
When I'm publishing mavenLocal i can see the .module file contains versionCatalogElements variant.
but when i do artifactoryPublish which is jfrog publish i dont see versionCatalogElements variant instead i see apiElements and runtimeElements

opened gradle issue initially gradle/gradle#29369
but it is not gradle issue it is Jfrog publish issue which unable to publish the version-catalog publications. Always picks pluginMaven publications.

Current behavior

in module file
"variants": [ { "name": "apiElements", "attributes": { "org.gradle.category": "library", "org.gradle.dependency.bundling": "external", "org.gradle.jvm.environment": "standard-jvm", "org.gradle.jvm.version": 17, "org.gradle.libraryelements": "jar", "org.gradle.usage": "java-api", "org.jetbrains.kotlin.platform.type": "jvm" }, "files": [ { "name": "gradle-version-catalog-0.2.0.jar", "url": "gradle-version-catalog-0.2.0.jar", "size": 261, "sha512": "xxxxxxxxxxxxxxx", "sha256": "xxxxxxxxxxxxx", "sha1": "xxxxxxxxxxxxxxxxxxxxxx", "md5": "xxxxxxxxxxxxxxxxxxxxxxxxx" } ] }, { "name": "runtimeElements", "attributes": { "org.gradle.category": "library", "org.gradle.dependency.bundling": "external", "org.gradle.jvm.environment": "standard-jvm", "org.gradle.jvm.version": 17, "org.gradle.libraryelements": "jar", "org.gradle.usage": "java-runtime", "org.jetbrains.kotlin.platform.type": "jvm" }, "files": [ { "name": "gradle-version-catalog-0.2.0.jar", "url": "gradle-version-catalog-0.2.0.jar", "size": 261, "sha512": "xxxxxxxxxxxxxxxxxxxxxxxx", "sha256": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx", "sha1": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "md5": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] } ] }

Reproduction steps

gradle version 8.5
jfrog artifactory buildinfo version - 5.2.0
create a version-catalog publish project
Try to publish the versionCatalog then check module file should have versionCatalogElements but not found.

Expected behavior

mavenLocal publish expected in module file
"variants": [ { "name": "versionCatalogElements", "attributes": { "org.gradle.category": "platform", "org.gradle.usage": "version-catalog" }, "files": [ { "name": "gradle-version-catalog-0.2.1-SNAPSHOT.toml", "url": "gradle-version-catalog-0.2.1-SNAPSHOT.toml", "size": 6029 } ] } ]

Artifactory Gradle plugin version

5.2.0

Operating system type and version

Windows,Android

JFrog Artifactory version

5.2.0

Gradle version

8.5

ConcurrentModificationException during gradle build

Describe the bug

After upgrading the gradle plugin from 4.33.1 to 5.1.0, I've started encountering java.util.ConcurrentModificationException during various tasks in my build. The exception is thrown from the method org.jfrog.gradle.plugin.artifactory.listener.ArtifactoryDependencyResolutionListener.updateModulesMap.

My project is a fairly large, multi-module project and uses parallel builds. When parallel builds are disabled, the build succeeds with no problem (except that it is slow).

Current behavior

Full gradle build output when --stacktrace is added to command flags:

> Task :notification-client:kaptGenerateStubsKotlin FAILED

> Task :pullDatabaseImage
Pulling image 'postgres:14.8-bookworm' from https://index.docker.io/v1/.

FAILURE: Build failed with an exception.

* What went wrong:
Could not evaluate onlyIf predicate for task ':notification-client:kaptGenerateStubsKotlin'.
> Could not evaluate spec for 'Task satisfies onlyIf spec'.

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.api.GradleException: Could not evaluate onlyIf predicate for task ':notification-client:kaptGenerateStubsKotlin'.
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: org.gradle.api.GradleException: Could not evaluate spec for 'Task satisfies onlyIf spec'.
        at org.gradle.api.internal.tasks.execution.SelfDescribingSpec.isSatisfiedBy(SelfDescribingSpec.java:42)
        at org.gradle.api.specs.AndSpec.findUnsatisfiedSpec(AndSpec.java:67)
        at org.gradle.api.internal.tasks.execution.DescribingAndSpec.findUnsatisfiedSpec(DescribingAndSpec.java:58)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:50)
        ... 24 more
Caused by: java.util.ConcurrentModificationException
        at org.jfrog.gradle.plugin.artifactory.listener.ArtifactoryDependencyResolutionListener.updateModulesMap(ArtifactoryDependencyResolutionListener.java:34)
        at org.jfrog.gradle.plugin.artifactory.listener.ArtifactoryDependencyResolutionListener.afterResolve(ArtifactoryDependencyResolutionListener.java:20)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:97)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:85)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:257)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:164)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:83)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:69)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:363)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:261)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:148)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at jdk.proxy1/jdk.proxy1.$Proxy55.afterResolve(Unknown Source)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:731)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:710)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:710)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$3(DefaultConfiguration.java:690)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:493)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:687)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:683)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1900(DefaultConfiguration.java:173)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$VisitedArtifactsSetProvider.getValue(DefaultConfiguration.java:1662)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$VisitedArtifactsSetProvider.getValue(DefaultConfiguration.java:1651)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$SelectedArtifactsProvider.getValue(DefaultConfiguration.java:1698)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$SelectedArtifactsProvider.getValue(DefaultConfiguration.java:1667)
        at org.gradle.api.internal.artifacts.configurations.ResolutionBackedFileCollection.getSelectedArtifacts(ResolutionBackedFileCollection.java:85)
        at org.gradle.api.internal.artifacts.configurations.ResolutionBackedFileCollection.visitContents(ResolutionBackedFileCollection.java:72)
        at org.gradle.api.internal.file.AbstractFileCollection.getFiles(AbstractFileCollection.java:130)
        at org.gradle.api.internal.file.AbstractFileCollection.isEmpty(AbstractFileCollection.java:342)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.isEmpty(DefaultConfiguration.java:587)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.isEmpty(Unknown Source)
        at org.gradle.api.internal.file.CompositeFileCollection.isEmpty(CompositeFileCollection.java:67)
        at org.jetbrains.kotlin.gradle.tasks.configuration.KaptGenerateStubsConfig$configureFromExtension$1$1.invoke(KaptGenerateStubsConfig.kt:55)
        at org.jetbrains.kotlin.gradle.tasks.configuration.KaptGenerateStubsConfig$configureFromExtension$1$1.invoke(KaptGenerateStubsConfig.kt:54)
        at org.jetbrains.kotlin.gradle.tasks.configuration.KaptGenerateStubsConfig$sam$org_gradle_api_specs_Spec$0.isSatisfiedBy(KaptGenerateStubsConfig.kt)
        at org.gradle.api.internal.tasks.execution.SelfDescribingSpec.isSatisfiedBy(SelfDescribingSpec.java:40)
        ... 27 more


Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.3/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD FAILED in 7s
875 actionable tasks: 7 executed, 868 up-to-date

Reproduction steps

This happens consistently in my large project when parallel builds are enabled. I haven't tried to create a reproducing project that I can share. It would probably have to be a similarly large project with many sub-projects.

Expected behavior

The build should succeed.

Artifactory Gradle plugin version

5.1.0

Operating system type and version

Linux 6.4.6-76060406-generic #202307241739169092810522.04~d567a38 SMP PREEMPT_DYNAMIC Tue A x86_64 x86_64 x86_64 GNU/Linux

JFrog Artifactory version

7.39.4

Gradle version

8.3

The plugin of version `5+` does not work with `signing` plugin any more

Describe the bug

The goal is to sign artifacts before they are published to the Artifactory.
It works well with plugin of version 4+, but does not with 5+.

Current behavior

This my Gradle init script:

initscript {
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.+'
	}
}

def gpgPassphrase = System.getenv('GPG_PASSPHRASE')
def gpgPrivateKey = System.getenv('GPG_PRIVATE_KEY')

allprojects {

	apply plugin: 'signing'

	tasks.register('artifactoryPublish', org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask) {
		setCiServerBuild()
	}

	apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin

	artifactory {
		publish {
			contextUrl = System.getenv('ARTIFACTORY_URL')
			repository {
				repoKey = System.getenv('ARTIFACTORY_REPOSITORY')
				username = System.getenv('ARTIFACTORY_USERNAME')
				password = System.getenv('ARTIFACTORY_PASSWORD')
			}
			defaults {
				publications 'mavenJava'
			}
		}
	}

		afterEvaluate {
			pluginManager.withPlugin('maven-publish') {
				signing {
					useInMemoryPgpKeys(gpgPrivateKey, gpgPassphrase)
					sign publishing.publications.mavenJava
				}
			}
		}
}

Works well and as expected: the artifacts are signed and .asc files are uploaded to the Artifactory alongside with other artifacts.

If I change build-info-extractor-gradle version to the 5+ it does not sing artifacts.
And even if I make artifactoryPublish dependent on signMavenJavaPublication tasks and it is called, the .asc files are not uploaded to the Artifactory.

Reproduction steps

No response

Expected behavior

No response

Artifactory Gradle plugin version

5+

Operating system type and version

GitHub Actions

JFrog Artifactory version

No response

Gradle version

8.5

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.