Giter Club home page Giter Club logo

gocd-ecs-elastic-agent's Introduction

GoCD - Amazon ECS Elastic Agent Plugin

This Elastic Agent Plugin for Amazon EC2 Container Service allows you to run elastic agents on Amazon ECS (Docker container service on AWS). The plugin takes care of spinning up and shutting down EC2 instances based on the need of your deployment pipeline, thus removing bottlenecks and reducing the cost of your agent infrastructure.

When a pipeline is triggered, GoCD sees that the jobs in the pipeline have been configured to use ECS agents, and passes on information about the configured elastic agent profiles to the plugin. The plugin, based on the user-defined configuration, decides how many EC2 instances to bring up or reuse and how many ECS elastic agents to bring up within those EC2 instances.

The settings allow you to choose the AMI to be used for the EC2 instance, the instance type, security groups, the Docker image for the ECS container and memory limits among other settings. Since the Docker image is specified as a part of the profile, provisioning software for a build, test or deploy agent becomes much easier.

Once the builds finish and the EC2 instances are idle for a while, they will be automatically scaled down and destroyed, removing the cost of running idle EC2 instances. Along with saving cost, this enables a flexible and dynamic build grid in which you don’t need to worry about configuration drift.

The set of images here explain this concept as well.

Table of Contents

Building the code base

To build the jar, run ./gradlew clean check assemble

License

Copyright 2022 Thoughtworks, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

gocd-ecs-elastic-agent's People

Contributors

alicekaerast avatar arvindsv avatar chadlwilson avatar dependabot-preview[bot] avatar dependabot[bot] avatar gradle-update-robot avatar kritika-singh3 avatar marques-work avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gocd-ecs-elastic-agent's Issues

Can't stop plugin registering spot instances

We've started seeing some extremely arbitrary behaviour with the plugin. We've set max allowed spot instances to 0 and changed all out profiles to RunAsSpotInstance: False, but GoCD keep logging spot requests that just sit there but never get jobs assigned.

Screenshot 2020-11-05 at 21 22 21

And in the logs I see:

2020-11-05 21:41:57,694 WARN [157@MessageListener for CreateAgentListener] ECSElasticPlugin:102 - The number of LINUX EC2 Spot Instances running is currently at the maximum permissible limit(5). Not requesting for any more EC2 Spot Instances. com.thoughtworks.gocd.elasticagent.ecs.exceptions.LimitExceededException: The number of LINUX EC2 Spot Instances running is currently at the maximum permissible limit(5). Not requesting for any more EC2 Spot Instances. at com.thoughtworks.gocd.elasticagent.ecs.aws.SpotInstanceService.create(SpotInstanceService.java:102) at com.thoughtworks.gocd.elasticagent.ecs.aws.TaskHelper.create(TaskHelper.java:80) at com.thoughtworks.gocd.elasticagent.ecs.ECSTasks.create(ECSTasks.java:69) at com.thoughtworks.gocd.elasticagent.ecs.executors.CreateAgentRequestExecutor.execute(CreateAgentRequestExecutor.java:63) at com.thoughtworks.gocd.elasticagent.ecs.ECSElasticPlugin.handle(ECSElasticPlugin.java:99) at com.thoughtworks.go.plugin.infra.DefaultPluginManager.lambda$submitTo$0(DefaultPluginManager.java:134) at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.executeActionOnTheService(FelixGoPluginOSGiFramework.java:208) at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.doOn(FelixGoPluginOSGiFramework.java:164) at com.thoughtworks.go.plugin.infra.DefaultPluginManager.submitTo(DefaultPluginManager.java:131) at com.thoughtworks.go.plugin.access.PluginRequestHelper.submitRequest(PluginRequestHelper.java:49) at com.thoughtworks.go.plugin.access.elastic.v5.ElasticAgentExtensionV5.createAgent(ElasticAgentExtensionV5.java:141) at com.thoughtworks.go.plugin.access.elastic.ElasticAgentExtension.createAgent(ElasticAgentExtension.java:59) at com.thoughtworks.go.plugin.access.elastic.ElasticAgentPluginRegistry.createAgent(ElasticAgentPluginRegistry.java:42) at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:31) at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:21) at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.runImpl(JMSMessageListenerAdapter.java:83) at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.run(JMSMessageListenerAdapter.java:63) at java.base/java.lang.Thread.run(Unknown Source)

Which is extremely strange because as I say I've explicitly set max spot instances to 0 and turned off RunAsSpotInstance for every elastic profile..

ecs Agent plugin Java version on 21.2

I see that the Java version for GoCD has been upgraded to Java 15:
gocd/gocd#9086

I'm not sure what's going on, but it looks like the agent it's downloading from the server is Java 15, but the bundled version is 11?

[Mon Apr 12 08:49:20 UTC 2021] GoCD Version: 21.2.0-12498
[Mon Apr 12 08:49:20 UTC 2021] Java Version: 11.0.5
[Mon Apr 12 08:49:20 UTC 2021] Operating System: Linux(4.14.225-169.362.amzn2.x86_64)

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/thoughtworks/go/agent/AgentMain has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 55.0

