{"action":"created","comment":{"url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/comments/60602992","id":60602992,"diff_hunk":"@@ -0,0 +1,432 @@\n+package org.jenkinsci.plugins.pipeline.milestone;\n+\n+\n+import static java.util.logging.Level.WARNING;\n+\n+import java.io.File;\n+import java.io.IOException;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Set;\n+import java.util.TreeMap;\n+import java.util.TreeSet;\n+import java.util.Map.Entry;\n+import java.util.logging.Level;\n+import java.util.logging.Logger;\n+\n+import javax.annotation.CheckForNull;\n+\n+import org.jenkinsci.plugins.workflow.actions.LabelAction;\n+import org.jenkinsci.plugins.workflow.actions.ThreadNameAction;\n+import org.jenkinsci.plugins.workflow.flow.FlowExecutionOwner;\n+import org.jenkinsci.plugins.workflow.graph.BlockEndNode;\n+import org.jenkinsci.plugins.workflow.graph.BlockStartNode;\n+import org.jenkinsci.plugins.workflow.graph.FlowGraphWalker;\n+import org.jenkinsci.plugins.workflow.graph.FlowNode;\n+import org.jenkinsci.plugins.workflow.graph.FlowStartNode;\n+import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousStepExecution;\n+import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException;\n+import org.jenkinsci.plugins.workflow.steps.StepContext;\n+import org.jenkinsci.plugins.workflow.steps.StepContextParameter;\n+\n+import com.google.inject.Inject;\n+\n+import hudson.AbortException;\n+import hudson.Extension;\n+import hudson.XmlFile;\n+import hudson.model.Executor;\n+import hudson.model.InvisibleAction;\n+import hudson.model.Job;\n+import hudson.model.Result;\n+import hudson.model.Run;\n+import hudson.model.TaskListener;\n+import hudson.model.listeners.RunListener;\n+import jenkins.model.CauseOfInterruption;\n+import jenkins.model.Jenkins;\n+\n+public class MilestoneStepExecution extends AbstractSynchronousStepExecution<Void> {\n+\n+    private static final Logger LOGGER = Logger.getLogger(MilestoneStepExecution.class.getName());\n+\n+    @Inject(optional=true) private transient MilestoneStep step;\n+    @StepContextParameter private transient Run<?,?> run;\n+    @StepContextParameter private transient FlowNode node;\n+    @StepContextParameter private transient TaskListener listener;\n+\n+    @Override\n+    public Void run() throws Exception {\n+        if (step.getLabel() != null) {\n+            node.addAction(new LabelAction(step.getLabel()));\n+        }\n+        int ordinal = processOrdinal();\n+        tryToPass(run, getContext(), ordinal);\n+        return null;\n+    }\n+\n+    /**\n+     * Gets the next ordinal and throw {@link AbortException} the milestone lives inside a parallel step branch.\n+     */\n+    private synchronized int processOrdinal() throws AbortException {\n+        FlowGraphWalker walker = new FlowGraphWalker();\n+        walker.addHead(node);\n+        Integer previousOrdinal = null;\n+        int parallelDetectionEnabled = 0;\n+        for (FlowNode n : walker) {\n+\n+            if (parallelDetectionEnabled <= 0 && n.getAction(ThreadNameAction.class) != null) {\n+                listener.getLogger().println(\"Milestone step found inside parallel, it's not possible to grant ordering in this case.\");\n+                throw new AbortException(\"Using a milestone step inside parallel is not allowed\");\n+            }\n+\n+            if (n instanceof BlockEndNode) {\n+                parallelDetectionEnabled++;\n+            } else if (n instanceof BlockStartNode && !(n instanceof FlowStartNode)) {\n+                parallelDetectionEnabled--;","path":"src/main/java/org/jenkinsci/plugins/pipeline/milestone/MilestoneStepExecution.java","position":104,"original_position":85,"commit_id":"3dc8c7f35e48d369e7e4351680195393b3bc386b","original_commit_id":"90e4878de76ffe0e1f4f09eef12166a2e706fc71","user":{"login":"jglick","id":154109,"avatar_url":"https://avatars.githubusercontent.com/u/154109?v=3","gravatar_id":"","url":"https://api.github.com/users/jglick","html_url":"https://github.com/jglick","followers_url":"https://api.github.com/users/jglick/followers","following_url":"https://api.github.com/users/jglick/following{/other_user}","gists_url":"https://api.github.com/users/jglick/gists{/gist_id}","starred_url":"https://api.github.com/users/jglick/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jglick/subscriptions","organizations_url":"https://api.github.com/users/jglick/orgs","repos_url":"https://api.github.com/users/jglick/repos","events_url":"https://api.github.com/users/jglick/events{/privacy}","received_events_url":"https://api.github.com/users/jglick/received_events","type":"User","site_admin":false},"body":"`FlowNodeSerialWalker` would not work here I think because of:\r\n\r\n```groovy\r\nnode {\r\n  milestone()\r\n}\r\nnode {\r\n  milestone()\r\n}\r\n```\r\n\r\nFrom the second `milestone`, we need to find the first, which is not “up and back”.","created_at":"2016-04-21T15:34:25Z","updated_at":"2016-04-21T15:34:25Z","html_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1#discussion_r60602992","pull_request_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/comments/60602992"},"html":{"href":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1#discussion_r60602992"},"pull_request":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1","id":66062886,"html_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1","diff_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1.diff","patch_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1.patch","issue_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/1","number":1,"state":"open","locked":false,"title":"[JENKINS-27039] New step: milestone","user":{"login":"amuniz","id":1017585,"avatar_url":"https://avatars.githubusercontent.com/u/1017585?v=3","gravatar_id":"","url":"https://api.github.com/users/amuniz","html_url":"https://github.com/amuniz","followers_url":"https://api.github.com/users/amuniz/followers","following_url":"https://api.github.com/users/amuniz/following{/other_user}","gists_url":"https://api.github.com/users/amuniz/gists{/gist_id}","starred_url":"https://api.github.com/users/amuniz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amuniz/subscriptions","organizations_url":"https://api.github.com/users/amuniz/orgs","repos_url":"https://api.github.com/users/amuniz/repos","events_url":"https://api.github.com/users/amuniz/events{/privacy}","received_events_url":"https://api.github.com/users/amuniz/received_events","type":"User","site_admin":false},"body":"(Moved from https://github.com/jenkinsci/pipeline-plugin/pull/355)\r\n\r\nBased on discussion on [JENKINS-27039](https://issues.jenkins-ci.org/browse/JENKINS-27039) (and also covers [JENKINS-32829](https://issues.jenkins-ci.org/browse/JENKINS-32829)).\r\n\r\nThe implementation is based on the `stage` step code and @jglick's proposal in the linked JIRA. There is currently some duplicated code which will be there until `concurrency` is deprecated in `stage`.\r\n\r\nThis step has been designed to accomplish the following:\r\n 1. Builds pass through the `milestone` in order (taking the build number as sorter field).\r\n 1. Older builds reaching a milestone will not proceed (they are aborted) if a newer one already passed the milestone.\r\n 1. Once a build passes a milestone, it will be never aborted by a newer build which did not reach the milestone yet.\r\n 1. Once a build passes a milestone, any older build that passed the previous milestone but not this one is aborted.\r\n\r\nI used this Pipeline script for manual testing (thanks @stephenc):\r\n\r\n```\r\nmilestone\r\nnode {\r\n    def delay = new Random().nextInt(60)\r\n    echo \"Sleeping for ${delay}s...\"\r\n    sleep time: delay, unit: 'SECONDS'\r\n}\r\nmilestone\r\nnode {\r\n    def delay = new Random().nextInt(60)\r\n    echo \"Sleeping for ${delay}s...\"\r\n    sleep time: delay, unit: 'SECONDS'\r\n}\r\n```\r\n\r\n- [x] Base implementation of `milestone` step\r\n- [x] Automated tests\r\n- [x] Clean up non existing `milestone`s in config file (`$JENKINS_HOME/org.jenkinsci.plugins.workflow.support.steps.MilestoneStep.xml`)\r\n- Update the CD stock demo to use `milestone` and `lock` in tandem (it requires upstream https://github.com/jenkinsci/lockable-resources-plugin/pull/25 to be merged and released, it will be done separately)\r\n- [x] Allow to specify the `ordinal` as a parameter (or auto-generate it otherwise)\r\n\r\n@reviewbybees ","created_at":"2016-04-11T21:09:40Z","updated_at":"2016-04-21T15:34:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ea2fc8d85dd1f1c0af628c903497c45775dd253a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1/commits","review_comments_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1/comments","review_comment_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/1/comments","statuses_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/statuses/3dc8c7f35e48d369e7e4351680195393b3bc386b","head":{"label":"amuniz:JENKINS-27039","ref":"JENKINS-27039","sha":"3dc8c7f35e48d369e7e4351680195393b3bc386b","user":{"login":"amuniz","id":1017585,"avatar_url":"https://avatars.githubusercontent.com/u/1017585?v=3","gravatar_id":"","url":"https://api.github.com/users/amuniz","html_url":"https://github.com/amuniz","followers_url":"https://api.github.com/users/amuniz/followers","following_url":"https://api.github.com/users/amuniz/following{/other_user}","gists_url":"https://api.github.com/users/amuniz/gists{/gist_id}","starred_url":"https://api.github.com/users/amuniz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amuniz/subscriptions","organizations_url":"https://api.github.com/users/amuniz/orgs","repos_url":"https://api.github.com/users/amuniz/repos","events_url":"https://api.github.com/users/amuniz/events{/privacy}","received_events_url":"https://api.github.com/users/amuniz/received_events","type":"User","site_admin":false},"repo":{"id":56002082,"name":"pipeline-milestone-step-plugin","full_name":"amuniz/pipeline-milestone-step-plugin","owner":{"login":"amuniz","id":1017585,"avatar_url":"https://avatars.githubusercontent.com/u/1017585?v=3","gravatar_id":"","url":"https://api.github.com/users/amuniz","html_url":"https://github.com/amuniz","followers_url":"https://api.github.com/users/amuniz/followers","following_url":"https://api.github.com/users/amuniz/following{/other_user}","gists_url":"https://api.github.com/users/amuniz/gists{/gist_id}","starred_url":"https://api.github.com/users/amuniz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amuniz/subscriptions","organizations_url":"https://api.github.com/users/amuniz/orgs","repos_url":"https://api.github.com/users/amuniz/repos","events_url":"https://api.github.com/users/amuniz/events{/privacy}","received_events_url":"https://api.github.com/users/amuniz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/amuniz/pipeline-milestone-step-plugin","description":"","fork":true,"url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin","forks_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/forks","keys_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/teams","hooks_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/hooks","issue_events_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/events","assignees_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/tags","blobs_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/languages","stargazers_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/stargazers","contributors_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/contributors","subscribers_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/subscribers","subscription_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/subscription","commits_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/merges","archive_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/downloads","issues_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/labels{/name}","releases_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/amuniz/pipeline-milestone-step-plugin/deployments","created_at":"2016-04-11T19:41:43Z","updated_at":"2016-04-11T12:20:10Z","pushed_at":"2016-04-19T12:31:49Z","git_url":"git://github.com/amuniz/pipeline-milestone-step-plugin.git","ssh_url":"git@github.com:amuniz/pipeline-milestone-step-plugin.git","clone_url":"https://github.com/amuniz/pipeline-milestone-step-plugin.git","svn_url":"https://github.com/amuniz/pipeline-milestone-step-plugin","homepage":"","size":23,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"jenkinsci:master","ref":"master","sha":"24aa55cd556cc680bbf8264592c7be0524dc7919","user":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","gravatar_id":"","url":"https://api.github.com/users/jenkinsci","html_url":"https://github.com/jenkinsci","followers_url":"https://api.github.com/users/jenkinsci/followers","following_url":"https://api.github.com/users/jenkinsci/following{/other_user}","gists_url":"https://api.github.com/users/jenkinsci/gists{/gist_id}","starred_url":"https://api.github.com/users/jenkinsci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenkinsci/subscriptions","organizations_url":"https://api.github.com/users/jenkinsci/orgs","repos_url":"https://api.github.com/users/jenkinsci/repos","events_url":"https://api.github.com/users/jenkinsci/events{/privacy}","received_events_url":"https://api.github.com/users/jenkinsci/received_events","type":"Organization","site_admin":false},"repo":{"id":55969725,"name":"pipeline-milestone-step-plugin","full_name":"jenkinsci/pipeline-milestone-step-plugin","owner":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","gravatar_id":"","url":"https://api.github.com/users/jenkinsci","html_url":"https://github.com/jenkinsci","followers_url":"https://api.github.com/users/jenkinsci/followers","following_url":"https://api.github.com/users/jenkinsci/following{/other_user}","gists_url":"https://api.github.com/users/jenkinsci/gists{/gist_id}","starred_url":"https://api.github.com/users/jenkinsci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenkinsci/subscriptions","organizations_url":"https://api.github.com/users/jenkinsci/orgs","repos_url":"https://api.github.com/users/jenkinsci/repos","events_url":"https://api.github.com/users/jenkinsci/events{/privacy}","received_events_url":"https://api.github.com/users/jenkinsci/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin","description":"","fork":false,"url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin","forks_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/forks","keys_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/teams","hooks_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/hooks","issue_events_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/events","assignees_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/tags","blobs_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/languages","stargazers_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/stargazers","contributors_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/contributors","subscribers_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/subscribers","subscription_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/subscription","commits_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/merges","archive_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/downloads","issues_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/labels{/name}","releases_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/deployments","created_at":"2016-04-11T12:20:09Z","updated_at":"2016-04-11T12:20:10Z","pushed_at":"2016-04-19T12:31:49Z","git_url":"git://github.com/jenkinsci/pipeline-milestone-step-plugin.git","ssh_url":"git@github.com:jenkinsci/pipeline-milestone-step-plugin.git","clone_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin.git","svn_url":"https://github.com/jenkinsci/pipeline-milestone-step-plugin","homepage":"","size":0,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1"},"html":{"href":"https://github.com/jenkinsci/pipeline-milestone-step-plugin/pull/1"},"issue":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/1"},"comments":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/jenkinsci/pipeline-milestone-step-plugin/statuses/3dc8c7f35e48d369e7e4351680195393b3bc386b"}}}}