Giter Site home page Giter Site logo

gradle-teamcity-plugin's People

Contributors

andrefmrocha avatar bade7n avatar bigdaz avatar dependabot[bot] avatar etiennestuder avatar jlleitschuh avatar ljacomet avatar missingdays avatar mkobit avatar orybak avatar rodm avatar satamas avatar vladrassokhin avatar

Stargazers

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

Watchers

 avatar  avatar

gradle-teamcity-plugin's Issues

why are "agent" and "server" configurations non-transitive

I currently make my build now multi-target-version-able, to support the reloadable flag for 2018.2 but stay compatible wiht 2018.1.
I tried to do

configure([project(':server'), project(':serverPre2018.2')]) {
    jar.enabled = false
    dependencies {
        agent project(path: ':agent', configuration: 'plugin')
        server project(':commonServer')
    }
}

but that missed the transitive dependencies of commonServer (the JAR from sibling project common).
I had to change it to

configure([project(':server'), project(':serverPre2018.2')]) {
    jar.enabled = false
    dependencies {
        agent project(path: ':agent', configuration: 'plugin')
        runtimeOnly project(':commonServer')
    }
}

to get the transitive dependencies packed.

Add dependencies to compile classpath

When declaring dependencies on other plugins in an agent or server descriptor (optimally both in the build or in a referenced file) it would be nice if those plugins would also be added automatically to the compileOnly configuration, so that you can use the respective classes.

Fix plugin publication setup

When combining maven-publish and com.gradle.plugin-publish, you need to be careful about the plugin publication setup.
If you use configuration like pluginBundle.mavenCoordinates, the plugin publication will build its own POM file instead of reusing the output of maven-publish.

One of the main downside of that is the support for advanced dependency declaration and their compatibility with Maven POMs is not built in the com.gradle.plugin-publish plugin.

In the case of this plugin, it causes the junit-bom dependency to appear as a regular dependency instead of a BOM import in the produced POM file.
As indicated in #57, this can cause issue for users of the plugin. So while the fix in that PR will resolve the issue, a similar issue could pop up again.

I would recommend getting rid of the pluginBundle.mavenCoordinates section this it matches the defaults anyway.

Remove default server from environment configuration

When the server plugin is applied to multple sub-projects, any project that only outputs server-side jars and not a plugin zip will create tasks for a default environment. This will lead to tasks for a default environment that may be confusing.

IndexOutOfBoundsException if TeamCity version does not contain a dot

I hate having to restart TeamCity continuously, it is a waste of time and the latest 2018.2 EAP can already do dynamic reloading of plugins, so I tried to use it.

I've set baseDownloadUrl = 'https://download.jetbrains.com/teamcity/eap/' and version = '60663', but then below exception happens as you search for a dot in the version to determine the datadir and that fails.

Setting the data dir manually works as workaround.

org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'foo'.
        at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:79)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:73)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:54)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:110)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
        at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
        at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:60)
        at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
        at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.IndexOutOfBoundsException: index is out of range 0..-1 (index = 0)
        at com.github.rodm.teamcity.TeamCityServerPlugin$ConfigureEnvironmentTasksAction$_defaultMissingProperties_closure2.doCall(TeamCityServerPlugin.groovy:289)
        at com.github.rodm.teamcity.TeamCityServerPlugin$ConfigureEnvironmentTasksAction.defaultMissingProperties(TeamCityServerPlugin.groovy:286)
        at com.github.rodm.teamcity.TeamCityServerPlugin$ConfigureEnvironmentTasksAction$_execute_closure1.doCall(TeamCityServerPlugin.groovy:228)
        at com.github.rodm.teamcity.TeamCityServerPlugin$ConfigureEnvironmentTasksAction.execute(TeamCityServerPlugin.groovy:227)
        at com.github.rodm.teamcity.TeamCityServerPlugin$ConfigureEnvironmentTasksAction.execute(TeamCityServerPlugin.groovy)
        at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1$1.run(DefaultListenerBuildOperationDecorator.java:155)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
        at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:152)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:149)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
        at com.sun.proxy.$Proxy30.afterEvaluate(Unknown Source)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:187)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:184)
        at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1418)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:193)
        ... 91 more

Initial publishing does not work

If you try to publish a new plugin, you get a very cryptic 404 problem that is not really obvious what the cause is:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':server:publishPlugin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:151)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:141)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.StartSnapshotTaskInputsBuildOperationTaskExecuter.execute(StartSnapshotTaskInputsBuildOperationTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.GradleException: Failed to upload plugin
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at com.github.rodm.teamcity.tasks.PublishTask.publishPlugin(PublishTask.groovy:126)
        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:103)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:48)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:702)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:669)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:404)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:393)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:376)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:213)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:120)
        ... 36 more
Caused by: org.jetbrains.intellij.pluginRepository.exceptions.UploadFailedException:
<!doctype html>
<html lang="en">
<head>