I've upgraded the version of Java on the instance to 15, so can only assume this is a bundled version that hasn't been updated?

[ec2-user@ip-10-1-25-224 ~]$ java -version
openjdk version "15.0.2" 2021-01-19
OpenJDK Runtime Environment Corretto-15.0.2.7.1 (build 15.0.2+7)
OpenJDK 64-Bit Server VM Corretto-15.0.2.7.1 (build 15.0.2+7, mixed mode, sharing)

Use of c6g instances?

Hi!

We're running GoCD in AWS on a C5 instance. I tried configuring an Elastic profile to use a c6g instance and an ARM AMI, but when I look at the task in ECS I see the following message:

standard_init_linux.go:211: exec user process caused "exec format error"

Assuming these instances aren't supported, or is there a way of using them?

Thanks,

Neil

Support encryption of EBS volumes

There is currently no option to enable the encryption of EBS volumes created by this plugin. This makes security teams unhappy.

Adding an option to encrypt EBS volumes with either the aws/ebs KMS key or a customer managed key would make this better, and doesn't sound like it should be too difficult to implement.

I have considered setting account-wide default encryption to mitigate this, but that causes problems when building AMIs to be shared across multiple accounts

Stuck on waiting for an agent

Multiple stages from different pipelines that uses the same elastic-profile stuck on waiting for an agent.

The logs are:

[go] Received a request to create an agent for the job: [Prod-N/180/Build_Test_Push_Prod/2/Build_Test_Client_CF]
[go] No running instance(s) found to build the ECS Task to perform current job.
[go] The elastic agent profile is configured to run on a spot instance. Initiating steps to request for a spot instance.
[go] There is an open spot request matching the profile, not requesting for a new spot instance.
[go] Received a request to create an agent for the job: [Prod-N/180/Build_Test_Push_Prod/2/Build_Test_Client_CF]
[go] No running instance(s) found to build the ECS Task to perform current job.
[go] The elastic agent profile is configured to run on a spot instance. Initiating steps to request for a spot instance.
[go] There is an open spot request matching the profile, not requesting for a new spot instance.
[go] Received a request to create an agent for the job: [Prod-N/180/Build_Test_Push_Prod/2/Build_Test_Client_CF]
[go] No running instance(s) found to build the ECS Task to perform current job.
[go] The elastic agent profile is configured to run on a spot instance. Initiating steps to request for a spot instance.
[go] There is an open spot request matching the profile, not requesting for a new spot instance.
[go] Received a request to create an agent for the job: [Prod-N/180/Build_Test_Push_Prod/2/Build_Test_Client_CF]
[go] No running instance(s) found to build the ECS Task to perform current job.
[go] The elastic agent profile is configured to run on a spot instance. Initiating steps to request for a spot instance.
[go] There is an open spot request matching the profile, not requesting for a new spot instance.

GoCD version: 21.2.0
Plugin version: 7.2.1-278

Find way to avoid recommending iam:PassRole along with ec2:RunInstances permissions

Currently the plugin recommends the need to grant both these permissions so the plugin can launch instances, and I believe otherwise manage ECS tasks.

This makes the role given to the ECS plugin a combination which can support privilege escalation, as theoretically the plugin could escalate privileges by launching an instance with an arbitrary existing role.

This is summarised somewhat at https://www.tenable.com/blog/auditing-iampassrole-a-problematic-privilege-escalation-permission but will be highlighted by some AWS-aware security tooling.

There is probably a need to audit usage and figure out how to lock down the permission to specific target services and ideally roles that can be passed, so the recommended default is more minimal.

https://gist.github.com/noamsdahan/928aafbcca71f95b07472f22e35dc93c may be interesting in highlighting the pieces of the plugin that may need to pass roles (ecs and ec2) in particular.

Things ECS plugin does that might need this:

  • ec2:RunInstances with IamInstanceProfile (can be configured on cluster profile)
  • ec2:RequestSpotInstances with IamInstanceProfile (can be configured on cluster profile)
  • ecs:RegisterTaskDefinition with taskRoleArn (can be configured on cluster profile)

Other notes

  • The IamInstanceProfile for instances passed is the one within Cluster profile configuration. It has some bare minimum permissions to work with ECS but can be user customised. Perhaps the docs could suggest a specific role
  • The TaskRoleArn for tasks passed are the ones within Elastic profile configs. This is optional to be used.

Something like this is better and probably enough:

