Remove the release dashboard for the release plan

Hello all,

In the release plan template we have a step to create a release dashboard for the released version.
This step is currently a time-consuming manual process that is:

  1. Hard to automate (I haven’t dug much, but this is my current understanding)
  2. Hard to replace, I looked into using Jira macros, but this is quite some work, involving improvements of the Jira macros.

In addition, while I don’t have usage statistics, I think this dashboard is really rarely used. For sure by me, but also by colleagues I discussed the matter with.

So my proposal is to remove the dashboard creation steps from the release plan template, and to remove the dashboard line from the release note template.

Of course, we can wait for someone to realize it is missing, and to ask them what exactly they are using the dashboard for. Based on that information, we can decide how to best communicate the missing information to the community.

WDYT?

+1 to remove it for several reasons:

  • As you said, I doubt it’s much used
  • We want to migrate to OP and it doesn’t have the feature needed for these graphs
  • If someone is interested by stats, we could probably provide them as part of a more generic dashboard such as Loading... but not just for bugs.

I think that for now, we could still keep the cycle dashboard, once per year (until we move to OP and we’ll look for an equivalence - there are some graphs available).

However, I’m -1 to remove the line from the RN pages as we need to provide a link to all the jira issues fixed by an XWiki release. So rather than removing it, we should replace it with a JQL listing all the fixed jiras for the release.

Thx

+1

+1

LGTM +1

+1

Thanks,
Marius

Thanks all, since we have a general agreement, I propose to apply the decision by:

Update the release note template to replace the dashboard link to " Full list of issues fixed for <final version here even for RC, e.g. 10.5>"
Update the release plan help to:

  1. Mark the dashboard creation step as deprecated as we did for the Update Translations step
  2. Add a new section detailing the url to use for the full list link. A query like component != "Development Issues only" AND project in (XCOMMONS, XRENDERING, XWIKI) AND fixVersion in (18.8.0-rc-1, 18.8.0) producing a link such as Loading...
    Update the release plan template to say “Update the link to the full list of issue for the version”

For the URL to the full list I actually see two options:

  • Option 1: write the query in the url (e.g., Loading...)
  • Option 2: ask the RM to save the query as a filter, then use the filter ID in the URL (e.g., Loading...)

Option 2 is slightly more work, but allows updating the query while keeping a stable URL.
+1 for option 2 especially because I think we can later automate this step but creating:

  1. Creating the filter programmatically
  2. Saving the URL to the list of all issues in a structured data in the Release Note app (later saving a link to Open Project, once the migration done).

WDYT?

I don’t really understand, what you mean here. Both versions are stable, it’s just that one is explicit and the other is hidden behind an id.

To me, the id based one is just useless work since we can easily generate the right URL in the page (like we do currently in bugfix releases notes for pretty much the same need).

I’m anticipating the moment where I’ll forget to put the right excluded versions and will fix it later.

Indeed, I did not have in mind the case of releases notes where you have to exclude some versions.

Still it feels simpler to take care of that directly in the release note page than having to create a jira filter. I don’t think it’s a big problem that the URL changes in the release note if you forgot to put the excludes initially.

I would also prefer to take this opportunity to limit as much as we can dependencies on jira specific things (like issues filters), since we are going to get rid of it.

We shouldn’t burden the RM with this. We know the version already so it’s easy to automate it. As we already do for displaying blockers issues and more.

And yes if there’s a need to update it, it can be updated when editing the page but it should be generated IMO

Edit: I see Thomas said the same thing. I’m in agreement.

Note that it wouldn’t be necessary at all for bugfix releases since for those we already display directly in the RN the full list of issues.

Edit: the exclusion rule below is wrong, as Michael pointed out: only the bugfix releases of the previous branch must be excluded. See the corrected rule and code.

The excludes can be computed, so the RM never has to think about them. The rule is: exclude every version released before the cycle’s first release (RC1, or the final when there’s no RC). An issue carrying such a version already shipped in a bugfix release. Version names and release dates are all it needs, and the Release Notes app already has both (each ReleaseNotes.Code.ReleaseNoteClass object holds version, date and released). So the RN template can generate the link from the version alone, as Thomas suggested, with no call to JIRA. Excluding every version released in the 6 months before RC1 is enough, and excluding a version that no issue carries is harmless.