<title>Error 404: Page Not Found</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="shortcut icon" href="https://resources.jetbrains.com/storage/ui/favicons/favicon.ico" type="image/x-icon" sizes="16x16 32x32"/>
<link rel="apple-touch-icon" sizes="57x57" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-57x57.png"/>
<link rel="apple-touch-icon" sizes="60x60" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-60x60.png"/>
<link rel="apple-touch-icon" sizes="72x72" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-72x72.png"/>
<link rel="apple-touch-icon" sizes="76x76" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-76x76.png"/>
<link rel="apple-touch-icon" sizes="114x114" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-114x114.png"/>
<link rel="apple-touch-icon" sizes="120x120" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-120x120.png"/>
<link rel="apple-touch-icon" sizes="144x144" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-144x144.png"/>
<link rel="apple-touch-icon" sizes="152x152" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-152x152.png"/>
<link rel="apple-touch-icon" sizes="180x180" href="https://resources.jetbrains.com/storage/ui/favicons/apple-touch-icon-180x180.png"/>
<link rel="mask-icon" href="https://resources.jetbrains.com/storage/ui/favicons/apple-mask-icon.svg" color="black"/>
<meta name="msapplication-TileColor" content="#000000"/>
<meta name="msapplication-TileImage" content="https://resources.jetbrains.com/storage/ui/favicons/mstile-144x144.png"/>
<meta name="msapplication-square70x70logo" content="https://resources.jetbrains.com/storage/ui/favicons/mstile-70x70.png"/>
<meta name="msapplication-square150x150logo" content="https://resources.jetbrains.com/storage/ui/favicons/mstile-150x150.png"/>
<meta name="msapplication-wide310x150logo" content="https://resources.jetbrains.com/storage/ui/favicons/mstile-310x150.png"/>
<meta name="msapplication-square310x310logo" content="https://resources.jetbrains.com/storage/ui/favicons/mstile-310x310.png"/>

<!-- Social Media tag Starts -->
<!-- Place this data between the <head> tags of your website -->
<!-- Open Graph data -->
<meta property="og:title" content="Error 404: Page Not Found"/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="https://plugins.jetbrains.com/plugin/uploadPlugin"/>
<meta property="og:image" content="https://plugins.jetbrains.com/assets/icons/jetbrains.png"/>
<meta property="og:description" content="Welcome to the JetBrains plugin repository"/>
<meta property="og:site_name" content="JetBrains Plugin Repository"/>
<!-- End Open Graph -->

<!-- Start Twitter Summary Card -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@JBPlatform">
<meta name="twitter:image" content="https://plugins.jetbrains.com/assets/icons/jetbrains.png">
<!-- End Twitter Summary Card -->




<meta name="readOnlyModeStatus" content="off">

<link rel="stylesheet" href="/_assets/common.css?ver=6205" type="text/css">
<script src="/_assets/common.js?ver=6205"></script>








  <link rel="stylesheet" href="/_assets/error.css" type="text/css">
  <script src="/_assets/error.js"></script>


</head>

<body id="unknown" class="">

  <!-- Google Tag Manager -->
  <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-5P98" height="0" width="0"
                    style="display:none;visibility:hidden"></iframe></noscript>
  <script>(function (w, d, s, l, i) {
    w[l] = w[l] || [];
    w[l].push({
      'gtm.start': new Date().getTime(), event: 'gtm.js'
    });
    var f = d.getElementsByTagName(s)[0],
      j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
    j.async = true;
    j.src =
      '//www.googletagmanager.com/gtm.js?id=' + i + dl;
    f.parentNode.insertBefore(j, f);
  })(window, document, 'script', 'dataLayer', 'GTM-5P98');</script>
  <!-- End Google Tag Manager -->



<div class="wt-layout">

  <div class="wt-layout__header">












<header class="header js-header-popover-group">
  <div class="wt-container">
    <div class="wt-row wt-row_size_m wt-row_align-items_stretch wt-row_nowrap wt-row_justify_between">
      <div class="wt-col-2 header-logo-wrapper">
          <a class="header-logo jetbrains-logo _logo-jetbrains" href="/"></a>
      </div>

      <nav class="wt-col-inline header-link-list header-link-list-main _align-center hidden-md">
        <a data-popover-group-button-id="nav-intellij"
           class="js-header-popover-hover header-link-item-main">
          <span>IDEs</span>
        </a>

        <a data-popover-group-button-id="nav-dotnet"
           class="js-header-popover-hover header-link-item-main">
          <span>.NET</span>
        </a>

        <a data-popover-group-button-id="nav-teamware"
           class="js-header-popover-hover header-link-item-main">
          <span>Team Tools</span>
        </a>

        <a data-popover-group-button-id="nav-dev-guide"
           class="js-header-popover-hover header-link-item-main">
          <span>Dev Guide</span>
        </a>
      </nav>

      <nav class="wt-col-3 header-link-list header-link-list-main _align-right hidden-md">

          <div class="">
            <a href="/login?request_credentials=required" class="header-link-item-main _simple _icon-wrapper " data-test="signin-button">
              <span class="header-link-item__icon _icon-left icon icon-account-white"></span>
              Sign In
            </a>
          </div>



        <button class="js-header-popover-click header-link-item-main reset-button"
                data-popover-group-button-id="header-search">
          <span class="header-link-item__icon icon icon-search-white"></span>
        </button>
      </nav>
    </div>
  </div>
</header>

<button class="js-header-popover-click header__hamburger hamburger _white _type-close reset-button hidden visible-md"
        data-popover-group-button-id="header-mobile-nav">
  <span class="hamburger__icon"></span>
</button>

<div class="header-placeholder"></div>

