From f54e94378cf9d1fde8f977d3b435a039f6747339 Mon Sep 17 00:00:00 2001 From: "CORPROOT\\tgdhamad" Date: Fri, 15 Sep 2017 10:31:31 +0200 Subject: [PATCH] new version 1.3.3, added possibility to create labels on page, set encoding to ISO8859_1 to avoid problems with special characters (may be improved, perhaps with a specific http header) --- rocks.inspectit.releaseplugin/pom.xml | 2 +- .../releaseplugin/AbstractJIRAAction.java | 245 ++++++++-------- .../releaseplugin/ConfluenceAccessTool.java | 219 +++++++------- .../releaseplugin/JsonHTTPClientWrapper.java | 1 + .../ConfluenceReleaseNotesPublisher.java | 270 +++++++++--------- .../config.jelly | 4 + .../help-pageLabels.html | 1 + 7 files changed, 371 insertions(+), 371 deletions(-) create mode 100644 rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/help-pageLabels.html diff --git a/rocks.inspectit.releaseplugin/pom.xml b/rocks.inspectit.releaseplugin/pom.xml index fd9e6ed..1f34fd0 100644 --- a/rocks.inspectit.releaseplugin/pom.xml +++ b/rocks.inspectit.releaseplugin/pom.xml @@ -13,7 +13,7 @@ rocks.inspectit release-helper - 1.3 + 1.3.3 hpi Jenkins Release Helper Plugin diff --git a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/AbstractJIRAAction.java b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/AbstractJIRAAction.java index 7b56f28..ef0927b 100644 --- a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/AbstractJIRAAction.java +++ b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/AbstractJIRAAction.java @@ -1,13 +1,22 @@ package rocks.inspectit.releaseplugin; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.text.StrSubstitutor; +import org.kohsuke.stapler.AncestorInPath; + +import com.cloudbees.plugins.credentials.CredentialsProvider; +import com.cloudbees.plugins.credentials.common.StandardListBoxModel; + import hudson.EnvVars; +import hudson.model.AbstractBuild; +import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.BuildListener; +import hudson.model.Computer; import hudson.model.ItemGroup; import hudson.model.ParameterValue; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; -import hudson.model.Computer; import hudson.model.ParametersAction; import hudson.security.ACL; import hudson.security.AccessControlled; @@ -15,20 +24,9 @@ import hudson.tasks.BuildStepMonitor; import hudson.tasks.Builder; import hudson.util.ListBoxModel; - -import java.util.HashMap; -import java.util.Map; - import jenkins.model.Jenkins; - -import org.apache.commons.lang.text.StrSubstitutor; -import org.kohsuke.stapler.AncestorInPath; - import rocks.inspectit.releaseplugin.credentials.JIRAProjectCredentials; -import com.cloudbees.plugins.credentials.CredentialsProvider; -import com.cloudbees.plugins.credentials.common.StandardListBoxModel; - /** * * Parent class for build steps which need an access to Jira. @@ -38,120 +36,109 @@ */ public abstract class AbstractJIRAAction extends Builder { - /** - * represents an internal id of the chosen credentials to access JIRA. - */ - private String jiraCredentialsID; - - /** - * Constructor. - * @param jiraCredentialsID the id of the jira credentials which will be used - */ - public AbstractJIRAAction(String jiraCredentialsID) { - this.jiraCredentialsID = jiraCredentialsID; - } - - - /** - * @return the ID representing the credentials to access JIRA - */ - public String getJiraCredentialsID() { - return jiraCredentialsID; - } - - - /** - * Translates the credentialsID into the actual credentials object. - * @return - * the credentials or null if none where chosen. - */ - public JIRAProjectCredentials getJiraCredentials() { - return JIRAProjectCredentials.getByID(jiraCredentialsID); - } - - - - - @Override - public Action getProjectAction(AbstractProject project) { - return null; - } - - /** - * Returns a StringSubstitutor replacing variables e.g. ${varName} with - * their content. - * - * Considers build parameters AND environment variables, while giving priority to the build parameters. - * - * @param build - * the current build - * @param lis - * the listener of the current build - * @return a string substitutor replacing all variables with their content. - */ - protected StrSubstitutor getVariablesSubstitutor(AbstractBuild build, BuildListener lis) { - ParametersAction params = build.getAction(ParametersAction.class); - Map variables = new HashMap(); - EnvVars env; - try { - env = build.getEnvironment(lis); - } catch (Exception e) { - throw new RuntimeException(e); - } - for (Map.Entry en : env.entrySet()) { - variables.put(en.getKey(), en.getValue()); - } - if (params != null) { - for (ParameterValue val : params.getParameters()) { - variables.put(val.getName(), val.getValue().toString()); - } - } - StrSubstitutor subs = new StrSubstitutor(variables); - return subs; - } - - @Override - public BuildStepMonitor getRequiredMonitorService() { - return BuildStepMonitor.BUILD; - } - - - /** - * The descriptor-class. - * - * @author JKU - */ - public abstract static class DescriptorImpl extends BuildStepDescriptor { - - - @Override - public boolean isApplicable(@SuppressWarnings("rawtypes") Class jobType) { - return true; - } - - - /** - * Method for filling the credentials listbox with the available JIRA credentials. - * @param context the context - * @return a ListBoxModel containing all available credentials. - */ - //the method lookupCredentials is actually not deprecated, it has been replaced with - //a same signature method with a variable number of arguments. - @SuppressWarnings("deprecation") - public ListBoxModel doFillJiraCredentialsIDItems(@AncestorInPath ItemGroup context) { - if (!(context instanceof AccessControlled ? (AccessControlled) context : Jenkins.getInstance()).hasPermission(Computer.CONFIGURE)) { - return new ListBoxModel(); - } - return new StandardListBoxModel().withAll( - CredentialsProvider.lookupCredentials(JIRAProjectCredentials.class, context, ACL.SYSTEM)); - - } - - } - - - - - + /** + * represents an internal id of the chosen credentials to access JIRA. + */ + private String jiraCredentialsID; + + /** + * Constructor. + * + * @param jiraCredentialsID the id of the jira credentials which will be used + */ + public AbstractJIRAAction(String jiraCredentialsID) { + this.jiraCredentialsID = jiraCredentialsID; + } + + /** + * @return the ID representing the credentials to access JIRA + */ + public String getJiraCredentialsID() { + return jiraCredentialsID; + } + + /** + * Translates the credentialsID into the actual credentials object. + * + * @return the credentials or null if none where chosen. + */ + public JIRAProjectCredentials getJiraCredentials() { + return JIRAProjectCredentials.getByID(jiraCredentialsID); + } + + @Override + public Action getProjectAction(AbstractProject< ?, ? > project) { + return null; + } + + /** + * Returns a StringSubstitutor replacing variables e.g. ${varName} with their content. + * + * Considers build parameters AND environment variables, while giving priority to the build parameters. + * + * @param build the current build + * @param lis the listener of the current build + * @return a string substitutor replacing all variables with their content. + */ + protected StrSubstitutor getVariablesSubstitutor(AbstractBuild< ?, ? > build, BuildListener lis) { + ParametersAction params = build.getAction(ParametersAction.class); + Map< String, String > variables = new HashMap< String, String >(); + EnvVars env; + try { + env = build.getEnvironment(lis); + } catch (Exception e) { + throw new RuntimeException(e); + } + for (Map.Entry< String, String > en : env.entrySet()) { + variables.put(en.getKey(), en.getValue()); + } + if (params != null) { + for (ParameterValue val : params.getParameters()) { + if (val.getValue() != null) { + variables.put(val.getName(), val.getValue().toString()); + } + } + } + StrSubstitutor subs = new StrSubstitutor(variables); + return subs; + } + + @Override + public BuildStepMonitor getRequiredMonitorService() { + return BuildStepMonitor.BUILD; + } + + /** + * The descriptor-class. + * + * @author JKU + */ + public abstract static class DescriptorImpl extends BuildStepDescriptor< Builder > { + + @Override + public boolean isApplicable(@SuppressWarnings("rawtypes") Class< ? extends AbstractProject > jobType) { + return true; + } + + /** + * Method for filling the credentials listbox with the available JIRA credentials. + * + * @param context the context + * @return a ListBoxModel containing all available credentials. + */ + // the method lookupCredentials is actually not deprecated, it has been replaced with + // a same signature method with a variable number of arguments. + @SuppressWarnings("deprecation") + public ListBoxModel doFillJiraCredentialsIDItems(@AncestorInPath ItemGroup< ? > context) { + if (!(context instanceof AccessControlled ? (AccessControlled) context : Jenkins.getInstance()) + .hasPermission(Computer.CONFIGURE)) { + return new ListBoxModel(); + } + return new StandardListBoxModel() + .withAll(CredentialsProvider.lookupCredentials(JIRAProjectCredentials.class, context, ACL.SYSTEM)); + + } + + } } diff --git a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/ConfluenceAccessTool.java b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/ConfluenceAccessTool.java index 48620c0..49935ae 100644 --- a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/ConfluenceAccessTool.java +++ b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/ConfluenceAccessTool.java @@ -10,8 +10,8 @@ import com.google.gson.JsonObject; /** - * Type encapsulating the REST-API based access to a confluence Server. Allows - * searching for pages and creating new pages at the moment. + * Type encapsulating the REST-API based access to a confluence Server. Allows searching for pages and creating new pages at the + * moment. * * @author Jonas Kunz * @@ -19,113 +19,112 @@ public class ConfluenceAccessTool { - /** - * the HTTP connection supporting JSON in and output. - */ - private JsonHTTPClientWrapper client; - - /** - * Initializes a new connection with the given connection information. - * @param url the url of confluence - * @param user the username - * @param password the password - * @param proxy the proxy to use for building the connection - */ - public ConfluenceAccessTool(String url, String user, String password, String proxy) { - super(); - client = new JsonHTTPClientWrapper(url, user, password, proxy); - } - - - - /** - * closes the connection. - */ - public void destroy() { - client.destroy(); - } - - - /** - * - * Queries all pages wioth the given title in the given space. - * - * @param title - * the title of the pages to look for - * @param space - * the key of the space - * @return a list of all IDs of the pages having the given title in the - * given space - */ - public List getPageIDByTitle(String title, String space) { - try { - - Map params = new HashMap<>(); - params.put("spaceKey", space); - params.put("title", title); - - JsonElement je = client.getJson("/rest/api/content", params); - - JsonArray resultsArray = je.getAsJsonObject().get("results").getAsJsonArray(); - - List results = new ArrayList(); - - for (int i = 0; i < resultsArray.size(); i++) { - results.add(resultsArray.get(i).getAsJsonObject().get("id") - .getAsLong()); - } - - return results; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * - * Creates a new page in the given space. - * - * @param title - * the title of the new page - * @param htmlContent - * the html content of the new page - * @param space - * the key of the space where the new page shall be placed - * @param parentPageID - * the id of the parent page, under which the new page should be - * inserted as child. If parentPageID is null, the new page will - * be placed at the spaces root. - */ - public void createPage(String title, String htmlContent, String space, Long parentPageID) { - - JsonObject page = new JsonObject(); - page.addProperty("type", "page"); - page.addProperty("title", title); - if (parentPageID != null) { - JsonObject parentPage = new JsonObject(); - parentPage.addProperty("type", "page"); - parentPage.addProperty("id", parentPageID); - - JsonArray ancestors = new JsonArray(); - ancestors.add(parentPage); - page.add("ancestors", ancestors); - - } - JsonObject spaceObj = new JsonObject(); - spaceObj.addProperty("key", space); - page.add("space", spaceObj); - - JsonObject body = new JsonObject(); - JsonObject storage = new JsonObject(); - storage.addProperty("value", htmlContent); - storage.addProperty("representation", "storage"); - body.add("storage", storage); - - page.add("body", body); - - client.postJson("/rest/api/content", page); - - - } + /** + * the HTTP connection supporting JSON in and output. + */ + private JsonHTTPClientWrapper client; + + /** + * Initializes a new connection with the given connection information. + * + * @param url the url of confluence + * @param user the username + * @param password the password + * @param proxy the proxy to use for building the connection + */ + public ConfluenceAccessTool(String url, String user, String password, String proxy) { + super(); + client = new JsonHTTPClientWrapper(url, user, password, proxy); + } + + /** + * closes the connection. + */ + public void destroy() { + client.destroy(); + } + + /** + * + * Queries all pages wioth the given title in the given space. + * + * @param title the title of the pages to look for + * @param space the key of the space + * @return a list of all IDs of the pages having the given title in the given space + */ + public List< Long > getPageIDByTitle(String title, String space) { + try { + + Map< String, String > params = new HashMap<>(); + params.put("spaceKey", space); + params.put("title", title); + + JsonElement je = client.getJson("/rest/api/content", params); + + JsonArray resultsArray = je.getAsJsonObject().get("results").getAsJsonArray(); + + List< Long > results = new ArrayList< Long >(); + + for (int i = 0; i < resultsArray.size(); i++) { + results.add(resultsArray.get(i).getAsJsonObject().get("id").getAsLong()); + } + + return results; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * + * Creates a new page in the given space. + * + * @param title the title of the new page + * @param htmlContent the html content of the new page + * @param space the key of the space where the new page shall be placed + * @param parentPageID the id of the parent page, under which the new page should be inserted as child. If parentPageID is null, + * the new page will be placed at the spaces root. + */ + public void createPage(String title, String htmlContent, String space, Long parentPageID, String... labels) { + + JsonObject page = new JsonObject(); + page.addProperty("type", "page"); + page.addProperty("title", title); + if (parentPageID != null) { + JsonObject parentPage = new JsonObject(); + parentPage.addProperty("type", "page"); + parentPage.addProperty("id", parentPageID); + + JsonArray ancestors = new JsonArray(); + ancestors.add(parentPage); + page.add("ancestors", ancestors); + + } + JsonObject spaceObj = new JsonObject(); + spaceObj.addProperty("key", space); + page.add("space", spaceObj); + + JsonObject body = new JsonObject(); + JsonObject storage = new JsonObject(); + storage.addProperty("value", htmlContent); + storage.addProperty("representation", "storage"); + body.add("storage", storage); + + page.add("body", body); + + JsonElement response = client.postJson("/rest/api/content", page); + + if (labels != null && labels.length > 0) { + String pageId = response.getAsJsonObject().get("id").getAsString(); + JsonArray labelsArry = new JsonArray(); + for (String label : labels) { + JsonObject element = new JsonObject(); + element.addProperty("prefix", "global"); + element.addProperty("name", label); + labelsArry.add(element); + } + client.postJson("rest/api/content/" + pageId + "/label", labelsArry); + } + } } diff --git a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/JsonHTTPClientWrapper.java b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/JsonHTTPClientWrapper.java index 82132d7..7e732e0 100644 --- a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/JsonHTTPClientWrapper.java +++ b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/JsonHTTPClientWrapper.java @@ -147,6 +147,7 @@ private JsonElement executeRequest(HttpUriRequest request) { } } catch (Exception e) { + System.out.println("Error while executing request: "+ request); throw new RuntimeException(e); } } diff --git a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher.java b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher.java index 975f9a5..bc0f2a3 100644 --- a/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher.java +++ b/rocks.inspectit.releaseplugin/src/main/java/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher.java @@ -27,136 +27,144 @@ * */ public class ConfluenceReleaseNotesPublisher extends AbstractJIRAConfluenceAction { - - /** - * The space under which the page shal lbe published. - */ - private String spaceKey; - /** - * The JQL filter of the tickets to list. - */ - private String jqlFilter; - /** - * Title of the page to publish. - */ - private String pageTitle; - /** - * Title of the parent page. - */ - private String parentPageTitle; - - - - - /** - * - * Databound constructor, called by Jenkins. - * - * @param jiraCredentialsID the jira credentials - * @param confluenceCredentialsID the confluence credentials - * @param spaceKey the space key - * @param jqlFilter the jql filter - * @param pageTitle the title of the new page - * @param parentPageTitle the title of the parent page - */ - @DataBoundConstructor - public ConfluenceReleaseNotesPublisher(String jiraCredentialsID, - String confluenceCredentialsID, String spaceKey, String jqlFilter, - String pageTitle, String parentPageTitle) { - super(jiraCredentialsID, confluenceCredentialsID); - this.spaceKey = spaceKey; - this.jqlFilter = jqlFilter; - this.pageTitle = pageTitle; - this.parentPageTitle = parentPageTitle; - } - - public String getSpaceKey() { - return spaceKey; - } - - public String getJqlFilter() { - return jqlFilter; - } - - public String getPageTitle() { - return pageTitle; - } - - public String getParentPageTitle() { - return parentPageTitle; - } - - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - - - StrSubstitutor varReplacer = getVariablesSubstitutor(build, listener); - PrintStream logger = listener.getLogger(); - - JIRAProjectCredentials jiraCred = getJiraCredentials(); - ConfluenceCredentials confCred = getConfluenceCredentials(); - - JIRAAccessTool jira = new JIRAAccessTool(jiraCred.getUrl(), jiraCred.getUrlUsername(), jiraCred.getUrlPassword(),null, jiraCred.getProjectKey(), getJiraCredentialsID()); - ConfluenceAccessTool confluence = new ConfluenceAccessTool(confCred.getUrl(), confCred.getUrlUsername(), confCred.getUrlPassword(), null); - - String jqlFilter = varReplacer.replace(this.jqlFilter); - String spaceKey = varReplacer.replace(this.spaceKey); - String pageTitle = varReplacer.replace(this.pageTitle); - String parentPageTitle = varReplacer.replace(this.parentPageTitle); - - List tickets = jira.getTicketsByJQL(jqlFilter); - - logger.println("Publishing " + tickets.size() + " tickets on page '" + pageTitle + "' in space '" + spaceKey + "' on confluence."); - - String pageHTML = jira.buildReleaseNotesHTML(tickets); - - Long parentPageID = null; - if (!parentPageTitle.isEmpty()) { - List results = confluence.getPageIDByTitle(parentPageTitle, spaceKey); - if (results.size() == 0) { - throw new RuntimeException("No page with title '" + parentPageTitle + "' found!"); - } - if (results.size() > 1) { - throw new RuntimeException("Multiple pages with title '" + parentPageTitle + "' found!"); - } - parentPageID = results.get(0); - } - - - confluence.createPage(pageTitle, pageHTML, spaceKey, parentPageID); - - - confluence.destroy(); - jira.destroy(); - - return true; - } - - - - - - /** - * Descriptor class. - * @author JKU - * - */ - @Extension - public static class DescriptorImpl extends AbstractJIRAConfluenceAction.DescriptorImpl { - - /** - * Constructor. - */ - public DescriptorImpl() { - super(); - load(); - } - - @Override - public String getDisplayName() { - return "Publish Release Notes on Confluence"; - } - - } + + /** + * The space under which the page shal lbe published. + */ + private String spaceKey; + + /** + * The JQL filter of the tickets to list. + */ + private String jqlFilter; + + /** + * Title of the page to publish. + */ + private String pageTitle; + + /** + * Title of the parent page. + */ + private String parentPageTitle; + + /** + * Labels of the page + */ + private String pageLabels; + + /** + * + * Databound constructor, called by Jenkins. + * + * @param jiraCredentialsID the jira credentials + * @param confluenceCredentialsID the confluence credentials + * @param spaceKey the space key + * @param jqlFilter the jql filter + * @param pageTitle the title of the new page + * @param parentPageTitle the title of the parent page + */ + @DataBoundConstructor + public ConfluenceReleaseNotesPublisher(String jiraCredentialsID, String confluenceCredentialsID, String spaceKey, + String jqlFilter, String pageTitle, String pageLabels, String parentPageTitle) { + super(jiraCredentialsID, confluenceCredentialsID); + this.spaceKey = spaceKey; + this.jqlFilter = jqlFilter; + this.pageTitle = pageTitle; + this.parentPageTitle = parentPageTitle; + this.pageLabels = pageLabels; + } + + public String getSpaceKey() { + return spaceKey; + } + + public String getJqlFilter() { + return jqlFilter; + } + + public String getPageTitle() { + return pageTitle; + } + + public String getParentPageTitle() { + return parentPageTitle; + } + + @Override + public boolean perform(AbstractBuild< ?, ? > build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + + StrSubstitutor varReplacer = getVariablesSubstitutor(build, listener); + PrintStream logger = listener.getLogger(); + + JIRAProjectCredentials jiraCred = getJiraCredentials(); + ConfluenceCredentials confCred = getConfluenceCredentials(); + + JIRAAccessTool jira = new JIRAAccessTool(jiraCred.getUrl(), jiraCred.getUrlUsername(), jiraCred.getUrlPassword(), null, + jiraCred.getProjectKey(), getJiraCredentialsID()); + ConfluenceAccessTool confluence = new ConfluenceAccessTool(confCred.getUrl(), confCred.getUrlUsername(), + confCred.getUrlPassword(), null); + + String jqlFilter = varReplacer.replace(this.jqlFilter); + String spaceKey = varReplacer.replace(this.spaceKey); + String pageTitle = varReplacer.replace(this.pageTitle); + String parentPageTitle = varReplacer.replace(this.parentPageTitle); + String pageLabels = varReplacer.replace(this.pageLabels); + String[] labels = null; + if (pageLabels != null && !pageLabels.isEmpty()) { + labels = pageLabels.split(" "); + } + + List< Issue > tickets = jira.getTicketsByJQL(jqlFilter); + + logger.println( + "Publishing " + tickets.size() + " tickets on page '" + pageTitle + "' in space '" + spaceKey + "' on confluence."); + + String pageHTML = new String(jira.buildReleaseNotesHTML(tickets).getBytes("UTF-8"), "ISO8859_1"); + + Long parentPageID = null; + if (!parentPageTitle.isEmpty()) { + List< Long > results = confluence.getPageIDByTitle(parentPageTitle, spaceKey); + if (results.size() == 0) { + throw new RuntimeException("No page with title '" + parentPageTitle + "' found!"); + } + if (results.size() > 1) { + throw new RuntimeException("Multiple pages with title '" + parentPageTitle + "' found!"); + } + parentPageID = results.get(0); + } + + confluence.createPage(pageTitle, pageHTML, spaceKey, parentPageID, labels); + + confluence.destroy(); + jira.destroy(); + + return true; + } + + /** + * Descriptor class. + * + * @author JKU + * + */ + @Extension + public static class DescriptorImpl extends AbstractJIRAConfluenceAction.DescriptorImpl { + + /** + * Constructor. + */ + public DescriptorImpl() { + super(); + load(); + } + + @Override + public String getDisplayName() { + return "Publish Release Notes on Confluence"; + } + + } } diff --git a/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/config.jelly b/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/config.jelly index a2333ef..b4a4779 100644 --- a/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/config.jelly +++ b/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/config.jelly @@ -22,6 +22,10 @@ + + + + diff --git a/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/help-pageLabels.html b/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/help-pageLabels.html new file mode 100644 index 0000000..f49c6e6 --- /dev/null +++ b/rocks.inspectit.releaseplugin/src/main/resources/rocks/inspectit/releaseplugin/releasenotes/ConfluenceReleaseNotesPublisher/help-pageLabels.html @@ -0,0 +1 @@ +
Space separated list of labels for the page.
\ No newline at end of file