Release Checklist
This is our internal Release Checklist which describes all steps that need to be executed before, during and after the release of a app version. We publish the checklist so you can get a feel of how much work and effort we put into a release. Software quality is one of our main goals which we achieve by standardized processes, high automation and a bunch of manual tests.
{ "name": "Customfield Editor for Jira - Release Checklist", "version": "1.5.4", "releaseCandidate": "rc1", "stages": [ { "name": "Pre-Release", "blocks": [ { "name": "Local Workstation Checks", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "pom.xml version corresponds to actual release version e.g. 1.3.0", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "mvn compile and atlas-package did successfully run. `swagger.json` is generated and comitted.", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "master branch is clean.", "check": null } ] }, { "name": "Continuous Integration Checks", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully trigger build for „master“ branch", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully build and package", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully execute REST-API Tests", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully execute E2E Tests", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins Job console had no errors or exceptions", "check": null } ] }, { "name": "Publish Release Candidate & Assets", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Publish GitHub Release with Tag from Master and convention `customfield-editor-plugin-1.3.0-rc1`", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Publish GitHub Release with Tag from Master and convention `customfield-editor-plugin-test-data-creator-1.3.0`", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully trigger build for „*-rc*“ tag", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully build and package", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully execute REST-API Tests", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins did successfully execute E2E Tests", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins Job console had no errors or exceptions", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `customfield-editor-plugin-1.3.0.jar` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `customfield-editor-plugin-1.3.0.obr` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `unit-tests-testsuite-results.xml` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `e2e-testsuite-results.xml` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `rest-api-testsuite-results-tdd.xml` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `rest-api-testsuite-results-bdd.xml` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `swagger.json` as Release Asset", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins published `preconditions-test-data.md` as Release Asset", "check": null } ] } ] }, { "name": "Release Documentation", "blocks": [ { "name": "Documentation Pages", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "New version of static documentation pages is created", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Build Assets are included in static page build: swagger.json, e2e-testsuite-results.xml, preconditions-test-data.md, rest-api-testsuite-results-tdd.xml, rest-api-testsuite-results-bdd.xml, rest-api-testsuite-results-bdd.md.", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "rest-api-testsuite-results-bdd.md => change feature to h3, scenario to h4; remove TOC.", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "REST-API-Doc page: Swagger with Markdown desc. ok; Collapse/Exand Endpoints; Deeplink Endpoints;", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Testsuite Results page: TDD, BDD and E2E Results render correctly (XML,MD to HTML)", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins builds and published Documentation without errors", "check": null } ] }, { "name": "Release Notes & REST API Changes", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Releasenotes page created", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Release Notes contain special hints for REST API Changes", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "REST API Doc page includes Upgrade Notes and detailed breaking Rest API Changes Hints", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Release Notes contain all Bugixes and new Features with Feature Issue ID", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Release Notes contain version Range for Jira compatibility and Release Date", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Jenkins builds and published Documentation without errors", "check": null } ] } ] }, { "name": "Manual GUI & Installation Tests", "blocks": [ { "name": "Jira DataCenter Installation Smoke Test", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Setup Jira DataCenter dockerized for specific Jira Version with two cluster nodes", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Update UPM", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Install ReleaseCandidate plugin jar via upload", "testData": [], "expectedResult": "Installation works with no errors", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "GoTo REST Api Explorer Page - Authenticate as user - Query /admin/customfields", "testData": [ { "key": "user", "value": "admin"} ], "expectedResult": "Result is HTTP 200 with list of customfields (for node1 and node2)", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "GoTo REST Api Explorer Page - Expand /admin/customfields/10012/contexts", "testData": [ ], "expectedResult": "Check that *expand* parameter contains: `projects` ; `projects,issueTypes` ; `issueTypes`", "check": null } ] }, { "name": "Browser Smoke Test: Microsoft Internet Explorer 11 on Windows 8.1", "steps": [ { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Create a cascding customfield via Jira Administration interface", "testData": [ { "key": "name", "value": "cascading1" } ], "expectedResult": "field is created", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Permission Editor List Page: navigate to page", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Page loads and shows customfields. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Permission Editor Edit Page: click on 'cascading1' fields edit button on list page", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Edit page loads and shows permissions for customfield. Shows context permissions. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Permission Editor Edit Page: add admin as user to global permissions", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Save successful. After reload page admin is shown in permission list. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "REST Api Explorer Page: navigate to page", "testData": [ ], "expectedResult": "Swagger UI is loading. JS Console has no errors.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "REST Api Explorer Page: Authenticate as user - Execute GET /user/customfields", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Response is HTTP 200 and contains 'cascading1' field.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor List Page: navigate to page", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Page is loading and shows customfields. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor List Page: click on 'cascading1' customfield context edit button", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Field Editor Edit Page is loading and shows customfield with options. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: click on delete option", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Dialog opens. Click confirm. Option is deleted. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: click on sort options", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Dialog opens. Select lcoale. Click sort. Option is deleted. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: click on set default option", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Default option shows in top right corner. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: drag-and-drop move option", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "order works; after page reload order is persistent; JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: create option (duplicate check)", "testData": [ { "key": "value", "value": "foo123" }, { "key": "value", "value": "foo123" } ], "expectedResult": "option created; cannot create duplicate; JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Field Editor Edit Page: click on childoptions (cascading)", "testData": [ { "key": "locale", "value": "en_EN" }, { "key": "locale", "value": "de_DE" } ], "expectedResult": "Dialog with childoptions opens. JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Global Settings Page: navigate to page", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Setting is shown (radio buttons). JS Console has no errors. I18n displays correct Umlauts.", "check": null }, { "type": "ChecklistStageBlockStepTestCase", "touched": false, "action": "Global Settings Page: change global setting", "testData": [ { "key": "user", "value": "admin" } ], "expectedResult": "Success message is shown. After page reload setting is persistent. JS Console has no errors. I18n displays correct Umlauts.", "check": null } ] } ] }, { "name": "Stage Release", "blocks": [ { "name": "Documentation Pages", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "User Guide, Administrator Guide and Release Notes reflect Release Content", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Click through all pages on the lookout for errors. Click all videos if they play", "check": null } ] }, { "name": "GitHub Tagging of actual Release", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Publish GitHub Release with Tag from Master and convention `customfield-editor-plugin-1.3.0`", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Link the latest Release Candidate in the release description (assets are taken from rcX; build once!)", "check": null } ] }, { "name": "Atlassian Marketplace", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Create new Version in Atlassian Marketplace. Edit all Links in summary and change version in URLs.", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Upload JAR of release candidate associated with release", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Select compatible versions (as in release notes)", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Copy Paste Releasenotes from doc. Check links. Shorten a bit.", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Publish release", "check": null } ] } ] }, { "name": "Post-Release", "blocks": [ { "name": "Cleanup Actions", "steps": [ { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Insert actual Release Date in Release Notes (if not done already)", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "bump version of pom.xml (if not done already)", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Check all public GitHub issues, comment and close them with link to release", "check": null }, { "type": "ChecklistStageBlockStepSimple", "touched": false, "name": "Set /latest/ redirect of static documentation to release version", "check": null } ] } ] } ] }