<div class="header-popover-content-wrapper" data-popover-group-content-id="header-mobile-nav">

  <div class="header-popover-content header-search-container no-margin-left no-margin-right"
       data-popover-group-content-id="header-search">
    <div class="wt-container">
      <form action="/search?pr=&id=searchHeader" method="get" class="header-search-container__form" >
        <input type="hidden" name="correctionAllowed" value="true">

        <input type="hidden" name="pr" value="">

        <input id="searchInputHeader" class="ja-header-search-input header-search-container__input"
               type="search"
               name="search"
               value=""
               autocomplete="off"
               placeholder="Search 4415 plugins" />

        <button type="submit" class="header-search-container__button button">
          <span class="icon icon-search-gray hidden visible-md"></span>
          Search
        </button>
        <button class="js-close-mobile-nav-button close-mobile-nav-button reset-button hidden visible-md"><span class="icon icon-close"></span></button>
      </form>
    </div>
  </div>

  <div class="header-popover-content" data-popover-group-content-id="nav-intellij">
    <div class="wt-container">
      <div class="wt-row wt-row_size_m wt-row_nowrap">
        <div class="wt-col-3 hidden-md">
          <a href="/plugin/add#intellij"
             class="header-container-description">
            <div class="header-container-description__logo">
              <span class="icon icon-upload"></span>
            </div>

            <div class="header-container-description__title">Upload your plugin</div>

            <div class="header-container-description__text">Your plugin for one of our IDEs might be of great use to millions of users.</div>

            <div class="header-container-description__link">Upload</div>
          </a>
        </div>

        <div class="wt-col-inline wt-col-md-12 wt-offset-left-md-0">
          <span class="header-second-title">IDEs</span>
          <ul class="header-second-links-list _ides">



              <li class="header-second-links-list__item">
                <div class="header-link-item-second &#39;&#39;">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-intellij-idea _full-block"></span>
                  </span>
                  IntelliJ IDEA
                </div>

                <ul class="header-second-links-list">

                    <li class="header-second-links-list__item">
                      <a href="/idea" class="header-link-item-second _font-weight-light ">
                        Ultimate
                      </a>
                    </li>

                    <li class="header-second-links-list__item">
                      <a href="/idea_ce" class="header-link-item-second _font-weight-light ">
                        Community
                      </a>
                    </li>

                    <li class="header-second-links-list__item">
                      <a href="/idea_edu" class="header-link-item-second _font-weight-light ">
                        Educational
                      </a>
                    </li>

                </ul>
              </li>



              <li class="header-second-links-list__item">
                <div class="header-link-item-second &#39;&#39;">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-pycharm _full-block"></span>
                  </span>
                  PyCharm
                </div>

                <ul class="header-second-links-list">

                    <li class="header-second-links-list__item">
                      <a href="/pycharm" class="header-link-item-second _font-weight-light ">
                        Professional
                      </a>
                    </li>

                    <li class="header-second-links-list__item">
                      <a href="/pycharm_ce" class="header-link-item-second _font-weight-light ">
                        Community
                      </a>
                    </li>

                    <li class="header-second-links-list__item">
                      <a href="/pycharm_edu" class="header-link-item-second _font-weight-light ">
                        Educational
                      </a>
                    </li>

                </ul>
              </li>



              <li class="header-second-links-list__item">
                <a href="/phpstorm" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-phpstorm _full-block"></span>
                  </span>
                  PhpStorm
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/webstorm" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-webstorm _full-block"></span>
                  </span>
                  WebStorm
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/ruby" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-rubymine _full-block"></span>
                  </span>
                  RubyMine
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/objc" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-appcode _full-block"></span>
                  </span>
                  AppCode
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/clion" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-clion _full-block"></span>
                  </span>
                  CLion
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/go" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-gogland _full-block"></span>
                  </span>
                  GoLand
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/dbe" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-datagrip _full-block"></span>
                  </span>
                  DataGrip
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/rider" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-rider _full-block"></span>
                  </span>
                  Rider
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/mps" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-mps _full-block"></span>
                  </span>
                  MPS
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/androidstudio" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-androidstudio _full-block"></span>
                  </span>
                  Android Studio
                </a>
              </li>

          </ul>
        </div>

        <div class="wt-col-inline wt-offset-left-2 hidden-md">
          <ul>
            <li class="header-second-links-list__item" id="rc-intellij-contest-link"></li>
          </ul>
        </div>
      </div>
    </div>
  </div>

  <div class="header-popover-content" data-popover-group-content-id="nav-dotnet">
    <div class="wt-container">
      <div class="wt-row wt-row_size_m wt-row_nowrap">
        <div class="wt-col-3 hidden-lg">
          <a href="/plugin/add#dotnet"
             class="header-container-description">

            <div class="header-container-description__logo">
              <span class="icon icon-upload"></span>
            </div>

            <div class="header-container-description__title">Upload your plugin</div>

            <div class="header-container-description__text">
              Your plugin for one of our .NET tools might be of great use to millions of users.
            </div>

            <div class="header-container-description__link">Upload</div>
          </a>
        </div>

        <div class="wt-col-inline wt-offset-left-lg-2 wt-col-md-12 wt-offset-left-md-0">
          <span class="header-second-title">Team Tools</span>
          <ul class="header-second-links-list _team-tools">

              <li class="header-second-links-list__item">
                <a href="/resharper" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-resharper _full-block"></span>
                  </span>
                  ReSharper
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/rider" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-rider _full-block"></span>
                  </span>
                  Rider
                </a>
              </li>

          </ul>
        </div>
      </div>
    </div>
  </div>

  <div class="header-popover-content" data-popover-group-content-id="nav-teamware">
    <div class="wt-container">
      <div class="wt-row wt-row_size_m wt-row_nowrap">
        <div class="wt-col-3 hidden-md">
          <a href="/plugin/add#teamcity"
             class="header-container-description">

            <div class="header-container-description__logo">
              <span class="icon icon-upload"></span>
            </div>

            <div class="header-container-description__title">Upload your plugin</div>

            <div class="header-container-description__text">Your plugin for one of our team tools might be of great use to millions of users.</div>

            <div class="header-container-description__link">Upload</div>
          </a>
        </div>

        <div class="wt-col-inline wt-offset-left-1 wt-col-md-12 wt-offset-left-md-0">
          <span class="header-second-title">Team Tools</span>
          <ul class="header-second-links-list _team-tools">

              <li class="header-second-links-list__item">
                <a href="/teamcity" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-teamcity _full-block"></span>
                  </span>
                  TeamCity
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/hub" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-hub _full-block"></span>
                  </span>
                  Hub
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/youtrack" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-youtrack _full-block"></span>
                  </span>
                  YouTrack
                </a>
              </li>

              <li class="header-second-links-list__item">
                <a href="/upsource" class="header-link-item-second ">
                  <span class="header-link-item-second__logo">
                    <span class="jetbrains-logo _logo-upsource _full-block"></span>
                  </span>
                  Upsource
                </a>
              </li>

          </ul>
        </div>

        <div class="wt-col-inline hidden-md">
          <ul>
            <li class="header-second-links-list__item" id="rc-teamcity-contest-link"></li>
          </ul>
        </div>
      </div>
    </div>
  </div>

  <div class="header-popover-content" data-popover-group-content-id="nav-dev-guide">
    <div class="wt-container">
      <div class="wt-row wt-row_size_m wt-row_nowrap">
        <div class="wt-col-inline wt-offset-left-6 wt-col-md-12 wt-offset-left-md-0">
          <span class="header-second-title">Dev Guide</span>
          <ul class="header-second-links-list _dev-guide">
            <li class="header-second-links-list__item">
              <a class="header-link-item-second"
                 href="//www.jetbrains.org/intellij/sdk/docs/">
                IntelliJ Platform SDK
              </a>
            </li>
            <li class="header-second-links-list__item">
              <a class="header-link-item-second" href="//plugins.jetbrains.com/docs/teamcity/">TeamCity plugins</a>
            </li>
            <li class="header-second-links-list__item">
              <a class="header-link-item-second"
                 href="//www.jetbrains.com/help/hub/building-custom-widgets.html">
                Hub custom widgets
              </a>
            </li>
            <li class="header-second-links-list__item">
              <a class="header-link-item-second"
                 href="//www.jetbrains.com/help/resharper/sdk/">
                R# plugins
              </a>
            </li>
            <li class="header-second-links-list__item">
              <a class="header-link-item-second"
                 href="/marketplace">
                Marketplace EAP
              </a>
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>

    <div class="wt-container">
      <div class="header-popover-content _profile float-right float-none-md"
           data-popover-group-content-id="nav-user">

          <a href="/login?request_credentials=required" class="header-second-title ">
            Sign In
          </a>



      </div>
    </div>
