|
1 | 1 | --- |
2 | 2 | title: Cutting a release |
3 | | -description: How IntuneCommander releases are built and published — the repo layout and the local release script. |
| 3 | +description: How IntuneCommander releases are built, signed, and published — the tag-driven CI workflow, plus the local unsigned dev build. |
4 | 4 | --- |
5 | 5 |
|
6 | | -Releases are cut **locally** with a single PowerShell script. There is no GitHub Actions release |
7 | | -workflow; the logic lives in one place a CI runner could also call. |
| 6 | +Official releases are cut by **CI**: push a `v<semver>` tag and the signed-release workflow builds, |
| 7 | +signs, and attaches the installers to a draft GitHub Release. A local script covers quick unsigned |
| 8 | +dev builds. |
8 | 9 |
|
9 | 10 | ## Repo layout |
10 | 11 |
|
11 | | -IntuneCommander lives in two repositories: |
12 | | - |
13 | | -| Repo | Visibility | Holds | |
14 | | -| --- | --- | --- | |
15 | | -| `gellorg/intunecommander-src` | private | the source (this repo + these docs) | |
16 | | -| `gellorg/intunecommander-release` | private | published binaries + end-user docs (the [release channel](/get-started/download/)) | |
| 12 | +IntuneCommander is a single public repository — |
| 13 | +[`adamgell/IntuneCommander`](https://github.com/adamgell/IntuneCommander) — holding the source, these |
| 14 | +docs, and the published binaries on its [Releases](https://github.com/adamgell/IntuneCommander/releases) |
| 15 | +page (the [release channel](/get-started/download/)). |
| 16 | + |
| 17 | +## Cut a signed release (CI) |
| 18 | + |
| 19 | +The [**Signed Release (MSI + MSIX)**](https://github.com/adamgell/IntuneCommander/blob/main/.github/workflows/cmprojectx-codesign.yml) |
| 20 | +workflow is the source of truth. It runs on a version tag and produces a **signed MSI, a signed |
| 21 | +MSIX, and a portable zip for both `arm64` and `x64`**. |
| 22 | + |
| 23 | +1. **Match the version.** Set `[package] version` in `app/Cargo.toml` to the release version (no |
| 24 | + leading `v`). CI fails fast if the tag and `Cargo.toml` disagree. |
| 25 | +2. **Tag and push.** |
| 26 | + |
| 27 | + ```powershell |
| 28 | + git tag v1.0.0-beta.1 |
| 29 | + git push origin v1.0.0-beta.1 |
| 30 | + ``` |
| 31 | + |
| 32 | + Or run it manually from **Actions → Signed Release → Run workflow** with a version — the workflow |
| 33 | + creates the tag for you. |
| 34 | +3. **CI builds and signs.** For each architecture it builds the Rust/WinUI client, publishes the |
| 35 | + self-contained .NET sidecar, bundles the pinned Maester modules, then packages a **signed MSI + |
| 36 | + MSIX** with Master Packager Dev (Azure Trusted Signing) plus a portable zip. Build provenance is |
| 37 | + attested. |
| 38 | +4. **Publish the draft.** CI attaches every asset to a **draft** GitHub Release — a `-beta.N` tag is |
| 39 | + auto-marked *prerelease*. Review it and hit **Publish**. |
| 40 | + |
| 41 | +:::note[Release notes] |
| 42 | +Drop curated notes at `docs/release-notes/<tag>.md` (for example `docs/release-notes/v1.0.0-beta.1.md`) |
| 43 | +and CI uses them for the release body; otherwise it writes a one-line fallback. |
| 44 | +::: |
17 | 45 |
|
18 | | -The build happens in the source repo; the artifacts are published to the release repo. |
| 46 | +:::caution[Signing & versions] |
| 47 | +Signing runs in the `codesigning` GitHub Environment. The Azure Trusted Signing identifiers are |
| 48 | +non-secret **variables**; only the client secret (and the optional `SYNCFUSION_LICENSE_KEY` for the |
| 49 | +Conditional Access → PowerPoint export) are secrets. Installer versions are 4-part numeric derived |
| 50 | +from the SemVer, so each beta cleanly upgrades the last — see |
| 51 | +[`packaging/README.md`](https://github.com/adamgell/IntuneCommander/blob/main/packaging/README.md). |
| 52 | +::: |
19 | 53 |
|
20 | | -## The release script |
| 54 | +## Local dev build (unsigned) |
21 | 55 |
|
22 | | -[`scripts/release.ps1`](https://github.com/gellorg/intunecommander-src/blob/main/scripts/release.ps1) |
23 | | -(PowerShell 7+) is the "go script". |
| 56 | +For a quick local build without CI or signing, |
| 57 | +[`scripts/release.ps1`](https://github.com/adamgell/IntuneCommander/blob/main/scripts/release.ps1) |
| 58 | +(PowerShell 7+) builds the client + self-contained sidecar and stages a runnable, zipped bundle per |
| 59 | +architecture. Use `-DryRun` to keep the artifacts local — they land in `.\dist` and nothing is |
| 60 | +published: |
24 | 61 |
|
25 | 62 | ```powershell |
26 | | -# prerelease, x64 (the current target): |
27 | | -.\scripts\release.ps1 -Version 0.2.0 -Arch x64 |
28 | | -
|
29 | | -# build + package only, no publish (artifacts land in .\dist): |
30 | | -.\scripts\release.ps1 -Version 0.2.0 -Arch x64 -DryRun |
31 | | -
|
32 | | -# stable (non-prerelease) release: |
33 | | -.\scripts\release.ps1 -Version 1.0.0 -Arch x64 -Stable |
| 63 | +# both arches, unsigned, artifacts only (no GitHub release): |
| 64 | +.\scripts\release.ps1 -Version 1.0.0-beta.1 -DryRun |
34 | 65 | ``` |
35 | 66 |
|
36 | | -For each architecture it: |
| 67 | +These builds are **unsigned** — use them for testing, not distribution. Signed, published releases |
| 68 | +always go through the CI workflow above. |
37 | 69 |
|
38 | | -1. builds the Rust/WinUI client + `dotnet publish`es the sidecar (self-contained, no `.pdb`); |
39 | | -2. stages a runnable bundle (`IntuneCommander.exe`, `sidecar\`, `docs\`, `Start-IntuneCommander.cmd`, `VERSION`) and zips it; |
40 | | -3. publishes a GitHub Release `v<Version>` to the release repo with the zips attached |
41 | | - (`--prerelease` unless `-Stable`); |
42 | | -4. syncs curated docs into the release repo. |
43 | | - |
44 | | -## Prerequisites |
45 | | - |
46 | | -- Run from a **full checkout**, not a git worktree — the Rust client has path dependencies on the |
47 | | - sibling `windows-rs` and `cmtraceopen` checkouts, which must sit next to the repo root. |
48 | | -- An **x64 MSVC build environment** (Visual Studio Build Tools 2022 — enter the dev shell before |
49 | | - running) and the **.NET 10 preview SDK**. |
50 | | -- An authenticated **`gh`** CLI. |
51 | | - |
52 | | -The script preflights all of this and stops with a clear message if something's missing. |
53 | | - |
54 | | -:::note[x64 only, for now] |
55 | | -Builds currently target **win-x64**. ARM64 is the long-term primary target but needs the |
56 | | -`aarch64-pc-windows-msvc` Rust target and the ARM64 VC tools installed first. |
| 70 | +:::note[Run from a full checkout] |
| 71 | +The Rust client has path dependencies on sibling `windows-rs` and `cmtraceopen` checkouts, which |
| 72 | +must sit next to the repo root — so build from a **full checkout, not a git worktree** (CI links |
| 73 | +these in automatically). You'll also need the **.NET 10 SDK** and the Rust toolchain with the |
| 74 | +`aarch64-pc-windows-msvc` / `x86_64-pc-windows-msvc` targets installed. |
57 | 75 | ::: |
58 | | - |
59 | | -Key flags: `-Arch x64`, `-SelfContained`, `-Notes <text|file>`, `-Stable`, `-DryRun`, `-Force`, |
60 | | -`-SkipDocsSync`, `-ReleaseRepoPath <path>`. |
|
0 commit comments