These tasks require access to Coder's Apple Developer team and admin access to this repository.
Versions come from Git tags of the form vX.Y.Z (see scripts/version.sh).
Pushing a tag doesn't start a workflow, but the GitHub release needs a tag to
point at.
-
Tag the commit on
mainthat you want to release, and push the tag:git tag vX.Y.Z git push origin vX.Y.Z
-
Wait for the
releaseworkflow run for that commit onmainto finish. It publishes thepreviewbuild and updates the appcast, so publishing the release while it is still running can race on the appcast update. -
Create a GitHub release from the tag and write the release notes. The release notes are used as the update description in the Sparkle appcast, so write them before publishing.
-
Publishing the release starts the
releaseworkflow, which builds, signs, and notarizes the app, uploads the assets to the release, updates the appcast, and opens a pull request to update the homebrew-coder cask. Wait for it to finish, then review and merge the cask pull request.
Release builds are signed with two provisioning profiles, one for the app
(com.coder.Coder-Desktop) and one for the network extension
(com.coder.Coder-Desktop.VPN). CI reads them from these repository secrets:
| Secret | Profile file |
|---|---|
CODER_DESKTOP_APP_PROVISIONPROFILE_B64 |
Coder_Desktop_App.provisionprofile |
CODER_DESKTOP_EXTENSION_PROVISIONPROFILE_B64 |
Coder_Desktop_Extension.provisionprofile |
When a profile expires or needs regenerating:
-
Sign in to the Apple Developer portal and open Certificates, Identifiers & Profiles > Profiles.
-
Regenerate or edit the profile if needed, then download it.
-
Base64-encode the downloaded file and copy the output:
cat Coder_Desktop_App.provisionprofile | base64 cat Coder_Desktop_Extension.provisionprofile | base64
-
Paste the output into the matching secret under Settings > Secrets and variables > Actions.
To check new profiles before cutting a release, run the release workflow
manually with dryrun enabled. The build is uploaded as a workflow artifact
instead of a release asset.