I checked it against 17.5.0, 18.6.0, 18.7.0 and 18.8.0: it returns exactly the issues not already shipped (65, 87, 82 and 87). For example, for 18.8.0: full list of issues fixed in XWiki 18.8.0.

It also shows the manual approach isn’t working. The 18.7.0 and 18.8.0 dashboards have no excludes and count 24 and 27 issues that had already shipped in 18.4.x/17.10.x, about 25% too many. The 17.5.0 filter excluded 17.4.1 but missed 16.10.9 and 17.4.0.

As Simon said, bugfix releases don’t need this: their RN already lists fixVersion = X.Y.Z.

Here’s a proposal for the RN template, replacing the dashboard line. (Superseded by the corrected code.) It reuses the variables the template already sets and needs script rights only. It should be reviewed before being used: it was generated with Claude and hasn’t been tested on a wiki yet (only its logic was checked, against the live RN data and JIRA):

Velocity code (superseded, implements the wrong rule)
{{velocity}}
#set ($rnClass = 'ReleaseNotes.Code.ReleaseNoteClass')
#if ($isBugFix)
  #set ($cycle = [$version])
  #set ($start = $rnObject.getValue('date'))
#else
  ## The cycle: this version's RCs and its final (18.8.0-rc-1, 18.8.0), whatever exists of them.
  #set ($cycleQuery = $services.query.xwql("select obj.version, obj.date from Document doc, doc.object($rnClass) obj where obj.product = :product and (obj.version = :final or obj.version like :pre)"))
  #set ($cycleQuery = $cycleQuery.bindValue('product', $product).bindValue('final', $versionPrefix))
  #set ($cycleQuery = $cycleQuery.bindValue('pre').literal("${versionPrefix}-").anyChars().query())
  #set ($cycle = [])
  #set ($start = $NULL)
  #foreach ($row in $cycleQuery.execute())
    #set ($discard = $cycle.add($row[0]))
    #if ($row[1] && (!$start || $row[1].before($start)))
      #set ($start = $row[1])
    #end
  #end
#end
#if (!$start)
  #set ($start = $datetool.date)
#end
## 6 months before the cycle's first release
#set ($from = $datetool.toDate($mathtool.sub($start.time, 15811200000)))
#set ($excluded = $services.query.xwql("select obj.version from Document doc, doc.object($rnClass) obj where obj.product = :product and obj.released = 1 and obj.date < :start and obj.date >= :from order by obj.version").bindValue('product', $product).bindValue('start', $start).bindValue('from', $from).execute())
#set ($jql = "component != ""Development Issues only"" AND project in (XCOMMONS, XRENDERING, XWIKI) AND fixVersion in ($stringtool.join($cycle, ', '))")
#if (!$isBugFix && !$excluded.isEmpty())
  #set ($jql = "$jql AND fixVersion not in ($stringtool.join($excluded, ', '))")