</div>

  </div>

  <div class="wt-layout__content">

    <div class="wt-container">

<div class="page-error__content">
  <div class="wt-row wt-row_size_m wt-row_justify_center wt-row-sm_justify_start">
    <div class="wt-col-3 wt-col-lg-4 wt-col-md-5 ">
      <div class="page-error-logo _error-404">
        <div class="page-error-logo__beam"></div>
      </div>
    </div>

    <div class="wt-col-5 wt-col-md-7 wt-col-sm-12 article-content">
      <h1 class="page-error__h1 _big">uh-oh!</h1>

      <div class="page-error__sub-title sub-title">You surely know what this means.</div>

      <div class="page-error__text">
        We can't find the page you're looking for. Try starting from <a href="/">home</a>.
      </div>
    </div>
  </div>
</div>

    </div>

  </div>
  <footer class="wt-layout__footer">

<div class="wt-container">
  <div class="footer wt-text-3">
    <div class="footer__column footer__column_left">
      <a href="https://www.jetbrains.com" class="footer__logo">
        <div class="jetbrains-logo _logo-jetbrains-square"></div>
      </a>

      <div class="footer__info">
        <p>Copyright &copy; 2000û<span class="js-footer-current-year"></span> JetBrains s.r.o.</p>
        <p>Developed with drive and <a class="wt-link" href="https://www.jetbrains.com/idea">IntelliJ IDEA</a></p>
        <p class="footer__build-number">Build #6205</p>
      </div>
    </div>

    <div class="footer__column footer__column_right">
      <ul class="footer__list footer__list_align_right">
        <li><a class="wt-link" href="mailto:[email protected]">Feedback</a></li>
        <li><a class="wt-link" href="https://twitter.com/JBPlatform">Twitter</a></li>
        <li><a class="wt-link" href="https://blog.jetbrains.com/platform">Blog</a></li>
        <li><a class="wt-link" href="/marketplace">Marketplace</a></li>
      </ul>
      <ul class="footer__list footer__list_align_right">
        <li><a class="wt-link wt-link_color_inherit" href="/legal/terms-of-use">Terms of Use</a></li>
        <li><a class="wt-link wt-link_color_inherit" href="/legal">Legal, Privacy & Security</a></li>
      </ul>
    </div>
  </div>
