Revision as of 13:02, 16 April 2021 by Leinir (talk | contribs) (→‎Branching: Fix incorrect link to old repo-metadata location)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


This page documents the steps to release software packages developed by the KDE community. This guide applies to all software which is not part of a bigger bundle like Frameworks, Plasma and KDE Gear, which have specific release cycles and release managers.

Sanity Checklist

Stuff your project should have before beta or final release:

  • Have completed (or at least be going through) review in kdereview or Incubator
  • The REUSE Specification - Version 3.0 shall be applied when stating licenses and when adding license files to a project.
  • Each source file either must contain SPDX identifiers or licence headers to state under which terms the software may be used, modified and redistributed.
  • A file which extracts all the i18n() translations
  • An appinfo.xml or metainfo.xml file with AppStream data AppStream Guidelines
  • A screenshot in product-screenshots
  • Check KDE CI and other CIs such as KDE neon that it compiles successfully
  • Check the code with some sanity tools like clazy or clang-tidy, if not already done as part of CI runs.
  • Documentation appropriate to the project: API documentation, user documentation (including docbook or other format documented by the Documentation team)
  • A bugzilla product


Before you create a release, if you plan to maintain a stable branch and release bugfix version from it, branch it off of master. The name should be "$MAJOR.$MINOR" or similar, i.e. "1.2". This branch will be called "stable branch" in the text below. Push the branch to the remote repository.

git checkout -b 1.2
git push --set-upstream origin 1.2

You can also branch after making a tar using releaseme's branchme.rb script

Whenever you make a new stable branch you must e-mail kde-i18n-doc to ask for translations to also be branched and repo-metadata to be updated. Make sure you get a confirmation that your request has been handled.

For people using kdesrc-build and KDE's CI, once you have created and pushed a new stable branch you need to update also repo-metadata:

  • Change the branch name for "stable-kf5-qt5" in the the file "logical-module-structure"
  • Update dependencies listed in the file "dependency-data-stable-kf5-qt5" if needed (wildcard rules might keep you covered, explicit listing done only for non-basic needs)

When your product is covered on, after that you also need to trigger some jobs, so can catch up. For that follow this workflow.

When your product is covered on KDE's package/installer generator, after you created and pushed a new stable branch you will also need to update the configuration of craft-blueprints-kde and possibly binary-factory-tooling. The actual changes depend on the project and should be documented with them.


To prevent regressions early before a release, it is suggested to announce and enforce a "feature-freeze". From this point on, no new features should be introduced to the stable branch.

Before a release, you'll need to give translators a notification about the upcoming new version. If you created a stable branch, update kde:sysadmin/repo-metadata (read the first), set the "stable i18n branch" to the stable branch. Then write an email about one month before the release or so to the translators at on KDE i18n-doc <[email protected]> . At this point, do not do any changes to translated strings, i.e. consider your branch (or master, if you didn't create a separate branch) to be "string-frozen". If you do need a string changed, ask the translators for a string-freeze exception.

Note: Other feature branches will always be unfrozen, and any kind of strings or features can be changed/added. If you created a separate release branch, also the master branch is not frozen.

Versioning in source code and libraries

When you are ready to do a release, make sure the current HEAD in the stable branch has the correct version string set in its source code as well as the SOVERSION etc., to reflect what you want to release.

A good suggestion is to have something like this in your top-level CMakeLists.txt:

cmake_policy(SET CMP0048 NEW)
project(kgraphviewer VERSION "2.4.0")

    VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/config-kgraphviewer.h"

#usage somewhere in cmake for a library:

The config-kgraphviewer.h looks like this:

/* config-kgraphviewer.h.  Generated by cmake from config.-kgraphviewer.h.cmake */


#include <kdeversion.h>

#define KGRAPHVIEWER_MAJOR_VERSION @[email protected]
#define KGRAPHVIEWER_MINOR_VERSION @[email protected]
#define KGRAPHVIEWER_PATCH_VERSION @[email protected]

#define KGRAPHVIEWER_VERSION_STR "@[email protected]@[email protected]@[email protected]"

#define KGRAPHVIEWER_VERSION KDE_MAKE_VERSION(@[email protected], @[email protected], @[email protected])


Then you can include the generated config-kgraphviewer.h in e.g. your main.cpp and use the KGRAPHVIEWER_VERSION_STR define and similar. You can also install this file (useful for libraries to do feature-detection based on the version number).

NOTE: Don't forget to also increase the version number in master, after you branched off. I.e. as soon as you created a "1.2" branch, ensure master's source code uses a version string such as "1.2.80" which is analogous to 1.3 Alpha 1. "1.2.90" would be 1.3 Beta 1.

Versioning in AppStream files

The AppStream appdata.xml and metainfo.xml file should include the release version and date, this info will be shown in package managers such as Discover and app stores such as Flathub.

You can use the script in to add and update the release info.

Creating a Tarball

The releaseme scripts help with that.

First check you have a working gpg2 install and a key set up which can do the digital signature:

echo test > test.text; gpg2 --armor --detach-sign -o test.text.sig test.text

If that works create the tar:

./tarme.rb --version 0.1 --origin stable myapp

This will create myapp-0.1.tar.xz and its digital signature myapp-0.1.tar.xz.sig

--origin can also be trunk. It will use the Git branch set in trunk_kf5 or stable_kf5 in the i18n.json file in your project's repo_metadata

Uploading the Tar

Read readme:

Upload to, for example via curl

 curl -T "myapp-0.1.tar.xz{,.sig}"

or via the traditional ftp command line program:

 echo put myapp-0.1.tar.xz | ftp
 echo put myapp-0.1.tar.xz.sig | ftp

Then, file a sysadmin ticket to notify about the upload and to provide the checksums for verification:


When you publish your tar you should also push the signed tag to the Git repo.

./tagme.rb --version 0.1

This uses git running gpg to tag, you may need to set with (see

 git config --global user.signingkey

test with

 git init; echo asdf > asdf; git add asdf; git commit -a -m 'commit'; git tag -s -m 'Tagging #{options[:version]}' v123 HEAD

Updating bugzilla

The new version should be added to the list of available versions to the component/product. If you don't have enough permissions, create a sysadmin ticket for that, or ask this a part of the ticket created for the tarballs (see #Uploading_the_Tar)

Announcing the Release

Once the sysadmins moved the tarball, you can announce the release. First send a mail to [email protected] and your project's mailing list(s). The mail can be short and link to a longer announcement blog post or news item. If you write a detailed blog post, make sure that that your blog/site is aggregated on

You should include the full fingerprint to the GPG key used to sign the tar and tags in your announce e-mail. (Don't put it on a wiki.) Upload your key to openPGP key servers using gpg2 --send-keys <fingerprint>

Ideally you also want to sign your email with the key in question to proof that you have control over the key.

This page was last edited on 16 April 2021, at 13:02. Content is available under Creative Commons License SA 4.0 unless otherwise noted.