#end
[[Full list of issues fixed in $product $versionPrefix>>https://jira.xwiki.org/issues/?jql=$escapetool.url($jql)]].
{{/velocity}}

I’d suggest packaging this as a wiki macro (e.g. {{jiraFixedIssuesFor version="$version"/}}), like {{jiraBlockersFor}}, so the template keeps a single line and the rule lives in one place. It’s also a good candidate for the async macro, with caching. The result changes only when a release note’s date or released flag changes, and it’s frozen once the cycle is released. Caching it keyed on the version means the queries run once, not on every view of every release note page.

WDYT?

Thx

Excluding those issues doesn’t make any sense to me. For 18.7.0, we should exclude issues shipped in a potential 18.6.1 that was released before 18.7.0, but not issues shipped in 18.4.x or 17.10.x. We agreed on this already in How to handle previous version at release time - Take 2 - I don’t think we should change this again.

You’re right, sorry, I mixed up “first shipped anywhere” with what we agreed in https://forum.xwiki.org/t/how-to-handle-previous-version-at-release-time/16873: the RN compares with the previous version, so only the bugfix releases of the previous branch get excluded. That means the 18.7.0/18.8.0 dashboards were correct, and the 17.5.0 filter was too. I’ve struck through those statements in my previous post.

The good news is that the agreed rule is just as easy to generate: the previous branch comes from the version (X.(Y-1) for X.Y.0, (X-1).10 for X.0.0), and we exclude its released bugfix versions dated before this cycle’s RC1. Checked against JIRA, it reproduces the examples from the threads: 17.2.1 and 17.2.2 for 17.3.0, 17.4.1 for 17.5.0, 17.10.1 and 17.10.2 for 18.0.0, and nothing for 18.6.0 to 18.8.0.

Corrected code below. Same caveat: it should be reviewed before being used, it was generated with Claude and hasn’t been tested on a wiki yet.

Velocity code
{{velocity}}
## Rule agreed in https://forum.xwiki.org/t/how-to-handle-previous-version-at-release-time/16873 (option 2):
## the release notes compare with the previous version, so the issues also fixed in a bugfix release of the
## previous branch (17.4.x for 17.5.0, 17.10.x for 18.0.0) released before this cycle are excluded.
#set ($rnClass = 'ReleaseNotes.Code.ReleaseNoteClass')
#if ($isBugFix)
  #set ($jql = "component != ""Development Issues only"" AND project in (XCOMMONS, XRENDERING, XWIKI) AND fixVersion in ($version)")
#else
  ## The cycle: this version's RCs and its final (18.8.0-rc-1, 18.8.0), whatever exists of them.
  #set ($cycleQuery = $services.query.xwql("select obj.version, obj.date from Document doc, doc.object($rnClass) obj where obj.product = :product and (obj.version = :final or obj.version like :pre)"))
  #set ($cycleQuery = $cycleQuery.bindValue('product', $product).bindValue('final', $versionPrefix))
  #set ($cycleQuery = $cycleQuery.bindValue('pre').literal("${versionPrefix}-").anyChars().query())
  #set ($cycle = [])
  #set ($start = $NULL)
  #foreach ($row in $cycleQuery.execute())
    #set ($discard = $cycle.add($row[0]))
    #if ($row[1] && (!$start || $row[1].before($start)))
      #set ($start = $row[1])
    #end
  #end
  ## A release note not dated yet is being written: nothing released after today can be excluded anyway.
  #if (!$start)
    #set ($start = $datetool.date)
  #end
  ## The previous branch: 17.4 for 17.5.0, 17.10 for 18.0.0.
  #if ($versionParts[1] == '0')
    #set ($previousBranch = "$mathtool.sub($versionParts[0], 1).10")
  #else
    #set ($previousBranch = "${versionParts[0]}.$mathtool.sub($versionParts[1], 1)")
  #end
  ## Its bugfix releases (17.4.1, 17.4.2...), not its .0 nor its RCs, released before this cycle.
  #set ($excludedQuery = $services.query.xwql("select obj.version from Document doc, doc.object($rnClass) obj where obj.product = :product and obj.released = 1 and obj.date < :start and obj.version like :branch and obj.version not like '%-%' and obj.version <> :branchZero order by obj.version"))
  #set ($excludedQuery = $excludedQuery.bindValue('product', $product).bindValue('start', $start))
  #set ($excludedQuery = $excludedQuery.bindValue('branchZero', "${previousBranch}.0"))
  #set ($excludedQuery = $excludedQuery.bindValue('branch').literal("${previousBranch}.").anyChars().query())
  #set ($excluded = $excludedQuery.execute())
  #set ($jql = "component != ""Development Issues only"" AND project in (XCOMMONS, XRENDERING, XWIKI) AND fixVersion in ($stringtool.join($cycle, ', '))")
  #if (!$excluded.isEmpty())
    #set ($jql = "$jql AND fixVersion not in ($stringtool.join($excluded, ', '))")
  #end
#end
[[Full list of issues fixed in $product $versionPrefix>>https://jira.xwiki.org/issues/?jql=$escapetool.url($jql)]].
{{/velocity}}

The wiki macro + async/cache suggestion from my previous post still stands.

Thx