</div>

  </footer>
</div>

<div class="js-notifications-container"></div>
<div class="js-overlay overlay"></div>
</body>
</html>



        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance.uploadPluginInternal(pluginRepositoryRest.kt:123)
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance.uploadPluginInternal$default(pluginRepositoryRest.kt:108)
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance.uploadPlugin(pluginRepositoryRest.kt:105)
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance$uploadPlugin.call(Unknown Source)
        at com.github.rodm.teamcity.tasks.PublishTask.publishPlugin(PublishTask.groovy:122)
        ... 91 more

I think the problem is the one reported at JetBrains/plugin-repository-rest-client#11 and at least improved with a meaningful error message at https://github.com/JetBrains/plugin-repository-rest-client/pull/26/files, so you should probably upgrade to the latest version of that lib to benefit from the better error message.

Add support for Gradle's software model

Add support to define TeamCity agent, server and common components using the software model.

model {
    teamcity {
        version = '9.1.6'
    }
    components {
        common(TeamCityCommonLibrarySpec) { }
        agent(TeamCityAgentLibrarySpec) { }
        server(TeamCityServerLibrarySpec) { }
    }
}

The above will compile each source set with the either the common-api, agent-api or server-api using the version defined in the teamcity block.

The agent and server plugin components will each be defined by a component spec.

model {
    components {
        agent(TeamCityAgentPluginSpec) {
            descriptor { ... }
            files { ... }
        }
        server(TeamCityServerLibrarySpec) {
            descriptor { ... }
        }
    }
}

Remove use of internal Gradle classes

Upgrading to Gradle 2.14 fails to build due to the use of an internal Gradle class to provide progress logging to the Download task. Running a download task on a project updated to use will also fail.

To provide progress logging for the download task requires a fix to the Gradle issue, GRADLE-2787

Remove deprecated properties

Configuring the descriptor, tokens and files outside the agent and server configuration blocks is deprecated and should be removed. The environments support in the server configuration block should also be removed. This is a post 1.0 release task.

undeploy should unload additionally to deleting

If you use the undeploy task while the server is running, there should be an unload request done for >= 2018.2, otherwise the UI will show it as deleted and provides the option to restart or unload.

Add docker task to run Teamcity server/agent in containers

Hi,

What do you think about adding Docker support? This would solve different problems:

  • No need to download/unpack Teamcity
  • Cross platform development support
  • Host system would stay clean.

Here is my attempt, I think it almost worked, but needs more systematic approach :)

package com.github.rodm.teamcity.tasks

import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction

class DockerCreateServer extends DefaultTask {

    @Input
    String containerName

    @Input
    File dataDir

    @Input
    String serverOptions

    DockerCreateServer() {
        description = 'Create new Docker container with TeamCity Server'
    }

    @TaskAction
    void start() {
        validDirectory('dataDir', getDataDir())

        project.ant.exec(executable: "/usr/local/bin/docker", failonerror: true, logError: true, spawn: false) {
            arg value: 'create'
            arg value: '--name'
            arg value: getContainerName()
            arg value: '-e'
            arg value: String.format('TEAMCITY_SERVER_MEM_OPTS="%s"', getServerOptions())
            arg value: '-v'
            arg value: String.format('%s:/data/teamcity_server/datadir', getDataDir().path)
            arg value: '-p'
            arg value: '8111:8111'
            arg value: '-p'
            arg value: '5005:5005'
            arg value: 'jetbrains/teamcity-server'
        }
    }
}

Probably some parameters have to be configurable (e.g. container name, ports, docker location).
You can take a look at official Docker support for Teamcity:
https://hub.docker.com/r/jetbrains/teamcity-server/
https://hub.docker.com/r/jetbrains/teamcity-agent/

Thank you.

Support a single project configuration using sourceSets

Currently each part of the a plugin has to be build using a separate Gradle sub-project. Adding a sourceSet property could allow a single project build all the components, a common/shared library, agent-side plugin and server-side plugin.

An example configuration

sourceSets {
    common
    agent
    server
}

teamcity {
    common {
        sourceSet = sourceSets.common
    }
    agent {
        sourceSet = sourceSets.agent
    }
    server {
        sourceSet = sourceSets.server
        descriptor {
            ...
        }
    }
}

Unit tests for each component will most likely require a separate source set.

Builds using the plugin fail when built on TeamCity

Builds run on TeamCity fail to resolve dependencies

Cannot resolve external dependency org.jetbrains.teamcity:server-api:8.1.5 because no repositories are defined.

The plugin enables default repositories based on a property set in the plugin extension. The way this property is accessed clashes with the properties setup by the TeamCity Gradle Runner plugin causing the default repositories to not be setup.

deploying new plugin is not possible

If you have a running TeamCity server where the plugin is not installed currently and then execute the deploy task, you get two times <response>Plugin not found</response> as output. I assume this is from disabling and enabling the plugin. While the message could maybe also be a bit more clear, the problem is, that the plugin is not active after this. I guess in case of this reponse you should have some retry logic that tries to activate the plugin once a second for a minute as long as this response comes or something like that so that the TC server has a chance to recognize the new plugin that should be enabled.

Do not ignore the archivesBaseName

