jfrog / artifactory-gradle-plugin Goto Github PK
View Code? Open in Web Editor NEWJFrog Gradle plugin for Build Info extraction and Artifactory publishing.
License: Apache License 2.0
JFrog Gradle plugin for Build Info extraction and Artifactory publishing.
License: Apache License 2.0
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:
Publishing build info fails due to a PSQL exception
No response
Publishing build info succeeds
5.1.10
Debian Linux 12.2
7.68.7
8.3
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?
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)
Unable to apply com.jfrog.artifactory
plugin to lift out the publishing logic into a convention plugin
No response
Being able to set up publishing from a convention plugin inside an included build
5.1.13 or any
MacOS
No response
8.2.0
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
Cross configuration and use of Project in task actions, implicit input/outputs instead of specified explicitly
Use artifactory gradle plugin
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
5.1.13
MacOS
No response
No response
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:
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!
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.
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'
Go to https://github.com/veita/gradle-plugin-dependency-bug and follow the steps described there.
The Artifactory should play nicely with other plugins.
5.1.1
Linux
Any.
8.6
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.
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)
Changed artifactory plugin version from 4.7.x to 5.1.0.
Gradle sync completes without errors. Default value for publishBuildInfo can be set.
5.1.0
Mac OS X
No response
7.4
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
.
There are no environment variables in the generated build info JSON
No response
Environment variables are in the generated build info JSON
5.1.10
Debian Linux 12.2
7.68.7
8.3
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
The Artifactory plugin in version 5.0.3 emits warnings about using deprecated Gradle features.
No response
No response
5.0.3
MacOS aarch64
N/A
8.2.1
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:
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
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)
[ ... ]
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
The publish task should work as expected, and the ivy publication deployed to the target Artifactory without error.
5.1.10
Windows 11
7.49.10
8.4
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
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
No response
That the tests will pass
5.1.10
Ubuntu Linux 20.04.6
No response
8.4
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:
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!
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
Using the plugin as-is does not allow to use transitive jfrog dependencies without explicitly stating them in the build
See details in the description. create a project, use the plugin, try to access classes that should arrive transitively, get an exception
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)
5.0.3
macOS 13.3
cloud
8.2.1
After mentioned upgrade publish command publishes pom file only. No jar files are published.
Only pom is published.
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
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.
5.1.11
Ubuntu 22.04
Not important, reproducable in Maven Local
8.4
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.gradle configured with classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release" fails when pulling latest JFrog Gradle plugin version 5.1.4.
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.
Failed to apply plugin class 'org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin'.
Cannot run Project.afterEvaluate(Action) when the project is already evaluated.
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.
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
....
}
No response
6.1.4
Ubuntu
7.46.10
7.4.1
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:
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
Create a new Gradle project with a few sub-projects
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)
}
}
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
I could write you a gist to demonstrate that, but am out of time .
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.
5.1.10
Ubuntu 22.04
7.41.14
7.6.2
We have created our own plugin in buildSrc (build-logic for newer projects)
. I need some guidance how to integrate jfrog artifactory
in our custom plugin so that it is configured to use it in our multiple module project. Any help is highly appreciated.
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
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
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.
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.
Should work
5.1.10
Ubuntu 22.04 Linux
7.41.14
8.4
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.)
Deprecation warnings are present, a regression from the previous version.
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')
}
}
}
no depreciation warnings surfaced by Gradle
5.2.0
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
N/A
8.6
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?
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.
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.
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
Project should build successfully like when 5.1.2 is used.
5.1.5
Linux Ubuntu 22.04.3 LTS
No response
8.3 - Kotlin DSL
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.
Clip of configuration cache report:
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.
..
In a project with jfrog artifactory plugin configured:
build.gradle.kts
to force Gradle to recompile it../gradlew tasks --configuration-cache
twice.
Configuration cache entry stored.
output from Gradle.Second run of Gradle command, the Configuration cache entry reused.
output is expected.
5.2.0
Ubuntu 22
No response
8.6
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
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?
Deploying of artifacts works as expected but failing to deploy build-info
Getting the following error while trying to do artifactoryPublish
Task :artifactoryDeploy FAILED
FAILURE: Build failed with an exception.
No response
No response
5.1.13
Ubuntu
7.77.1
8.3
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.
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.
I expect that only declared artifacts along with their POM (or other metadata) are published to artifactory.
5.2.0
macOs 14.3.1 (23D60)
No response
8.2.2 / 8.3.0
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'}"
]
}
}
}
}
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.
No response
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}.
5.1.10
Ubuntu 22.04
7.41.14
N/A
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 :-
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
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)
}
},
)
}
}
Docs exist for v4, but not v5
Look around for documentation for kts format... not really any out there.
Docs should be released with breaking changes please
v5
mac
No response
No response
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
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.
Example of project setup to reproduce the error:
com.gradle.plugin-publish
plugin )/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!");
});
});
}
}
The Artifactory plugin should publish all expected artefacts and/or corresponding POM descriptors without error.
5.1.11
Windows 11
7.49.10
8.4
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.
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" } ] } ] }
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.
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 } ] } ]
5.2.0
Windows,Android
5.2.0
8.5
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).
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
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.
The build should succeed.
5.1.0
Linux 6.4.6-76060406-generic #202307241739169092810522.04~d567a38 SMP PREEMPT_DYNAMIC Tue A x86_64 x86_64 x86_64 GNU/Linux
7.39.4
8.3
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+
.
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.
No response
No response
5+
GitHub Actions
No response
8.5
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.