ManageEC2Instances:

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"ec2:runInstances",
				"ec2:createTags",
				"ec2:terminateInstances",
				"ec2:describeInstances",
				"ec2:describeSubnets",
				"ec2:stopInstances",
				"ec2:startInstances",
				"ec2:deleteTags",
				"ec2:createVolume",
				"ec2:attachVolume",
				"ec2:requestSpotInstances",
				"ec2:describeSpotInstanceRequests"
			],
			"Resource": [
				"*"
			],
			"Effect": "Allow"
		},
		{
			"Effect": "Allow",
			"Action": "iam:PassRole",
			"Resource": [ # <-- List of IAM roles I want to use as instance profile(s) for various cluster profiles (or use wildcards)
                        	"arn:aws:iam::123456789:role/build-gocd-GoCDEC2OptimizedRole-1C4661VGY8YE"
			],
			"Condition": {
				"StringEquals": {
					"iam:PassedToService": [
						"ec2.amazonaws.com"
					]
				}
			}
		}
	]
}

ManageECSInstances:

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"ecs:DescribeClusters",
				"ecs:DeregisterContainerInstance",
				"ecs:DescribeContainerInstances",
				"ecs:ListContainerInstances",
				"ecs:RegisterTaskDefinition",
				"ecs:DeregisterTaskDefinition",
				"ecs:DeleteTaskDefinitions",
				"ecs:StartTask",
				"ecs:StopTask",
				"ecs:ListTasks",
				"ecs:DescribeTasks",
				"ecs:DescribeTaskDefinition"
			],
			"Resource": [
				"*"
			],
			"Effect": "Allow"
		},
		{
			"Effect": "Allow",
			"Action": "iam:PassRole",
			"Resource": [ # <-- List of IAM roles I want to give as task-role-arns on elastic profiles when launching various agents (or use wildcards)
                        ],
			"Condition": {
				"StringEquals": {
					"iam:PassedToService": [
						"ecs.amazonaws.com"
					]
				}
			}
		}
	]
}

Problem creating AWS spot instances, "findSubnetWithMinimumInstances" and "no cookie set"

Hi,

I've got a problem I'm seeing and I wondered if anyone here could shed any light on it, please?

I was working with GoCD 19.8.0 until last week, then I upgraded to 20.4.0, 20.5.0 and now 20.8.0. I'm using v7.0.0.4 of the plugin "com.thoughtworks.gocd.elastic-agent.ecs", it states it's target version is 19.3.0 but it's the latest version so hopefully compatible with the latest gocd version.

Before I upgraded the gocd server version last week (and started using a postgres db in the process), the gocd-ecs-elastic-agent plugin was working pretty perfectly.

After the upgrade, it's doing a couple of strange things.

I'm seeing errors like, when trying to get an AWS C5d.4xlarge EC2 Spot Request going through the ECS elastic agent plugin (redacted):

jvm 1 | 2020-11-18 22:58:21,052 INFO [154@MessageListener for CreateAgentListener] p.c.t.g.e.e.c.t.g.e.e.ECSElasticPlugin:92 [plugin-com.thoughtworks.gocd.elastic-agent.ecs] - [create-agent] For Platform: 'LINUX',All-Registered-Spot-Instances count: '0', Spot-Requests-Without-Registered-Instances count: '0',UnTagged-Spot-Requests count: '0' jvm 1 | 2020-11-18 22:58:21,214 ERROR [154@MessageListener for CreateAgentListener] p.c.t.g.e.e.c.t.g.e.e.ECSElasticPlugin:127 [plugin-com.thoughtworks.gocd.elastic-agent.ecs] - [create-agent] Failed to create an agent for profile : {"Image":"<gocd-docker-image>","Command":"","Environment":"","MaxMemory":"20G","ReservedMemory":"20G","CPU":"0","MountDockerSocket":"true","Privileged":"true","TaskRoleArn":"arn:aws:iam::1234567890:role/gocd-agents-ops-role","AMI":"ami-XXXXXXXXX","InstanceType":"c5d.4xlarge","SubnetIds":"subnet-XXXXXXXX","SecurityGroupIds":"sg-XXXXXXXX","IAMInstanceProfile":"gocd-agents-ops-profile","Platform":"linux","BindMount":"[\n {\n \"Name\": \"homego\",\n \"SourcePath\": \"/efs\",\n \"ContainerPath\": \"/home/go\"\n }\n]","RunAsSpotInstance":true,"SpotPrice":"0.48","SpotRequestExpiresAfter":"5"} jvm 1 | java.util.NoSuchElementException: null jvm 1 | at java.base/java.util.HashMap$HashIterator.nextNode(Unknown Source) jvm 1 | at java.base/java.util.HashMap$EntryIterator.next(Unknown Source) jvm 1 | at java.base/java.util.HashMap$EntryIterator.next(Unknown Source) jvm 1 | at java.base/java.util.Collections.min(Unknown Source) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.SubnetSelector.findSubnetWithMinimumInstances(SubnetSelector.java:54) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.SubnetSelector.selectSubnetWithMinimumEC2Instances(SubnetSelector.java:46) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.SpotInstanceHelper.requestSpotInstanceRequest(SpotInstanceHelper.java:77) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.SpotInstanceService.create(SpotInstanceService.java:108) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.TaskHelper.create(TaskHelper.java:80) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.ECSTasks.create(ECSTasks.java:69) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.executors.CreateAgentRequestExecutor.execute(CreateAgentRequestExecutor.java:63) jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.ECSElasticPlugin.handle(ECSElasticPlugin.java:99) jvm 1 | at com.thoughtworks.go.plugin.infra.DefaultPluginManager.lambda$submitTo$0(DefaultPluginManager.java:134) jvm 1 | at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.executeActionOnTheService(FelixGoPluginOSGiFramework.java:208) jvm 1 | at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.doOn(FelixGoPluginOSGiFramework.java:164) jvm 1 | at com.thoughtworks.go.plugin.infra.DefaultPluginManager.submitTo(DefaultPluginManager.java:131) jvm 1 | at com.thoughtworks.go.plugin.access.PluginRequestHelper.submitRequest(PluginRequestHelper.java:49) jvm 1 | at com.thoughtworks.go.plugin.access.elastic.v5.ElasticAgentExtensionV5.createAgent(ElasticAgentExtensionV5.java:141) jvm 1 | at com.thoughtworks.go.plugin.access.elastic.ElasticAgentExtension.createAgent(ElasticAgentExtension.java:59) jvm 1 | at com.thoughtworks.go.plugin.access.elastic.ElasticAgentPluginRegistry.createAgent(ElasticAgentPluginRegistry.java:42) jvm 1 | at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:31) jvm 1 | at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:21) jvm 1 | at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.runImpl(JMSMessageListenerAdapter.java:83) jvm 1 | at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.run(JMSMessageListenerAdapter.java:63) jvm 1 | at java.base/java.lang.Thread.run(Unknown Source)