Gradle supports by default an archivesBaseName but you ignore it and always set it to the root project name.
Please consider the archivesBaseName. Actually it might be enough to not set the baseName explicitly in TeamCityServerPlugin:84, afair all Zip-tasks should get the archivesBaseName or as default the project name by default already. If one want the root projects name, he could still configure it.
If you still want to use the root project name as default instead of the project name, you might still consider using the archivesBaseName first if it is set.

Support running integration tests by starting and stopping the server and agent

The Gradle test task is extension aware and could be enhanced to allow a TeamCity instance to be configured. The server and/or agent can be started before running the tests and stopped after the tests.

An example integration test task configuration

task integrationTest(type: Test) {
    group = 'verification'
    testClassesDir = sourceSets.integrtaionTest.output.classesDir
    classpath = sourceSets.integrataionTest.runtimeClasspath

    teamcity {
        environment = 'teamcity10'
    }
}

The environment property will reference a TeamCity installation defined in the environments section.

Currently the start server and start agent tasks don't wait until the server and agent are started and ready before continuing, this will be required before running the tests.

Tests may not be repeatable or reliable if using the same TeamCity configuration that the environments use.

Multi variant releases

If you want to use newer things in newer TeamCity version that are incompatible with older TeamCity versions but still stay compatible with the old version, you need to release multiple versions with different min- / max-builds.
For example currently if you set the allow-runtime-reload and try to deploy your plugin to 2018.1, the validation of the plugin descriptor fails. For 2018.1.4 Jetbrains will probably backport compatibility for that, but if you e. g. want to be compatible with older versions, or with other breaking changes in the future, you need to release multiple variants.
Would be nice if this were somehow nicely supported by this plugin, e. g. by having multiple source sets for different versions and then building multiple distributions and release them all or something similar.

do not create extensions if they might be there already

You unconditionally do things lke descriptor = extensions.create('descriptor', ServerPluginDescriptor, project), but there might already be an extension with that name and the build will fail.

An example of what I mean is:

configure([project(':server'), project(':serverPre2018.2')]) {
    teamcity {
        server {
            descriptor {
                // stuff for both versions
            }
        }
    }
}

project(':server') {
    teamcity {
        server {
            descriptor {
                allowRuntimeReload true
            }
        }
    }
}

This fails with said exception.

Server plugin is not rebuilt when I change descriptor

I have variables in my build that defineds versions and other string attributes.
Changing those variables does not make Gradle to re-build the server-side plugin
Looks like TeamCity descriptor is missing from cache key somewhere

descriptor generation does not handle UTF-8 properly

Setting vendorName = 'Björn Kautler' results in:

./gradlew startTeamcityServer -s
> Task :serverPlugin FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':serverPlugin'.
> com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ung³ltiges Byte 2 von 4-Byte-UTF-8-Sequenz.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':serverPlugin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:143)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:40)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:24)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:46)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:49)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:33)
        at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:355)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:219)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.UncheckedIOException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ung³ltiges Byte 2 von 4-Byte-UTF-8-Sequenz.
        at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:57)
        at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:40)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:161)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
        ... 111 more
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ung³ltiges Byte 2 von 4-Byte-UTF-8-Sequenz.
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:701)
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:473)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1895)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XMLEntityScanner.java:1551)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2821)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
        at com.github.rodm.teamcity.TeamCityServerPlugin$PluginDescriptorContentsValidationAction.execute(TeamCityServerPlugin.groovy:185)
        at com.github.rodm.teamcity.TeamCityServerPlugin$PluginDescriptorContentsValidationAction.execute(TeamCityServerPlugin.groovy)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:801)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:768)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
        ... 118 more


* Get more help at https://help.gradle.org

BUILD FAILED in 2s
3 actionable tasks: 2 executed, 1 up-to-date

inherit version lazily

The TeamCityPluginExtension.version is inherited eagerly from the root project.
This means if you have

apply plugin: 'com.github.rodm.teamcity-environments'
project(':common') { apply plugin: 'com.github.rodm.teamcity-common' }
project(':agent') { apply plugin: 'com.github.rodm.teamcity-agent' }
configure([project(':server'), project(':serverPre2018.2')]) { apply plugin: 'com.github.rodm.teamcity-server' }
teamcity.version '2018.1.2'

the subprojects will have version 9.0, but if you have

apply plugin: 'com.github.rodm.teamcity-environments'
teamcity.version '2018.1.2'
project(':common') { apply plugin: 'com.github.rodm.teamcity-common' }
project(':agent') { apply plugin: 'com.github.rodm.teamcity-agent' }
configure([project(':server'), project(':serverPre2018.2')]) { apply plugin: 'com.github.rodm.teamcity-server' }

the subprojects will have version 2018.1.2.

Would be nice if the inheriting is done lazily, so that both work like the latter.

Duplicate entries in plugin.zip

I'm building a plugin that is compatible with a set of TeamCity versions. It turned out, the gson library was included in the version I was building against. To workaround it I specified the same dependency for agent and compile configurations. As the result, I noticed a duplicated entry in the generated .zip file of agent plugin.

In the sources in TeamCityAgentPlugin.groovy I spot the following:

into("lib") {
                project.plugins.withType(JavaPlugin) {
                    def jar = project.tasks[JavaPlugin.JAR_TASK_NAME]
                    from(jar)
                    from(project.configurations.runtime - project.configurations.provided)
                }
                from(project.configurations.agent)
            }

