From 9810d13a9b8292653914793cb70d0b63b2340dfc Mon Sep 17 00:00:00 2001 From: cheerfyt Date: Tue, 26 May 2020 21:42:29 +0800 Subject: [PATCH 1/3] fix(resultOverview): fix resolve empty result overview from log --- pom.xml | 2 +- .../plugins/worktile/MemoryTokenStore.java | 32 +-- .../io/jenkins/plugins/worktile/WTHelper.java | 39 ++-- .../worktile/resolver/WorkItemResolver.java | 195 +++++++++--------- .../plugins/worktile/WTHelperTest.java | 54 +++-- 5 files changed, 153 insertions(+), 169 deletions(-) diff --git a/pom.xml b/pom.xml index 46b1e71..9fbab0d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ io.jenkins.plugins worktile - 1.1.2-SNAPSHOT + 1.1.3-SNAPSHOT hpi Worktile Plugin diff --git a/src/main/java/io/jenkins/plugins/worktile/MemoryTokenStore.java b/src/main/java/io/jenkins/plugins/worktile/MemoryTokenStore.java index a2f6cbf..8d94e47 100644 --- a/src/main/java/io/jenkins/plugins/worktile/MemoryTokenStore.java +++ b/src/main/java/io/jenkins/plugins/worktile/MemoryTokenStore.java @@ -7,23 +7,25 @@ public class MemoryTokenStore { - public static final Map store = new HashMap<>(); + protected static final Map store = new HashMap<>(); - public static boolean put(String clientId, String clientSecret, WTTokenEntity entity) { - try { - String key = WTHelper.md5(clientId + clientSecret); - return store.put(key, entity) != null; - } catch (Exception e) { - return false; + public static boolean put(String clientId, String clientSecret, WTTokenEntity entity) { + try { + String key = WTHelper.md5(clientId + clientSecret); + return store.put(key, entity) != null; + } + catch(Exception e) { + return false; + } } - } - public static WTTokenEntity get(String clientId, String clientSecret) { - try { - String key = WTHelper.md5(clientId + clientSecret); - return store.get(key); - } catch (Exception exception) { - return null; + public static WTTokenEntity get(String clientId, String clientSecret) { + try { + String key = WTHelper.md5(clientId + clientSecret); + return store.get(key); + } + catch(Exception exception) { + return null; + } } - } } diff --git a/src/main/java/io/jenkins/plugins/worktile/WTHelper.java b/src/main/java/io/jenkins/plugins/worktile/WTHelper.java index e5cdfe8..069b18e 100644 --- a/src/main/java/io/jenkins/plugins/worktile/WTHelper.java +++ b/src/main/java/io/jenkins/plugins/worktile/WTHelper.java @@ -27,8 +27,7 @@ public static boolean isURL(String url) { try { new URL(url).toURI(); return true; - } - catch(Exception e) { + } catch (Exception e) { return false; } } @@ -64,8 +63,7 @@ public static String statusOfRun(final Run run) { public static EnvVars safeEnvVars(Run run) { try { return run.getEnvironment(TaskListener.NULL); - } - catch(Exception e) { + } catch (Exception e) { return new EnvVars(); } } @@ -75,36 +73,27 @@ public static long toSafeTs(long time) { } public static String resolveOverview(Run run, String overviewPattern) { - if(overviewPattern == null) { + if (overviewPattern == null || overviewPattern.equals("")) { return null; } + Pattern pattern = Pattern.compile(overviewPattern); try { - Pattern pattern = Pattern.compile(overviewPattern); - List matched = WTHelper.matches(pattern, run.getLog(999), true, true); - return matched.size() > 0 ? matched.get(0) : null; - } - catch(Exception exception) { - return null; - } - } - - public static List matches( - Pattern pattern, List contexts, boolean breakOnMatch, boolean origin - ) { - HashSet set = new HashSet<>(); - for(String context : contexts) { - Matcher matcher = pattern.matcher(context); - while(matcher.find()) { - set.add(origin ? context : matcher.group().toUpperCase()); + List logs = run.getLog(999); + for (String log : logs) { + Matcher matcher = pattern.matcher(log); + if (matcher.find()) { + return log; + } } - if(breakOnMatch) { break; } + return null; + } catch (Exception exception) { + return null; } - return new ArrayList<>(set); } public static List formatWorkItems(List workItems) { HashSet set = new HashSet<>(); - for(String item : workItems) { + for (String item : workItems) { set.add(item.substring(1)); } return new ArrayList<>(set); diff --git a/src/main/java/io/jenkins/plugins/worktile/resolver/WorkItemResolver.java b/src/main/java/io/jenkins/plugins/worktile/resolver/WorkItemResolver.java index aed5b42..6f42292 100644 --- a/src/main/java/io/jenkins/plugins/worktile/resolver/WorkItemResolver.java +++ b/src/main/java/io/jenkins/plugins/worktile/resolver/WorkItemResolver.java @@ -1,28 +1,5 @@ package io.jenkins.plugins.worktile.resolver; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Logger; -import java.util.regex.Pattern; - -import org.bouncycastle.jcajce.provider.asymmetric.dsa.DSASigner.stdDSA; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.LogCommand; -import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.internal.storage.file.FileRepository; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.jenkinsci.plugins.workflow.job.WorkflowRun; - import hudson.EnvVars; import hudson.FilePath; import hudson.model.AbstractBuild; @@ -35,6 +12,22 @@ import io.jenkins.plugins.worktile.WTLogger; import jenkins.MasterToSlaveFileCallable; import jenkins.scm.RunWithSCM; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.LogCommand; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.jenkinsci.plugins.workflow.job.WorkflowRun; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class WorkItemResolver { public static final Logger logger = Logger.getLogger(WorkItemResolver.class.getName()); @@ -50,8 +43,15 @@ public class WorkItemResolver { private final boolean isTagged; - public WorkItemResolver(final Run run, final FilePath workspace, final TaskListener listener, - boolean isTagged) { + public WorkItemResolver( + final Run run, final FilePath workspace, final TaskListener listener + ) { + this(run, workspace, listener, false); + } + + public WorkItemResolver( + final Run run, final FilePath workspace, final TaskListener listener, boolean isTagged + ) { this.run = run; this.workspace = workspace; this.listener = listener; @@ -59,45 +59,48 @@ public WorkItemResolver(final Run run, final FilePath workspace, final Tas this.isTagged = isTagged; } - public WorkItemResolver(final Run run, final FilePath workspace, final TaskListener listener) { - this(run, workspace, listener, false); - } - public List resolve() { collection.clear(); fromChangeLog(); fromEnvironment(); try { fromScm(); - } catch (final Exception e) { + } + catch(final Exception e) { wtLogger.info("Extract work items error from message body " + e.getMessage()); } - if (isTagged) { + if(isTagged) { try { fromTag(); - } catch (final Exception e) { + } + catch(final Exception e) { wtLogger.info("Extract work items error from tag " + e.getMessage()); } } - - final List matches = WTHelper.matches(pattern, new ArrayList<>(collection), false, false); - return WTHelper.formatWorkItems(matches); + Set sets = new HashSet<>(); + collection.forEach(item -> { + Matcher matcher = pattern.matcher(item); + while(matcher.find()) { + sets.add(matcher.group().toUpperCase()); + } + }); + return WTHelper.formatWorkItems(new ArrayList<>(sets)); } @SuppressWarnings("rawtypes") public void fromChangeLog() { final RunWithSCM scm = toSCMRun(); - if (scm == null) { + if(scm == null) { return; } final List changeLogSets = scm.getChangeSets(); - for (final Object changeLogSet : changeLogSets) { - for (final Object set : (ChangeLogSet) changeLogSet) { - final String msg = ((Entry) set).getMsg(); - if (msg != null) { + for(final Object changeLogSet : changeLogSets) { + for(final Object set : (ChangeLogSet)changeLogSet) { + final String msg = ((Entry)set).getMsg(); + if(msg != null) { collection.add(msg); } } @@ -106,47 +109,46 @@ public void fromChangeLog() { public void fromEnvironment() { final EnvVars envVars = WTHelper.safeEnvVars(run); - if (envVars.get("GIT_BRANCH") != null) { + if(envVars.get("GIT_BRANCH") != null) { collection.add(envVars.get("GIT_BRANCH")); } - if (envVars.get("ghprbSourceBranch") != null) { + if(envVars.get("ghprbSourceBranch") != null) { collection.add(envVars.get("ghprbSourceBranch")); } - if (envVars.get("ghprbPullTitle") != null) { + if(envVars.get("ghprbPullTitle") != null) { collection.add(envVars.get("ghprbPullTitle")); } - if (envVars.get("ghprbCommentBody") != null) { + if(envVars.get("ghprbCommentBody") != null) { collection.add(envVars.get("ghprbCommentBody")); } } public void fromScm() throws IOException, InterruptedException, GitAPIException { - if (run == null || workspace == null) { + if(run == null || workspace == null) { return; } final boolean isGit = workspace.child(VCSFolder).exists(); - if (!isGit) { + if(!isGit) { wtLogger.info("unsupported vcs, current git only"); } final FilePath gitStoreDir = workspace.child(VCSFolder); final String prActualCommit = run.getEnvironment(TaskListener.NULL).get("ghprbActualCommit"); - if (prActualCommit == null) { - logger.info("can't get prActualCommit or currentHeadId"); + if(prActualCommit == null) { + logger.info("prActualCommit is null, please use pull request builder trigger the build"); return; } - List messages = gitStoreDir - .act(new GitCommitMessageCallback(listener, ObjectId.fromString(prActualCommit))); + List messages = gitStoreDir.act(new GitCommitMessageCallback(listener, ObjectId.fromString(prActualCommit))); collection.addAll(messages); } public void fromTag() throws IOException, InterruptedException, GitAPIException { - if (run == null || workspace == null) { + if(run == null || workspace == null) { return; } final boolean isGit = workspace.child(VCSFolder).exists(); - if (!isGit) { - wtLogger.info("unsupported vcs, current git only"); + if(!isGit) { + wtLogger.info("Unsupported vcs, current git only"); } final FilePath gitStoreDir = workspace.child(VCSFolder); List messages = gitStoreDir.act(new GitTagsCallback(listener)); @@ -156,10 +158,11 @@ public void fromTag() throws IOException, InterruptedException, GitAPIException @SuppressWarnings("rawtypes") private RunWithSCM toSCMRun() { RunWithSCM runWithScm = null; - if (run instanceof AbstractBuild) { - runWithScm = (AbstractBuild) run; - } else if (run instanceof WorkflowRun) { - runWithScm = (WorkflowRun) run; + if(run instanceof AbstractBuild) { + runWithScm = (AbstractBuild)run; + } + else if(run instanceof WorkflowRun) { + runWithScm = (WorkflowRun)run; } return runWithScm; } @@ -175,27 +178,26 @@ public GitCommitMessageCallback(TaskListener listener, ObjectId prHeadCommitId) } @Override - public List invoke(final File file, final VirtualChannel virtualChannel) - throws IOException, InterruptedException { + public List invoke(final File file, final VirtualChannel virtualChannel) throws IOException, InterruptedException { List messages = new ArrayList<>(); - if (!file.exists() || !file.isDirectory()) { + if(!file.exists() || !file.isDirectory()) { return messages; } - try (FileRepository fileRepository = new FileRepository(file.getAbsolutePath())) { - listener.getLogger().println("FileResponse path = " + file.getAbsolutePath()); + try(FileRepository fileRepository = new FileRepository(file.getAbsolutePath())) { ObjectId currentHeadId = fileRepository.resolve("HEAD~^{commit}"); - if (currentHeadId == null) { + if(currentHeadId == null) { return messages; } Git git = new Git(fileRepository); try { final Iterable items = git.log().addRange(currentHeadId, prHeadCommitId).call(); - for (final RevCommit commit : items) { - if (commit != null) { + for(final RevCommit commit : items) { + if(commit != null) { messages.add(commit.getFullMessage()); } } - } catch (Exception e) { + } + catch(Exception e) { listener.getLogger().println("collection message error: " + e.getMessage()); } git.close(); @@ -207,76 +209,73 @@ public List invoke(final File file, final VirtualChannel virtualChannel) private static final class GitTagsCallback extends MasterToSlaveFileCallable> { private static final long serialVersionUID = -247109644349075954L; - private TaskListener listener; + private final TaskListener listener; public GitTagsCallback(TaskListener listener) { this.listener = listener; } - private void sort(List tags, RevWalk walk) { - Collections.sort(tags, new Comparator() { - public int compare(Ref t1, Ref t2) { - java.util.Date d1 = null; - java.util.Date d2 = null; - try { - d1 = walk.parseCommit(t1.getObjectId()).getCommitterIdent().getWhen(); - d2 = walk.parseCommit(t2.getObjectId()).getCommitterIdent().getWhen(); - return d2.compareTo(d1); - } catch (Exception e) { - System.out.println(e); - } - return 0; - } - }); - } - @Override - public List invoke(final File file, final VirtualChannel virtualChannel) - throws IOException, InterruptedException { + public List invoke(final File file, final VirtualChannel virtualChannel) throws IOException, InterruptedException { List messages = new ArrayList<>(); WTLogger wtLogger = new WTLogger(listener); - if (!file.exists() || !file.isDirectory()) { + if(!file.exists() || !file.isDirectory()) { return messages; } - try (FileRepository fileRepository = new FileRepository(file.getAbsolutePath())) { + try(FileRepository fileRepository = new FileRepository(file.getAbsolutePath())) { List tags = null; Git git = new Git(fileRepository); try { tags = git.tagList().call(); this.sort(tags, new RevWalk(fileRepository)); - if (tags != null && !tags.isEmpty()) { + if(!tags.isEmpty()) { Ref tag0 = tags.get(0); Ref peeledRef0 = fileRepository.getRefDatabase().peel(tag0); wtLogger.info("current tag = " + tag0.getName()); - ObjectId utilId = peeledRef0.getPeeledObjectId() != null ? peeledRef0.getPeeledObjectId() - : tag0.getObjectId(); + ObjectId utilId = peeledRef0.getPeeledObjectId() != null ? peeledRef0.getPeeledObjectId() : tag0.getObjectId(); Ref tag1 = tags.get(1); ObjectId startId = null; - if (tag1 != null) { + if(tag1 != null) { wtLogger.info("previous tag = " + tag1.getName()); Ref peeledRef1 = fileRepository.getRefDatabase().peel(tag1); - startId = peeledRef1.getPeeledObjectId() != null ? peeledRef1.getPeeledObjectId() - : tag1.getObjectId(); + startId = peeledRef1.getPeeledObjectId() != null ? peeledRef1.getPeeledObjectId() : tag1.getObjectId(); } LogCommand log = git.log().addRange(startId, utilId); Iterable logs = log.call(); - for (RevCommit commit : logs) { - if (commit != null) { + for(RevCommit commit : logs) { + if(commit != null) { String message = commit.getFullMessage(); - if (message != null) { + if(message != null) { messages.add(message); } } } } - } catch (Exception exception) { + } + catch(Exception exception) { wtLogger.error("get commit message in tag error"); } git.close(); } return messages; } + + private void sort(List tags, RevWalk walk) { + tags.sort((t1, t2) -> { + Date d1; + Date d2; + try { + d1 = walk.parseCommit(t1.getObjectId()).getCommitterIdent().getWhen(); + d2 = walk.parseCommit(t2.getObjectId()).getCommitterIdent().getWhen(); + return d2.compareTo(d1); + } + catch(Exception e) { + logger.info("sort tags error: " + e.getMessage()); + } + return 0; + }); + } } } diff --git a/src/test/java/io/jenkins/plugins/worktile/WTHelperTest.java b/src/test/java/io/jenkins/plugins/worktile/WTHelperTest.java index 31f9cb6..74b353c 100644 --- a/src/test/java/io/jenkins/plugins/worktile/WTHelperTest.java +++ b/src/test/java/io/jenkins/plugins/worktile/WTHelperTest.java @@ -1,13 +1,16 @@ package io.jenkins.plugins.worktile; -import io.jenkins.plugins.worktile.resolver.WorkItemResolver; +import hudson.model.Run; import org.junit.Test; +import java.io.IOException; import java.util.Arrays; import java.util.List; -import java.util.regex.Pattern; import static org.junit.Assert.*; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class WTHelperTest { @@ -22,9 +25,10 @@ public void testGetWorkItems() { /* pattern */ List items1 = WTHelper.formatWorkItems(Arrays.asList("#PLM-000", "#PLM-0001")); assertEquals(2, items1.size()); - items1.forEach(item -> { - assertFalse(item.startsWith("#")); - }); + items1.forEach( + item -> { + assertFalse(item.startsWith("#")); + }); } @Test @@ -36,30 +40,20 @@ public void testBuildName() { } @Test - public void testMatches() { - Pattern pattern = WorkItemResolver.pattern; - List contexts = Arrays.asList(// - "yourName/#PLM-000", // .. - "feat(refactor): #PLM-001 some context do refactor", // - "feat(refactor): #PLM-000 do refactor", // .. - "feat(refactor): #PLM-123 #PLM234" // .. - ); - - { - List matches = WTHelper.matches(pattern, contexts, false, false); - assertEquals(matches.size(), 3); - } - { - List matches = WTHelper.matches(pattern, contexts, true, false); - assertEquals(matches.size(), 1); - } - { - List matches = WTHelper.matches(pattern, contexts, true, true); - assertEquals(matches.size(), 1); - } - { - List matches = WTHelper.matches(pattern, contexts, false, true); - assertEquals(matches.size(), 4); - } + public void testGetReviewResult() throws IOException { + Run run = mock(Run.class); + when(run.getLog(anyInt())) + .thenReturn( + Arrays.asList( + "using credential 0eb6598a-7c2a-4ef2-a2eb-64934de6b415", + "hello, world", + "Run test cases 38369", + " 788 passing (13s)", + "Statements : 92.55% ( 3129/3381 )")); + String matched = WTHelper.resolveOverview(run, "^*passing"); + assertEquals(matched, " 788 passing (13s)"); + + String Statements = WTHelper.resolveOverview(run, "Statements"); + assertEquals(Statements, "Statements : 92.55% ( 3129/3381 )"); } } From 0259bac1c92f6791e95d501510a684b70b47cf30 Mon Sep 17 00:00:00 2001 From: cheerfyt Date: Wed, 27 May 2020 10:41:45 +0800 Subject: [PATCH 2/3] fix(review): fix review issues --- .../worktile/WTGlobalConfiguration.java | 16 +++++++++++++++- .../WTGlobalConfiguration/config.groovy | 19 ++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java b/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java index 9c9bc83..7f00eab 100644 --- a/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java +++ b/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java @@ -16,9 +16,13 @@ import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.plaincredentials.StringCredentials; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; import javax.annotation.Nonnull; import java.io.IOException; @@ -93,6 +97,7 @@ public boolean configure(StaplerRequest req, JSONObject formatData) throws FormE return true; } + @SuppressWarnings("unused") public FormValidation doCheckEndpoint(@QueryParameter(value = "endpoint", fixEmpty = true) String endpoint) { if (WTHelper.isNotBlank(endpoint) && !WTHelper.isURL(endpoint)) { return FormValidation.error(Messages.WTGlobalConfig_OpenApiEndpointError()); @@ -100,21 +105,29 @@ public FormValidation doCheckEndpoint(@QueryParameter(value = "endpoint", fixEmp return FormValidation.ok(); } + @SuppressWarnings("unused") public FormValidation doCheckClientId(@QueryParameter(value = "clientId", fixEmpty = true) String clientId) { return WTHelper.isNotBlank(clientId) ? FormValidation.ok() : FormValidation.error(Messages.WTGlobalConfig_ClientIdError()); } + @SuppressWarnings("unused") public FormValidation doCheckCredentialsId( @QueryParameter(value = "credentialsId", fixEmpty = true) String credentialsId) { return WTHelper.isNotBlank(credentialsId) ? FormValidation.ok() : FormValidation.error(Messages.WTGlobalConfig_CredentialsIdEmpty()); } + @POST + @SuppressWarnings("unused") + @Restricted(DoNotUse.class) public FormValidation doTestConnection(@QueryParameter(value = "endpoint", fixEmpty = true) String endpoint, @QueryParameter(value = "clientId", fixEmpty = true) String clientId, @QueryParameter(value = "credentialsId", fixEmpty = true) String credentialsId) throws IOException { + // Check permission, only ADMINISTER + Jenkins.get().hasPermission(Jenkins.ADMINISTER); + if (StringUtils.isEmpty(credentialsId) || StringUtils.isEmpty(endpoint) || StringUtils.isEmpty(clientId)) { return FormValidation.error(Messages.WTGlobalConfig_AnyOfIdError()); } @@ -132,10 +145,11 @@ public FormValidation doTestConnection(@QueryParameter(value = "endpoint", fixEm return FormValidation.error(Messages.WTGlobalConfig_DoTestConnectionFailure() + ": " + Messages.WTGlobalConfig_ClientIdOrClientSecretError()); } catch (Exception e) { - return FormValidation.error(Messages.WTGlobalConfig_DoTestConnectionFailure() + e.getMessage()); + return FormValidation.error(Messages.WTGlobalConfig_DoTestConnectionFailure() + ": " + e.getMessage()); } } + @SuppressWarnings("unused") public ListBoxModel doFillCredentialsIdItems(@QueryParameter final String endpoint, @QueryParameter final String clientId, @QueryParameter final String credentialsId) { diff --git a/src/main/resources/io/jenkins/plugins/worktile/WTGlobalConfiguration/config.groovy b/src/main/resources/io/jenkins/plugins/worktile/WTGlobalConfiguration/config.groovy index 1d7fb72..4b2fd29 100644 --- a/src/main/resources/io/jenkins/plugins/worktile/WTGlobalConfiguration/config.groovy +++ b/src/main/resources/io/jenkins/plugins/worktile/WTGlobalConfiguration/config.groovy @@ -14,24 +14,21 @@ f.section(title: _('Worktile application')) { } f.entry(title:_('Client Secret'), field:'credentialsId') { - c.select(onchange = """{ + c.select(onchange: """{ var self = this.targetElement ? this.targetElement : this; var r = findPreviousFormItem(self,'url'); r.onchange(r); self = null; r = null; - }""" /* workaround for JENKINS-19124 */) + }""", context: app, includeUser: false, expressionAllowed: false) } f.entry(title: _('')) { - f.validateButton(title: 'Test Connection', method: 'testConnection', with: 'endpoint,clientId,credentialsId') + f.validateButton( + title: 'Test Connection', + method: 'testConnection', + progress: _("Testing..."), + with: 'endpoint,clientId,credentialsId' + ) } - - // f.advanced(align: 'left') { - // f.entry(title: _('deploy environments')) { - // f.repeatableHeteroProperty(field: 'envConfigs', items: instance.envConfigs, hasHeader: true) { - // f.repeatableDeleteButton() - // } - // } - // } } From 25dab979cb4c2cd62c77d7157122febe0953a151 Mon Sep 17 00:00:00 2001 From: cheerfyt Date: Wed, 27 May 2020 10:41:50 +0800 Subject: [PATCH 3/3] fix(review): fix review issues --- .../java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java b/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java index 7f00eab..6b6bd54 100644 --- a/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java +++ b/src/main/java/io/jenkins/plugins/worktile/WTGlobalConfiguration.java @@ -119,8 +119,8 @@ public FormValidation doCheckCredentialsId( } @POST - @SuppressWarnings("unused") @Restricted(DoNotUse.class) + @SuppressWarnings("unused") public FormValidation doTestConnection(@QueryParameter(value = "endpoint", fixEmpty = true) String endpoint, @QueryParameter(value = "clientId", fixEmpty = true) String clientId, @QueryParameter(value = "credentialsId", fixEmpty = true) String credentialsId) throws IOException {