diff --git a/pom.xml b/pom.xml
index 6ab2a68d..8355db2a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
org.jenkins-ci.plugins
plugin
- 5.10
+ 6.2211.v27f680c93c53
@@ -49,6 +49,7 @@
2.2254.v2a_978de46f35
true
jenkinsci/${project.artifactId}-plugin
+ false
@@ -136,6 +137,10 @@
+
+ io.jenkins.plugins
+ commons-lang3-api
+
org.jenkins-ci.plugins
apache-httpcomponents-client-4-api
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSCloud.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSCloud.java
index d3c01f87..0ac71f53 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSCloud.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSCloud.java
@@ -52,8 +52,8 @@
import com.cloudbees.jenkins.plugins.amazonecs.pipeline.TaskTemplateMap;
import com.cloudbees.jenkins.plugins.awscredentials.AWSCredentialsHelper;
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSLauncher.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSLauncher.java
index ab4656b6..8a56d7e4 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSLauncher.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSLauncher.java
@@ -50,7 +50,7 @@
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import hudson.AbortException;
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSService.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSService.java
index 639ab136..18b60f57 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSService.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSService.java
@@ -25,7 +25,9 @@
package com.cloudbees.jenkins.plugins.amazonecs;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
+import java.util.Objects;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -56,8 +58,7 @@
import com.cloudbees.jenkins.plugins.amazonecs.aws.MaxTimeRetryStrategy;
import com.cloudbees.jenkins.plugins.awscredentials.AmazonWebServicesCredentials;
-import org.apache.commons.lang.ObjectUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import hudson.AbortException;
import hudson.slaves.SlaveComputer;
@@ -172,6 +173,11 @@ public void stopTask(String taskArn, String clusterArn) {
* If no, register a new task definition with desired parameters and returns the new TaskDefinition.
* If a TaskDefinitionOverride is set, we only look to see if the task definition exists and return it.
*/
+ @SuppressFBWarnings(
+ value = "EC_UNRELATED_TYPES",
+ justification = "Pre-existing: template tags and task definition tags are different Tag"
+ + " types, so the comparison is always false. Preserved as-is by the Commons"
+ + " Lang 3 migration; fixing it would change behaviour.")
TaskDefinition registerTemplate(final String cloudName, final ECSTaskTemplate template) {
if (template.getTaskDefinitionOverride() != null){
TaskDefinition overrideTaskDefinition = findTaskDefinition(template.getTaskDefinitionOverride());
@@ -264,7 +270,11 @@ TaskDefinition registerTemplate(final String cloudName, final ECSTaskTemplate te
final ContainerDefinition currentContainerDefinition = currentTaskDefinition.getContainerDefinitions().get(0);
final List tags = getTaskDefinitionTags(currentTaskDefinition.getTaskDefinitionArn());
- templateTagsMatchesExistingTags = ObjectUtils.equals(template.getTags(), tags);
+ // NB: these two lists hold different Tag types (ECSTaskTemplate.Tag vs the AWS SDK's
+ // Tag), so the comparison is only ever true when both are empty. That was already the
+ // case with ObjectUtils.equals — keeping it as-is here so this migration does not
+ // change behaviour. See the PR description.
+ templateTagsMatchesExistingTags = Objects.equals(template.getTags(), tags);
LOGGER.log(Level.INFO, "Match on tags: {0}", new Object[]{templateTagsMatchesExistingTags});
LOGGER.log(Level.FINE, "Match on tags: {0}; template={1}; last={2}", new Object[]{templateTagsMatchesExistingTags, template.getTags(), tags});
@@ -272,7 +282,7 @@ TaskDefinition registerTemplate(final String cloudName, final ECSTaskTemplate te
LOGGER.log(Level.INFO, "Match on container definition: {0}", new Object[]{templateMatchesExistingContainerDefinition});
LOGGER.log(Level.FINE, "Match on container definition: {0}; template={1}; last={2}", new Object[]{templateMatchesExistingContainerDefinition, def, currentContainerDefinition});
- templateMatchesExistingVolumes = ObjectUtils.equals(template.getVolumeEntries(), currentTaskDefinition.getVolumes());
+ templateMatchesExistingVolumes = Objects.equals(template.getVolumeEntries(), currentTaskDefinition.getVolumes());
LOGGER.log(Level.INFO, "Match on volumes: {0}", new Object[]{templateMatchesExistingVolumes});
LOGGER.log(Level.FINE, "Match on volumes: {0}; template={1}; last={2}", new Object[]{templateMatchesExistingVolumes, template.getVolumeEntries(), currentTaskDefinition.getVolumes()});
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplate.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplate.java
index ff91567a..5c0da2c4 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplate.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplate.java
@@ -67,8 +67,8 @@
import hudson.util.FormValidation;
import hudson.util.ListBoxModel;
import static org.apache.commons.collections.CollectionUtils.isEmpty;
-import org.apache.commons.lang.BooleanUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/BaseAWSService.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/BaseAWSService.java
index 64d11507..21921b86 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/BaseAWSService.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/BaseAWSService.java
@@ -10,7 +10,7 @@
import com.google.common.base.Joiner;
import hudson.ProxyConfiguration;
import jenkins.model.Jenkins;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/EFSService.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/EFSService.java
index 344389e2..d116d0d9 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/EFSService.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/aws/EFSService.java
@@ -43,7 +43,7 @@
import com.amazonaws.services.elasticfilesystem.model.FileSystemDescription;
import com.cloudbees.jenkins.plugins.awscredentials.AmazonWebServicesCredentials;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
* Encapsulates interactions with Amazon EFS.
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgent.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgent.java
index 30c05759..eddc2243 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgent.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgent.java
@@ -1,7 +1,7 @@
package com.cloudbees.jenkins.plugins.amazonecs.pipeline;
import com.cloudbees.jenkins.plugins.amazonecs.ECSTaskTemplate;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.jenkinsci.Symbol;
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.DeclarativeAgent;
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.DeclarativeAgentDescriptor;
diff --git a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSTaskTemplateStepExecution.java b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSTaskTemplateStepExecution.java
index 6cd8e32e..ef50acd5 100644
--- a/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSTaskTemplateStepExecution.java
+++ b/src/main/java/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSTaskTemplateStepExecution.java
@@ -7,7 +7,7 @@
import hudson.AbortException;
import hudson.slaves.Cloud;
import jenkins.model.Jenkins;
-import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
import org.jenkinsci.plugins.workflow.steps.AbstractStepExecutionImpl;
import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback;
import org.jenkinsci.plugins.workflow.steps.StepContext;
diff --git a/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript-old.groovy b/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript-old.groovy
index cd02ddaa..9fbc764f 100644
--- a/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript-old.groovy
+++ b/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript-old.groovy
@@ -28,7 +28,7 @@ import org.jenkinsci.plugins.pipeline.modeldefinition.SyntheticStageNames
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.CheckoutScript
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.DeclarativeAgentScript
import org.jenkinsci.plugins.workflow.cps.CpsScript
-import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
public class ECSDeclarativeAgentScript extends DeclarativeAgentScript {
diff --git a/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript.groovy b/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript.groovy
index d2752766..79221a7c 100644
--- a/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript.groovy
+++ b/src/main/resources/com/cloudbees/jenkins/plugins/amazonecs/pipeline/ECSDeclarativeAgentScript.groovy
@@ -28,7 +28,7 @@ import org.jenkinsci.plugins.pipeline.modeldefinition.SyntheticStageNames
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.CheckoutScript
import org.jenkinsci.plugins.pipeline.modeldefinition.agent.DeclarativeAgentScript2
import org.jenkinsci.plugins.workflow.cps.CpsScript
-import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
public class ECSDeclarativeAgentScript extends DeclarativeAgentScript2 {
diff --git a/src/test/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplateTest.java b/src/test/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplateTest.java
index f0248400..43cac19e 100644
--- a/src/test/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplateTest.java
+++ b/src/test/java/com/cloudbees/jenkins/plugins/amazonecs/ECSTaskTemplateTest.java
@@ -3,7 +3,7 @@
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
-import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.EqualsBuilder;
import java.util.ArrayList;