It looks like those several from declarations does not check for duplicates (at least with Gradle 4.7)
Similar code is for the server-side plugin.

Remove extension properties

The following extension properties have been replaced by the support for multiple environments and equivalent properties within the server configuration block.

homeDir
dataDir
javaHome
serverOptions
downloadBaseUrl
downloadUrl
downloadDir
downloadFile

The start/stop/deploy/undeploy tasks that use these properties can also be removed.

Support TeamCity versions with '-SNAPSHOT'

When deveoping plugins for the nighlty TeamCity, it's impossible to set teamcity version to any version that ends with '-SNAPSHOT', e.g. '2020.1-SNAPSHOT'.
This is a valid TeamCity version, yet it can't be set

Do not depend on deprecated configuration

The compile configuration as well as the runtime configuration (and testCompile, testRuntime, ...) are deprecated since Gradle 3.4.
Instead to declare dependencies implementation and runtimeOnly (testImplementation, testRuntimeOnly, ...) should be used instead.

You should probably also change this in your own build scripts, but what I mean is that you force your consumers to either use the deprecated configuration or to declare any dependencies twice, in implementation and in server or agent, the first for compiling, the second for packaging.
You use configurations.runtime at https://github.com/rodm/gradle-teamcity-plugin/blob/master/src/main/groovy/com/github/rodm/teamcity/TeamCityServerPlugin.groovy#L85 and https://github.com/rodm/gradle-teamcity-plugin/blob/master/src/main/groovy/com/github/rodm/teamcity/TeamCityAgentPlugin.groovy#L81, but instead you should use configurations.runtimeClasspath which includes runtime (and thus compile), implementation(and thus alsocompile) and runtimeOnly`.

You can see the detailed information at https://docs.gradle.org/current/userguide/java_plugin.html#tab:configurations in the text and the figure.

Credentials used to publish the plugin are ignored

Configuring the username and password in the publish configuration block are ignored so the publish task fails with the following exception

Caused by: java.lang.RuntimeException: Failed to upload plugin
        ... 61 more
Caused by: java.lang.RuntimeException: Username must be set for uploading
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance.ensureCredentialsAreSet(pluginRepositoryRest.kt:111)
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance.uploadPlugin(pluginRepositoryRest.kt:92)
        at org.jetbrains.intellij.pluginRepository.PluginRepositoryInstance$uploadPlugin.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:141)
        at com.github.rodm.teamcity.tasks.PublishTask.publishPlugin(PublishTask.groovy:111)
        ... 51 more

Stop takes forever

If any build is running gradle task and I try to stop/cancel build. It takes forever .

Start and stop tasks fail with invalid homeDir

Setting baseHomeDir causes the start and stop tasks to fail reporting that 'homeDir' does not exist.

A workaround is to set the homeDir for each environment.

The plugin currently defaults the homeDir property for an environment by prefixing the baseHomeDir path with the Gradle project root.

Could not resolve com.github.rodm:gradle-teamcity-plugin:1.0

I am getting below error when using gradle teamcity plugin.

Could not resolve com.github.rodm:gradle-teamcity-plugin:1.0. > Could not get resource 'https://plugins.gradle.org/m2/com/github/rodm/gradle-teamcity-plugin/1.0/gradle-teamcity-plugin-1.0.pom'

When I looked at https://plugins.gradle.org/m2/com/github/rodm in browser, I get 'The requested path was not found.' error.

My build configuration is below:

buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.github.rodm:gradle-teamcity-plugin:1.0"
}
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'com.github.rodm.teamcity-server' //Server-side plugin essentials
apply plugin: 'com.github.rodm.teamcity-common' //To get teamcity openAPI jars

teamcity {
// Use TeamCity 10.0 API
version = '10.0'
server {
// Locate the plugin descriptor in the root directory of the project
descriptor = file('teamcity-plugin.xml')
tokens = [VERSION: project.version, VENDOR_NAME: 'test.com']
}
}

Looks like the plugin is not published in jcenter repository.

Please support token for publishing

In Hub you can create tokens that have access only to the plugin repository and you don't need to store username / password on disk or enter it for publishing.
Would be nice if the plugin would support the usage of such a token instead of username / password.
It seems the library you use for uploading already supports both, so it should be a fairly easy implementation.

Resolve fails with 'hostname in certificate didn't match'

Since switching to using https for the JetBrains Maven repository resolving the artifacts sometimes fails

:common:compileJava
:common:processResources UP-TO-DATE
:common:classes
:common:jar
:compileJava
FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration ':compile'.
> Could not resolve org.jetbrains.teamcity:server-api:8.1.5.
  Required by:
      :test-plugin:unspecified
   > Could not resolve org.jetbrains.teamcity:server-api:8.1.5.
      > Could not get resource 'https://download.jetbrains.com/teamcity-repository/org/jetbrains/teamcity/server-api/8.1.5/server-api-8.1.5.pom'.
         > Could not HEAD 'https://download.jetbrains.com/teamcity-repository/org/jetbrains/teamcity/server-api/8.1.5/server-api-8.1.5.pom'.
            > hostname in certificate didn't match: <download.jetbrains.com> != <www.jetbrains.com> OR <www.jetbrains.com> OR <jetbrains.com>

To work around this problem the default repositories added by the plugin can be disabled and replaced.

repositories {
    mavenCentral()
    maven {
        url = 'http://download.jetbrains.com/teamcity-repository'
    }
}

