Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ The `.github/skills/` directory contains domain-specific knowledge files:
| `documentation.md` | All documentation locations (docs/, README.md, CONTRIBUTING.md, setup.py), page map, and checklist for keeping docs in sync when features change |
| `js-patterns.md` | How JavaScript code is currently structured in this project: module layout, variable placement, naming patterns, GridStack/Chart.js usage |
| `js-coding-standards.md` | Rules for writing JavaScript: naming conventions, where to put variables, function patterns, scope, localStorage, DOM access |
| `release-actions.md` | **Step-by-step release workflow** — bump version, update test fixtures, regenerate example dashboard/database, update changelog, produce Slack notes |

---

Expand Down
166 changes: 166 additions & 0 deletions .github/skills/release-actions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
---
description: Use when the user says "Do the release actions" or asks to prepare a new release. Covers all steps to bump the version, update tests, regenerate the example, update the changelog, produce Slack notes, and create a skill.
---

# Release Actions

Follow these steps in order when doing a release. Ask the user for the **new version number** and **changelog content** (list of PRs/changes from GitHub) before starting if they haven't been provided.

---

## Step 0 — Collect inputs

Ask the user (if not already provided):
1. **New version number** (e.g. `2.1.0`)
2. **Previous version number** (e.g. `2.0.0`) — used for the GitHub compare URL
3. **Release date** in `YYYY-MM-DD` format (default: today)
4. **Raw changelog** — the GitHub "What's Changed" PR list for this release

---

## Step 1 — Update version numbers

Files to update:

| File | What to change |
|---|---|
| `robotframework_dashboard/version.py` | `__version__ = "Robotdashboard X.Y.Z"` |
| `setup.py` | `version="X.Y.Z"` |

Both must use the exact same new version number.

---

## Step 2 — Update the CLI test expected output

File: `tests/robot/resources/cli_output/version.txt`

The last line of this file is the version string that the robot test compares against the CLI `--version` output. Update it to:
```
Robotdashboard X.Y.Z
```

Do not change the ASCII art banner lines above it.

---

## Step 3 — Regenerate the example dashboard and database

The example dashboard and database live in `example/robot_dashboard.html` and `example/robot_results.db`.

Run these commands from the repo root:

```bat
:: Windows
if exist robot_results.db del robot_results.db
if exist robot_dashboard.html del robot_dashboard.html
scripts\example.bat
copy robot_results.db example\robot_results.db
copy robot_dashboard.html example\robot_dashboard.html
```

```bash
# Linux / macOS
rm -f robot_results.db robot_dashboard.html
bash scripts/example.sh
cp robot_results.db example/robot_results.db
cp robot_dashboard.html example/robot_dashboard.html
```

The `scripts/example.bat` (or `.sh`) script imports all test `output.xml` files with various tags and options to create a rich example dashboard.

---

## Step 4 — Update CHANGELOG.md

Insert a new section **at the top** of the changelog (after the header block, before the previous latest version). Match the existing style exactly.

**Template:**
```markdown
## [X.Y.Z](https://github.com/MarketSquare/robotframework-dashboard/releases/tag/vX.Y.Z) - YYYY-MM-DD

### Added
- <feature description>

### Fixed
- <fix description>

### Changed
- <change description>

---
```

Rules:
- Only include `### Added`, `### Fixed`, `### Changed` sections that are non-empty.
- Write human-readable bullet points — do not paste the raw PR titles verbatim. Rewrite them as clear, user-facing descriptions.
- Omit contributor attribution and PR URLs (those belong on GitHub Releases, not the changelog).
- Use backticks for CLI flags, file names, and code references.

---

## Step 5 — Generate Slack release notes

Produce a ready-to-paste Slack message. Be **verbose** — explain how each feature works with a short example where helpful, and link to the relevant documentation page.

Documentation base URL: `https://marketsquare.github.io/robotframework-dashboard/`

Key doc pages and their slugs:
- `filtering.html` — filters, tag modes (AND/OR/NOT), custom filters, versions
- `log-linking.html` — log URL support, `--uselogs` flag
- `basic-command-line-interface-cli.html` — CLI flags, `--customfilters`, output import
- `listener-integration.html` — listener, standalone push script
- `customization.html` — layout, undo/redo, GridStack
- `performance.html` — benchmarking, scale data
- `graphs-tables.html` — charts, data tables, horizontal scrolling
- `settings.html` — settings modal, themes, widget toggles

**Shout out external contributors** — scan all PR entries for authors who are *not* `@timdegroot1996` and call them out by name with a :pray: in the relevant bullet or in a dedicated thanks line.

Format:

```
:robot: *Robot Framework Dashboard vX.Y.Z is out!* :tada:

<one-line summary of the release theme>

---

*:new: Added*

• *<Feature name>* — <2–3 sentences explaining what it does and why it's useful. Include a short code example if applicable.> → <docs link>

*:wrench: Fixed*

• <fix description>. Thanks *@contributor* for the fix! :pray:

*:arrows_counterclockwise: Changed*

• <change description>

---

*:bookmark: Resources*
Full changelog: <compare URL>
PyPI: <pypi URL>
Docs: https://marketsquare.github.io/robotframework-dashboard/
Example dashboard: https://marketsquare.github.io/robotframework-dashboard/example/robot_dashboard.html
```

---

## Step 6 — Update the copilot instructions (optional)

If a **new skill file** was created as part of this release, add it to the skills table in `.github/copilot-instructions.md`.

---

## Quick checklist

- [ ] `robotframework_dashboard/version.py` — version updated
- [ ] `setup.py` — version updated
- [ ] `tests/robot/resources/cli_output/version.txt` — version string updated
- [ ] `example/robot_dashboard.html` — regenerated
- [ ] `example/robot_results.db` — regenerated
- [ ] `CHANGELOG.md` — new section added at the top
- [ ] Slack release notes produced
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,29 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## [2.0.0](https://github.com/MarketSquare/robotframework-dashboard/releases/tag/v2.0.0) - 2026-05-16

### Added
- Statistical widgets for runs, suites, tests, and keywords — summary cards shown across dashboard sections
- Information icon (SVG) added to dashboard labels for contextual hints
- Log URL support — log file links can now be passed and displayed alongside run results
- Standalone script to push existing `output.xml` files to a running dashboard server
- Custom filters in output data processing — pass arbitrary key=value filters at import time
- NOT tag filter — negate tag conditions in the filter dialog
- Undo/redo functionality for layout changes — revert or reapply GridStack layout modifications
- Statistical benchmarking support for performance tracking across runs

### Fixed
- Exit code changed to `1` in `robotdashboardlistener` on error, enabling correct CI failure detection
- Docker Python-test image now hardcodes Ubuntu tag for reproducible builds

### Changed
- Horizontal scrolling enabled for all data tables, improving usability on smaller screens
- Overview bars now ordered correctly across all project sections
- Additional acceptance tests added for the overview page

---

## [1.9.0](https://github.com/MarketSquare/robotframework-dashboard/releases/tag/v1.9.0) - 2026-04-15

### Added
Expand Down
23 changes: 14 additions & 9 deletions example/listener/robotdashboardlistener.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@
# pabot --testlevelsplit --listener robotdashboardlistener.py:output=custom_output.xml -o custom_output.xml tests.robot
#
# Parameters:
# tags=tag1,tag2 - Comma-separated tags for the run
# version=v1.2.3 - Version label (e.g., software version)
# uploadlog=true - Upload log file to server (default: false)
# host=127.0.0.1 - Server hostname (default: 127.0.0.1)
# port=8543 - Server port (default: 8543)
# protocol=http - Protocol to use: 'http' or 'https' (default: http)
# sslverify=true - Verify SSL certificates for HTTPS: 'true', 'false', or path to CA bundle (default: true)
# limit=100 - Max runs in database; auto-delete oldest (default: 0 = unlimited)
# output=custom.xml - Custom output filename (required for pabot with custom -o)
# tags=tag1,tag2 - Comma-separated tags for the run
# version=v1.2.3 - Version label (e.g., software version)
# uploadlog=true - Upload log file to server (default: false)
# host=127.0.0.1 - Server hostname (default: 127.0.0.1)
# port=8543 - Server port (default: 8543)
# protocol=http - Protocol to use: 'http' or 'https' (default: http)
# sslverify=true - Verify SSL certificates for HTTPS: 'true', 'false', or path to CA bundle (default: true)
# limit=100 - Max runs in database; auto-delete oldest (default: 0 = unlimited)
# output=custom.xml - Custom output filename (required for pabot with custom -o)
# customfilters=key=val:key=val - Custom filter key=value pairs (colon-separated)
#
# Features:
# - Output files are gzip-compressed and sent to /add-output-file
Expand All @@ -48,6 +49,7 @@ def __init__(
version: str = None,
uploadlog: bool = False,
output: str = None, # this option is only required when using pabot and a custom output.xml name!
customfilters: str = None, # custom filter key=value pairs (colon-separated, e.g. key=val:key=val)
):
self.host = host
self.port = port
Expand All @@ -58,6 +60,7 @@ def __init__(
self.version = version
self.uploadlog = str(uploadlog).lower() == "true"
self.output = output if output != None else "output.xml"
self.customfilters = customfilters
self.path: str
self.log_path: str
self.last_execution: str
Expand Down Expand Up @@ -128,6 +131,8 @@ def _add_output_to_database(self, path: str):
form_data = {"tags": tags}
if self.version:
form_data["version"] = self.version
if self.customfilters:
form_data["custom_filters"] = self.customfilters
try:
with open(path, "rb") as output_file:
compressed_output = compress(output_file.read())
Expand Down
Loading
Loading