I'm using only one subnet in that elastic agent configuration (although I was, until today, using two subnets in the form of
,
so, as it currently stands, using just one subnet, it shouldn't be trying to check for which subnet has the least agents in it as it's been told to only look at one of them?

Also, I'm seeing this new log entry set floating around in the logs which means little to me:

jvm 1 | 2020-11-18 23:02:21,100 INFO [qtp247343347-91286] AgentRegistrationController:270 - [Agent Auto Registration] Auto registering agent with uuid 8a41eea9-cf84-4564-b0b1-c67cf35c60e8 jvm 1 | 2020-11-18 23:02:21,107 INFO [155@MessageListener for CreateAgentListener] p.c.t.g.e.e.c.t.g.e.e.ECSElasticPlugin:72 [plugin-com.thoughtworks.gocd.elastic-agent.ecs] - [create-agent] No running instances found to build container with profile {"Image":"480569139359.dkr.ecr.eu-west-2.amazonaws.com/gocd-agents-ops-service-repository","Command":"","Environment":"","MaxMemory":"20G","ReservedMemory":"20G","CPU":"0","MountDockerSocket":"true","Privileged":"true","TaskRoleArn":"arn:aws:iam::1234567890:role/gocd-agents-ops-role","AMI":"ami-XXXXXXXX","InstanceType":"c5d.4xlarge","SubnetIds":"subnet-XXXXXXXX","SecurityGroupIds":"sg-XXXXXXXX","IAMInstanceProfile":"gocd-agents-ops-profile","Platform":"linux","BindMount":"[\n {\n \"Name\": \"homego\",\n \"SourcePath\": \"/efs\",\n \"ContainerPath\": \"/home/go\"\n }\n]","RunAsSpotInstance":true,"SpotPrice":"0.48","SpotRequestExpiresAfter":"5"} jvm 1 | 2020-11-18 23:02:21,388 WARN [qtp247343347-85020] AgentService:539 - Agent [Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8, null]] has no cookie set jvm 1 | 2020-11-18 23:02:21,388 ERROR [qtp247343347-85020] BuildRepositoryRemoteImpl:59 - Error occurred in com.thoughtworks.go.server.service.ElasticAgentRuntimeInfo@7e549d6[elasticAgentId=GoCDa6528ce340204c54b8fcac556edbe215,elasticPluginId=com.thoughtworks.gocd.elastic-agent.ecs,identifier=Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8],runtimeStatus=Idle,buildingInfo=AgentBuildingInfo[, ],location=/go,usableSpace=26689011712,operatingSystemName=Ubuntu 18.04 bionic,agentBootstrapperVersion=UNKNOWN,agentVersion=20.8.0-12213,cookie=<null>] ping. jvm 1 | com.thoughtworks.go.server.service.AgentNoCookieSetException: Agent [Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8, null]] has no cookie set jvm 1 | at com.thoughtworks.go.server.service.AgentService.bombIfAgentDoesNotHaveCookie(AgentService.java:540) jvm 1 | at com.thoughtworks.go.server.service.AgentService.updateRuntimeInfo(AgentService.java:232) jvm 1 | at com.thoughtworks.go.remote.BuildRepositoryRemoteImpl.ping(BuildRepositoryRemoteImpl.java:52) jvm 1 | at com.thoughtworks.go.server.messaging.BuildRepositoryMessageProducer.ping(BuildRepositoryMessageProducer.java:44) jvm 1 | at jdk.internal.reflect.GeneratedMethodAccessor491.invoke(Unknown Source) jvm 1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) jvm 1 | at java.base/java.lang.reflect.Method.invoke(Unknown Source) jvm 1 | at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) jvm 1 | at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:78) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) jvm 1 | at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) jvm 1 | at com.sun.proxy.$Proxy118.ping(Unknown Source) jvm 1 | at jdk.internal.reflect.GeneratedMethodAccessor769.invoke(Unknown Source) jvm 1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) jvm 1 | at java.base/java.lang.reflect.Method.invoke(Unknown Source) jvm 1 | at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:212) jvm 1 | at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:39) jvm 1 | at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78) jvm 1 | at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:114) jvm 1 | at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80) jvm 1 | at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51) jvm 1 | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) jvm 1 | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) jvm 1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) jvm 1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) jvm 1 | at org.eclipse.jetty.servlet.ServletHolder$NotAsyncServlet.service(ServletHolder.java:1395) jvm 1 | at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617) jvm 1 | at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) jvm 1 | at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) jvm 1 | at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) jvm 1 | at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.web.FlashLoadingFilter.doFilterInternal(FlashLoadingFilter.java:38) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.DenyIfRefererIsNotFilesFilter.doFilterInternal(DenyIfRefererIsNotFilesFilter.java:52) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.VerifyAuthorityFilter.doFilterInternal(VerifyAuthorityFilter.java:57) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AbstractUserEnabledCheckFilter.doFilterInternal(AbstractUserEnabledCheckFilter.java:66) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.ThreadLocalUserFilter.doFilterInternal(ThreadLocalUserFilter.java:41) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AgentAuthenticationFilter.tokenBasedFilter(AgentAuthenticationFilter.java:103) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AgentAuthenticationFilter.doFilterInternal(AgentAuthenticationFilter.java:65) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AlwaysCreateSessionFilter.doFilterInternal(AlwaysCreateSessionFilter.java:40) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.ModeAwareFilter.doFilter(ModeAwareFilter.java:79) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.web.BackupFilter.doFilterInternal(BackupFilter.java:79) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) jvm 1 | at com.thoughtworks.go.server.newsecurity.filterchains.MainFilterChain.doFilter(MainFilterChain.java:79) jvm 1 | at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347) jvm 1 | at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) jvm 1 | at com.thoughtworks.go.server.web.DefaultHeadersFilter.doFilter(DefaultHeadersFilter.java:51) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1596) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) jvm 1 | at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:767) jvm 1 | at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590) jvm 1 | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) jvm 1 | at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1610) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1300) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) jvm 1 | at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1580) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1215) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221) jvm 1 | at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) jvm 1 | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) jvm 1 | at org.eclipse.jetty.server.Server.handle(Server.java:500) jvm 1 | at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) jvm 1 | at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) jvm 1 | at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) jvm 1 | at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273) jvm 1 | at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) jvm 1 | at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) jvm 1 | at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) jvm 1 | at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375) jvm 1 | at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) jvm 1 | at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) jvm 1 | at java.base/java.lang.Thread.run(Unknown Source) jvm 1 | 2020-11-18 23:02:21,401 WARN [qtp247343347-85020] RemoteInvocationTraceInterceptor:88 - Processing of HttpInvokerServiceExporter remote call resulted in fatal exception: com.thoughtworks.go.remote.BuildRepositoryRemote.ping jvm 1 | org.springframework.remoting.RemoteAccessException: Agent [Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8, null]] has no cookie set; nested exception is com.thoughtworks.go.server.service.AgentNoCookieSetException: Agent [Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8, null]] has no cookie set jvm 1 | at com.thoughtworks.go.remote.BuildRepositoryRemoteImpl.wrappedException(BuildRepositoryRemoteImpl.java:119) jvm 1 | at com.thoughtworks.go.remote.BuildRepositoryRemoteImpl.ping(BuildRepositoryRemoteImpl.java:60) jvm 1 | at com.thoughtworks.go.server.messaging.BuildRepositoryMessageProducer.ping(BuildRepositoryMessageProducer.java:44) jvm 1 | at jdk.internal.reflect.GeneratedMethodAccessor491.invoke(Unknown Source) jvm 1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) jvm 1 | at java.base/java.lang.reflect.Method.invoke(Unknown Source) jvm 1 | at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) jvm 1 | at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:78) jvm 1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) jvm 1 | at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) jvm 1 | at com.sun.proxy.$Proxy118.ping(Unknown Source) jvm 1 | at jdk.internal.reflect.GeneratedMethodAccessor769.invoke(Unknown Source) jvm 1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) jvm 1 | at java.base/java.lang.reflect.Method.invoke(Unknown Source) jvm 1 | at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:212) jvm 1 | at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:39) jvm 1 | at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78) jvm 1 | at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:114) jvm 1 | at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80) jvm 1 | at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51) jvm 1 | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) jvm 1 | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) jvm 1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) jvm 1 | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) jvm 1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) jvm 1 | at org.eclipse.jetty.servlet.ServletHolder$NotAsyncServlet.service(ServletHolder.java:1395) jvm 1 | at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617) jvm 1 | at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) jvm 1 | at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) jvm 1 | at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) jvm 1 | at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.web.FlashLoadingFilter.doFilterInternal(FlashLoadingFilter.java:38) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.DenyIfRefererIsNotFilesFilter.doFilterInternal(DenyIfRefererIsNotFilesFilter.java:52) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.VerifyAuthorityFilter.doFilterInternal(VerifyAuthorityFilter.java:57) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AbstractUserEnabledCheckFilter.doFilterInternal(AbstractUserEnabledCheckFilter.java:66) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.ThreadLocalUserFilter.doFilterInternal(ThreadLocalUserFilter.java:41) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AgentAuthenticationFilter.tokenBasedFilter(AgentAuthenticationFilter.java:103) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AgentAuthenticationFilter.doFilterInternal(AgentAuthenticationFilter.java:65) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.AlwaysCreateSessionFilter.doFilterInternal(AlwaysCreateSessionFilter.java:40) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.newsecurity.filters.ModeAwareFilter.doFilter(ModeAwareFilter.java:79) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at com.thoughtworks.go.server.web.BackupFilter.doFilterInternal(BackupFilter.java:79) jvm 1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) jvm 1 | at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) jvm 1 | at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) jvm 1 | at com.thoughtworks.go.server.newsecurity.filterchains.MainFilterChain.doFilter(MainFilterChain.java:79) jvm 1 | at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347) jvm 1 | at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) jvm 1 | at com.thoughtworks.go.server.web.DefaultHeadersFilter.doFilter(DefaultHeadersFilter.java:51) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1596) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) jvm 1 | at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:767) jvm 1 | at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590) jvm 1 | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) jvm 1 | at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1610) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1300) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) jvm 1 | at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) jvm 1 | at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1580) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1215) jvm 1 | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) jvm 1 | at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221) jvm 1 | at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) jvm 1 | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) jvm 1 | at org.eclipse.jetty.server.Server.handle(Server.java:500) jvm 1 | at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) jvm 1 | at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) jvm 1 | at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) jvm 1 | at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273) jvm 1 | at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) jvm 1 | at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) jvm 1 | at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) jvm 1 | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) jvm 1 | at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375) jvm 1 | at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) jvm 1 | at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) jvm 1 | at java.base/java.lang.Thread.run(Unknown Source) jvm 1 | Caused by: com.thoughtworks.go.server.service.AgentNoCookieSetException: Agent [Agent [ea4f74712f3b, 172.18.0.2, 8a41eea9-cf84-4564-b0b1-c67cf35c60e8, null]] has no cookie set jvm 1 | at com.thoughtworks.go.server.service.AgentService.bombIfAgentDoesNotHaveCookie(AgentService.java:540) jvm 1 | at com.thoughtworks.go.server.service.AgentService.updateRuntimeInfo(AgentService.java:232) jvm 1 | at com.thoughtworks.go.remote.BuildRepositoryRemoteImpl.ping(BuildRepositoryRemoteImpl.java:52) jvm 1 | ... 131 common frames omitted

