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 ‣ CamCOPS ‣ Test and release ‣ Production ‣ Create new release.

    • 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 ‣ CamCOPS -> Test and release ‣ Production ‣ Latest releases and bundles and re-upload a fixed APK with the same version code.

  • Note also that if you try to install the .apk directly 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.xcodeproj from tablet_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.