14.6. Releasing CamCOPS¶
The tools/release_new_version.py script will do most of the work required to
create a new release of the CamCOPS client and/or server. To see the options
available to this script, run it without any arguments. The script will advise
you on what needs to change before it can build the new release. To create new
versions of the CamCOPS client, the script needs to be run on:
Linux (for Linux and 32/64-bit Android builds)
Windows (for Windows 32/64-bit Windows builds)
MacOS (for MacOS and iOS builds)
The builds are created under tablet_qt/build/<version>/qt_<qt_version>_<platform>
When a git tag with a new release version number (e.g. v2.4.23) is pushed to GitHub, an automated workflow will create the new release with the server DEB and RPM files as artifacts. The client binaries can then be uploaded manually as artifacts to the same release.
14.6.1. Code and documentation¶
When the GitHub repository https://github.com/ucam-department-of-psychiatry/camcops is updated with a new version tag, the stable version of the docs at https://camcops.readthedocs.io/ is updated automatically. Pushing code to the master branch will update the latest version of the docs.
14.6.2. Android client¶
The tools/release_new_version.py script will create and sign the Android APK
files and place them in
tablet_qt/build/<version>/qt_<qt_version>_<platform>/android-build/build/outputs/apk/release.
14.6.2.1. Google Play Store settings¶
Developer URL is https://play.google.com/console/developers
Content rating: by Google’s definitions, CamCOPS hits criteria for references to illegal drugs (e.g. Deakin1HealthReview, and when strings are available, the various drug abuse scoring scales). Did not meet Google Play’s criteria for sex, violence, etc.
Note that “Pending publication” means you’re waiting for Google Play to sort itself out, not that you have to do anything.
Note re versions:
The Google Developer site will check the version codes.
You upload a new version with .
You can upload two files with the same name (e.g.
android-build-release-signed.apk) – for example, one for 32-bit ARM (armeabi-v7a) and one for 64-bit ARM (arm64-v8a). But they can’t have the same version number. See https://developer.android.com/google/play/publishing/multiple-apks.html. What Google prefer is an “Android App Bundle”. Qt might not support this yet: https://www.qt.io/blog/2019/06/28/comply-upcoming-requirements-google-play. The 64-bit version should have the higher version number. (You upload both APK files before saving/reviewing/rolling out the single release.)If an upload fails validation, you should be able to delete the APK file from and re-upload a fixed APK with the same version code.
Note also that if you try to install the
.apkdirectly to a device that’s had an installation from Google Play Store, you’ll get the error INSTALL_FAILED_UPDATE_INCOMPATIBLE (I think). Or if you mix debug/release versions.Finally, note that there can be a significant delay between uploading a new release and client devices seeing it on Google Play (or even being able to see it at https://play.google.com/store, or via the direct link at https://play.google.com/store/apps/details?id=org.camcops.camcops). Perhaps 10 minutes to the main web site?
14.6.2.2. Google Play Store release history¶
The minimum and target SDK versions are specified in the camcops.pro project
file. See ANDROID_MIN_SDK_VERSION and ANDROID_TARGET_SDK_VERSION.
Google Play Store release name |
AndroidManifest.xml version code |
AndroidManifest.xml name |
To Play Store on |
Minimum Android API |
Target Android API |
|---|---|---|---|---|---|
2.0.1 (beta) |
2 |
2.0.1 |
2017-08-04 |
16 |
23 |
2.0.4 (beta) |
3 |
2.0.4 |
2017-10-22 |
16 |
23 |
2.2.3 (beta) |
5 |
2.2.3 |
2018-06-25 |
16 |
26 |
2.2.4 (beta) |
6 |
2.2.4 |
2018-07-18 |
23 |
26 |
2.2.6 (beta) |
7 |
2.2.6 |
2018-07-31 |
23 |
26 |
2.2.7 |
8 |
2.2.7 |
2018-08-19 |
23 |
26 |
2.2.8 to 2.3.0 |
N/A, internal only |
N/A, internal only |
N/A, internal only |
N/A |
N/A |
2.3.1 |
9 |
2.3.1 |
2019-03-24 |
23 |
26 |
2.3.2 |
10 |
2.3.2 |
2019-04-05 |
23 |
26 |
2.3.3 |
11 |
2.3.3 |
2019-06-15 |
23 |
26 |
2.3.4 |
12 |
2.3.4 |
2019-06-21 |
23 |
26 |
2.4.1 |
15 (32-bit ARM); 16 (64-bit ARM) |
2.4.1 |
2021-02-10 |
23 |
29 |
2.4.2 |
N/A, identical to 2.4.3 |
N/A |
N/A |
N/A |
N/A |
2.4.3 |
17 (32-bit ARM); 18 (64-bit ARM) |
2.4.3 |
2021-03-30 |
23 |
29 |
2.4.4 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.5 |
N/A, macOS only |
N/A |
N/A |
N/A |
N/A |
2.4.6 |
19 (32-bit ARM); 20 (64-bit ARM) |
2.4.6 |
2021-05-08 |
23 |
29 |
2.4.7 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.8 |
21 (32-bit ARM); 22 (64-bit ARM) |
2.4.8 |
2021-07-15 |
23 |
29 |
2.4.9 |
23 (32-bit ARM); 24 (64-bit ARM) |
2.4.9 |
2021-08-10 |
23 |
29 |
2.4.10 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.11 |
25 (32-bit ARM); 26 (64-bit ARM) |
2.4.11 |
2021-10-08 |
23 |
29 |
2.4.12 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.13 |
27 (32-bit ARM); 28 (64-bit ARM) |
2.4.13 |
2022-08-19 |
23 |
30 |
2.4.14 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.15 |
29 (32-bit ARM); 30 (64-bit ARM) |
2.4.15 |
2023-03-27 |
23 |
31 |
2.4.16 |
31 (32-bit ARM); 32 (64-bit ARM) |
2.4.16 |
2023-06-15 |
23 |
31 |
2.4.17 |
33 (32-bit ARM); 34 (64-bit ARM) |
2.4.17 |
2023-08-21 |
23 |
33 |
2.4.18 |
41 (32-bit ARM); 42 (64-bit ARM) |
2.4.18 |
2024-02-08 |
23 |
33 |
2.4.19 |
47 (32-bit ARM); 48 (64-bit ARM) |
2.4.19 |
2024-06-27 |
23 |
33 |
2.4.20 |
49 (32-bit ARM); 50 (64-bit ARM) |
2.4.20 |
2024-08-14 |
23 |
34 |
2.4.21 |
N/A, server only |
N/A |
N/A |
N/A |
N/A |
2.4.22 |
51 (32-bit ARM); 52 (64-bit ARM) |
2.4.22 |
2025-07-16 |
23 |
33 |
2.4.23 |
53 (32-bit ARM); 54 (64-bit ARM) |
2.4.23 |
2025-09-01 |
23 |
35 |
2.4.24 |
55 (32-bit ARM); 56 (64-bit ARM) |
2.4.24 |
2026-01-23 |
23 |
35 |
14.6.3. iOS client¶
To deploy to the Apple Store:
Start Xcode with
open camcops.xcodeprojfromtablet_qt/build/<version>/qt_<qt_version>_ios_armv8_64. This will ensure any of your environment variables are available to Xcode.Set the Active scheme to be Any iOS Device (arm64)
Archive the project (Product -> Archive)
Select the Archive and then Distribute App to App Store Connect, accepting all the defaults
The progress bar may show 100% throughout the upload but you can watch the java process on the Network tab of the Activity Monitor.
Validate App does not run the same set of tests as the App Store does. Even if after half an hour your package is successfully uploaded to App Store Connect there may still be problems, of which you will be notified by email several minutes later.
If you want to debug the .ipa file sent to App Store Connect, choose the “Export” option. It’s a zip file.
The archive process will result in a broken symlink when you next build the project in QtCreator (error message mkdir failed). You can just delete it.
14.6.4. MacOS client¶
The tools/release_new_version.py script will create camcops.dmg under
tablet_qt/build\<version>/qt_<qt_version>_macos_x86_64 and this can be
uploaded to the GitHub release assets.
14.6.5. Windows client¶
The tools/release_new_version.py script will package the client via Inno Setup.
To sign the installer executable you’ll need a valid certificate and SignTool.
Upload the executable from the distributables directory to the
GitHub release assets.
14.6.6. Server¶
The tools/release_new_version.py script will upload the new version of the
CamCOPS Server to PyPI. the DEB and RPM files are created automatically by the
GitHub release workflow when the version tag is pushed.