I can't see anything useful on the web about that error, just a gocd-gitter comment or two after a few hours of googling, and even less about the first error.

Is anyone else seeing these problems? If anyone could shed any light on what is causing these, if it's a misconfiguration onh my part etc, it'd be greatly appreciated.

Thanks!

Steve

Job scheuduled but never runs, stuck in loop

I have a job that get scheduled on an agent but never runs:

[go] Found existing running container instance platform matching ECS Task instance configuration. Not starting a new EC2 instance...
[go] Registering ECS Task definition with cluster...
[go] Done registering ECS Task definition with cluster.
[go] Starting ECS Task to perform current job...
[go] [WARNING] The ECS task is scheduled on a Spot Instance. A spot instance termination would re-schedule the job.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] An ECS task to perform current job is already scheduled on instance i-0c36ab47a8fc996d0. Skipping current create agent request.
[go] Received a request to create an agent for the job: [balenciaga-build-docker-images/10/build/1/docker-build]
[go] Found existing running container instance platform matching ECS Task instance configuration. Not starting a new EC2 instance...```

I've tried manually terminating the task on ECS, killing instances - Nothing works.

Unable to start GoCD tasks

ECS Plugin version is 7.0.0-4.
GoCD version 19.10.0.

The ECS task cannot be created. Here is the log from GoCD server.

[create-agent] Creating agent with profile {"Image":"tools/gocd-agent:latest","Command":"","Environment":"AGENT_AUTO_REGISTER_RESOURCES\u003dgeneralservices-agents","MaxMemory":"512M","ReservedMemory":"128M","CPU":"1024","MountDockerSocket":"true","Privileged":"","TaskRoleArn":"arn:aws:iam::account_id:role/GoCDECSAgentGeneralServices","AMI":"","InstanceType":"","SubnetIds":"","SecurityGroupIds":"","IAMInstanceProfile":"","Platform":"linux","BindMount":"","RunAsSpotInstance":false,"SpotPrice":"","SpotRequestExpiresAfter":""}
jvm 1 | 2021-10-01 03:20:39,380 INFO [172@MessageListener for CreateAgentListener] p.c.t.g.e.e.c.t.g.e.e.ECSElasticPlugin:72 [plugin-com.thoughtworks.gocd.elastic-agent.ecs] - [create-agent] Adding /var/run/docker.sock to task configuration.
jvm 1 | 2021-10-01 03:20:39,633 ERROR [172@MessageListener for CreateAgentListener] p.c.t.g.e.e.c.t.g.e.e.ECSElasticPlugin:127 [plugin-com.thoughtworks.gocd.elastic-agent.ecs] - [create-agent] Failed to create an agent for profile : {"Image":"tools/gocd-agent:latest","Command":"","Environment":"AGENT_AUTO_REGISTER_RESOURCES\u003dgeneralservices-agents","MaxMemory":"512M","ReservedMemory":"128M","CPU":"1024","MountDockerSocket":"true","Privileged":"","TaskRoleArn":"arn:aws:iam::account_id:role/GoCDECSAgentGeneralServices","AMI":"","InstanceType":"","SubnetIds":"","SecurityGroupIds":"","IAMInstanceProfile":"","Platform":"linux","BindMount":"","RunAsSpotInstance":false,"SpotPrice":"","SpotRequestExpiresAfter":""}
jvm 1 | com.thoughtworks.gocd.elasticagent.ecs.exceptions.ContainerFailedToRegisterException: Fail to start task GoCD6f734013fdf243df823a76374b080b72:
jvm 1 | arn:aws:ecs:ap-southeast-1:account_id:container-instance/c034fb3fa8114d869466f3eb9cec40f0 failed with reason :ATTRIBUTE
jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.aws.TaskHelper.create(TaskHelper.java:121)
jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.ECSTasks.create(ECSTasks.java:69)
jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.executors.CreateAgentRequestExecutor.execute(CreateAgentRequestExecutor.java:63)
jvm 1 | at com.thoughtworks.gocd.elasticagent.ecs.ECSElasticPlugin.handle(ECSElasticPlugin.java:99)

I also enabled debug logging but it doesn't work. Here is my GoCD server config

"Config": {
            "Hostname": "d3172c2b7e4a",
            "Domainname": "",
            "User": "go",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8153/tcp": {},
                "8154/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "GOCD_SERVER_JVM_OPTIONS=-Dplugin.com.thoughtworks.gocd.elastic-agent.ecs.log.level=debug",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=en_US.UTF-8",
                "LANGUAGE=en_US:en",
                "LC_ALL=en_US.UTF-8",
                "GO_JAVA_HOME=/gocd-jre"
            ],
            "Cmd": null,
            "Image": "account_id.dkr.ecr.ap-southeast-1.amazonaws.com/tools/gocd-server:latest",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "com.datadoghq.ad.logs": "[{\"sourcecategory\": \"sourcecode\", \"source\": \"java\", \"service\": \"gocd-server\"}]",
                "description": "GoCD server based on alpine version 3.9",
                "gocd.full.version": "19.10.0-10357",
                "gocd.git.sha": "44d61cc733a94287979f1fb99583d69139f386e4",
                "gocd.version": "19.10.0",
                "maintainer": "ThoughtWorks, Inc. <[email protected]>",
                "url": "https://www.gocd.org"
            }
}

The task role allowed ECS assume role.

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

The container register permission also allowed.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowGoCDECSAgentManageECS",
            "Effect": "Allow",
            "Action": [
                "ecs:submitTaskStateChange",
                "ecs:submitContainerStateChange",
                "ecs:startTelemetrySession",
                "ecs:registerContainerInstance",
                "ecs:poll",
                "ecs:discoverPollEndpoint",
                "ecs:describeClusters",
                "ecs:deregisterContainerInstance"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowGoCDECSAgentManageCloudWatch",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:*:account_id:log-group:/aws/ecs/gocd:*"
        }
    ]
}

Unable to set custom tags for ec2 container instances

Trying to use the plugin within an organisation which has policies that auto terminate ec2 instances that don't have mandatory tags. Hoping to have an option in the cluster profile to be able to add custom tags for ec2 container instances.

Current workaround for doing this is with a lambda function. Whilst the solution works, it is far from ideal for a simple problem.

https://blog.doit-intl.com/automatically-tag-aws-ec2-instances-and-volumes-753dcaa7d7b0

Build fails with IAM issues

I'm trying to build this plugin.

When I run ./gradlew clean check assemble it errors with:

> There were failing tests. See the report at: file:///home/ubuntu/gocd-ecs-elastic-agent/build/reports/tests/test/index.html
Looking in that file I see:

Failed tests

  • AWSCredentialsProviderChainTest. shouldErrorOutIfItFailsToLoadCredentials()

Turning on the debug I see it failing to get creds from the Envitonment. But I have set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to values for a user who has full access to most of AWS including ec2, iam,ecs and logs which are the things specified here https://extensions-docs.gocd.org/ecs/current/prerequisites/

Am I missing something obvious?

What is actually failing here, is it not finding the ENV set in the shell, which shows up correctly when I run env? Or is it some kind of permission I need. Is there an easy way to test that?

Overriding NVMe storage on supported instances

I've configured my cluster to use c5d.2xlarge instances, which come with a 200Gb NVMe drive attached, but don't see a way of utilising it as an ECS agent - When it boots it does so with a 30Gb EBS volume.

Is there a way of having the plugin utilise the NVMe volume?

NoSuchElementException when trying to create spot instance during findSubnetWithMinimumInstances

Not sure of the root cause here, but discovered on build.gocd.org.

  • two ECS Clusters and configurations
  • Cluster A has 2 instances in it which are currently alive, but idle
  • Plugin is being asked to create agents and new instances in cluster B which has no instances
  • Problem resolved itself after the instances in cluster A were terminated (probably because instances become empty).

Plugin Version 7.0.0-4

Presumably instancesPerSubnet is somehow empty...

2022-02-06 13:02:21,696 ERROR [170@MessageListener for CreateAgentListener] ECSElasticPlugin:127 - [create-agent] Failed to create an agent for profile : {"Image":"docker.gocd.io/gocddev/gocd-dev-build:centos-8-v3.3.3","Command":"","Environment":"TZ\u003dUS/Pacific\nJAVA_VERSION\u003d17","MaxMemory":"10G","ReservedMemory":"8G","CPU":"0","MountDockerSocket":"false","Privileged":"false","TaskRoleArn":"","AMI":"","InstanceType":"","SubnetIds":"","SecurityGroupIds":"","IAMInstanceProfile":"","Platform":"linux","BindMount":"","RunAsSpotInstance":true,"SpotPrice":"","SpotRequestExpiresAfter":""}
java.util.NoSuchElementException: null
        at java.base/java.util.HashMap$HashIterator.nextNode(Unknown Source)
        at java.base/java.util.HashMap$EntryIterator.next(Unknown Source)
        at java.base/java.util.HashMap$EntryIterator.next(Unknown Source)
        at java.base/java.util.Collections.min(Unknown Source)
        at com.thoughtworks.gocd.elasticagent.ecs.aws.SubnetSelector.findSubnetWithMinimumInstances(SubnetSelector.java:54)
        at com.thoughtworks.gocd.elasticagent.ecs.aws.SubnetSelector.selectSubnetWithMinimumEC2Instances(SubnetSelector.java:46)
        at com.thoughtworks.gocd.elasticagent.ecs.aws.SpotInstanceHelper.requestSpotInstanceRequest(SpotInstanceHelper.java:77)
        at com.thoughtworks.gocd.elasticagent.ecs.aws.SpotInstanceService.create(SpotInstanceService.java:108)
        at com.thoughtworks.gocd.elasticagent.ecs.aws.TaskHelper.create(TaskHelper.java:80)
        at com.thoughtworks.gocd.elasticagent.ecs.ECSTasks.create(ECSTasks.java:69)
        at com.thoughtworks.gocd.elasticagent.ecs.executors.CreateAgentRequestExecutor.execute(CreateAgentRequestExecutor.java:63)
        at com.thoughtworks.gocd.elasticagent.ecs.ECSElasticPlugin.handle(ECSElasticPlugin.java:99)
        at com.thoughtworks.go.plugin.infra.DefaultPluginManager.lambda$submitTo$0(DefaultPluginManager.java:134)
        at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.executeActionOnTheService(FelixGoPluginOSGiFramework.java:208)
        at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.doOn(FelixGoPluginOSGiFramework.java:164)
        at com.thoughtworks.go.plugin.infra.DefaultPluginManager.submitTo(DefaultPluginManager.java:131)
        at com.thoughtworks.go.plugin.access.PluginRequestHelper.submitRequest(PluginRequestHelper.java:49)
        at com.thoughtworks.go.plugin.access.elastic.v5.ElasticAgentExtensionV5.createAgent(ElasticAgentExtensionV5.java:141)
        at com.thoughtworks.go.plugin.access.elastic.ElasticAgentExtension.createAgent(ElasticAgentExtension.java:59)
        at com.thoughtworks.go.plugin.access.elastic.ElasticAgentPluginRegistry.createAgent(ElasticAgentPluginRegistry.java:42)
        at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:31)
        at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:21)
        at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.runImpl(JMSMessageListenerAdapter.java:83)
        at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.run(JMSMessageListenerAdapter.java:63)
        at java.base/java.lang.Thread.run(Unknown Source)

deployment within a VPC

Hi I'm attempting to get this plugin working within a VPC. Is there any way to deploy this plugin within a VPC? IS there any example of setup via AWS CDK?

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.