teamcity {
    defaultRepositories = false
}

Inconsistency with dependencies and versions <9

I've seen that you handle these inconsistent between server and agent part.
For server part you warn and exclude the dependencies from the descriptor.
For agent part you warn but include the dependencies in the descriptor.
Is this difference intended?

Descriptor tokens can be defined with an inline descriptor

Tokens to be replaced in a descriptor file can be defined when using an inline descriptor but are ignored.

teamcity {
    server {
        descriptor {
            name = 'test plugin'
        }
        tokens VERSION: '1.2.3', BUILD_NUMBER: '123'
    }
}

An alternative to avoid a confusing build script would be to define the tokens and descriptor file path inside the descriptor block.

teamcity {
    server {
        descriptor {
            file = file('teamcity-plugin.xml')
            tokens VERSION: '1.2.3', BUILD_NUMBER: '123'
        }
    }
}

Mixing descriptor file path and tokens with inline descriptor properties should cause a build failure.

Download task needs to be smarter

Running the download task when the output directory maybe shared with other plugin projects will result in multiple downloads. If the TeamCity distribution has been downloaded using the task from one project other projects should not download the file again.

Make TeamCityEnvironments implement NamedDomainObjectContainer for nicer Kotlin integration

Within a Kotlin build script you currently have to do

teamcity {
    version = "2018.2"

    environments {
        environments.register("teamcity") {
            version = "2018.2.4"
        }
    }
}

Which is because TeamCityEnvironments does not implement NamedDomainObjectContainer but has a field called environments that does it and that is delegated to within methodMissing. This though only works nicely when used from Groovy.
The idiomatic way used in core Gradle of doing Groovy code like

teamcity {
    version = "2018.2"

    environments {
        teamcity {
            version = "2018.2.4"
        }
    }
}

in Kotlin is

teamcity {
    version = "2018.2"

    environments {
        create("teamcity") {
            version = "2018.2.4"
        }
    }
}

or

teamcity {
    version = "2018.2"

    environments {
        register("teamcity") {
            version = "2018.2.4"
        }
    }
}

(The latter for using configuration avoidance once it is rolled out to all domain containers, not only tasks.)

But for this to work, TeamCityEnvironments needs to implement NamedDomainObjectContainer itself.

Add configuration properties to define the plugin archive names

Add properties the allow the agent and server plugin archives to be named without having to reconfigure the agentPlugin and serverPlugin tasks

The properties should be similar to those supported by the jar and zip tasks, allowing the archive base name and version to be specified.

Support for update notes

When releasing my plugin, I want to fill in the update notes.
As far as I can see the plugin does not yet provide that.

load and unload requests are not properly encoded

I split my plugin into two versions, one with the reloadable flag, one without.
As both variants contain the same content and thus version-wise could be considered equal, I followed the semantic versioning scheme and created one with version 0.1.0+a and the other with version 0.1.0+b.

This resulted in the message :deployToTeamcity: Enabling plugin 'my-plugin-0.1.0+b.zip' failed: Plugin not found from the plugin , the message [2018-12-08 04:46:58,282] WARN - jetbrains.buildServer.SERVER - Error while unpacking plugin from '...\data\2018.2\plugins\my-plugin-0.1.0 b.zip' (modified: 1970-01-01 01:00:00.000, size: 0 B): jetbrains.buildServer.web.plugins.files.ServerPluginUnpacker$UnpackException: Failed to read plugin archive '...\data\2018.2\plugins\my-plugin-0.1.0 b.zip' (modified: 1970-01-01 01:00:00.000, size: 0 B) (enable debug to see stacktrace) and no change in the UI.

As you can see, TC thinks there is a space between 0.1.0 and b which happens to be encoded as + in HTTP URL-encoding. So it seems to me you do not properly URL-encode the parameters. You most probably want to use the class java.net.URLEncoder.

Allow environment properties to be overridden by Gradle properties

To override the following plugin properties downloadsDir, baseDownloadUrl, baseHomeDir and baseDataDir requires code to lookup a Gradle project property and then apply the setting in the plugin configuration block.

For example
ext {
downloadsDir = findProperty('downloads.dir') ?: "$rootDir/downloads"
}
teamcity {
server {
downloadsDir = project.downloadsDir
}
}

An alternative is to allow defining Gradle properties to override the default values of the above properties and avoid having to use the code above for each property.

downloadDir property in teamcity configuration block doesn't work

In my gradle scipt I try to specify downloadDir property but as far as I see gradle-teamcity-plugin anyway downloads TeamCity to the default location:

teamcity {
    agent {
        descriptor = project(':proj').file('teamcity-plugin.xml')
    } 
    server {
        descriptor = file("$rootDir/teamcity-plugin.xml")
    }
    homeDir = file("...")
    dataDir = file("...")
    javaHome = file("...")
    version = "..."
    downloadDir = file("...") 
}

Supply maven archetypes

First of all: great, awesome plugin! It's so much easier to develop with help of it. Thank you, man! Why it's still not a default and recommended way? 👍

And now my problem: each time I'm going to create new plugin, I have to create the structure for it, copy build.gradle from previous project, do not forget descriptors... Arhh..
I don't know whether it's a good idea and responsibility of your plugin, but it would be quite nice to provide maven archetypes for creating plugin skeleton with initial structure. Something similar to Jetbrain's, but initialized with your plugin inside.

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.