Skip to content

Commit d16e9d5

Browse files
committed
Automate desktop latest channel and keep single installer download path
1 parent 09c86f6 commit d16e9d5

4 files changed

Lines changed: 169 additions & 76 deletions

File tree

.github/workflows/windows_desktop_release.yml

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ name: Windows desktop release
22

33
on:
44
push:
5+
branches:
6+
- "main"
57
tags:
68
- "v*"
79
- "*.*.*"
810
workflow_dispatch:
911
inputs:
1012
release_tag:
11-
description: "Existing release tag to upload assets to (example: v1.3.0)"
12-
required: true
13+
description: "Tag/channel to upload assets to (example: v1.4.0 or desktop-latest)"
14+
required: false
1315
type: string
1416

1517
permissions:
@@ -33,22 +35,40 @@ jobs:
3335
shell: pwsh
3436
run: choco install innosetup --no-progress -y
3537

36-
- name: Resolve release tag
37-
id: resolve_tag
38+
- name: Resolve release channel
39+
id: resolve_channel
3840
shell: pwsh
3941
run: |
4042
$eventName = "${{ github.event_name }}"
41-
if ($eventName -eq "workflow_dispatch") {
42-
$tag = "${{ github.event.inputs.release_tag }}"
43+
$refType = "${{ github.ref_type }}"
44+
$refName = "${{ github.ref_name }}"
45+
$manualTag = "${{ github.event.inputs.release_tag }}"
46+
47+
if ($eventName -eq "workflow_dispatch" -and ![string]::IsNullOrWhiteSpace($manualTag)) {
48+
$tag = $manualTag
49+
} elseif ($refType -eq "tag") {
50+
$tag = $refName
51+
} elseif ($refName -eq "main") {
52+
# Rolling channel that always points to latest main build.
53+
$tag = "desktop-latest"
4354
} else {
44-
$tag = "${{ github.ref_name }}"
55+
throw "Unable to resolve release tag/channel."
4556
}
4657
4758
if ([string]::IsNullOrWhiteSpace($tag)) {
48-
throw "Unable to resolve release tag."
59+
throw "Resolved tag/channel is empty."
60+
}
61+
62+
$isRolling = ($tag -eq "desktop-latest")
63+
if ($isRolling) {
64+
$releaseName = "OCC Desktop - rolling latest (main)"
65+
} else {
66+
$releaseName = "OCC Desktop $tag"
4967
}
5068
5169
"tag=$tag" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
70+
"is_rolling=$isRolling" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
71+
"release_name=$releaseName" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
5272
5373
- name: Build Windows desktop assets
5474
shell: pwsh
@@ -67,14 +87,34 @@ jobs:
6787
path: release-windows/*
6888
if-no-files-found: error
6989

70-
- name: Upload assets to GitHub Release
90+
- name: Upload rolling assets (desktop-latest)
91+
if: steps.resolve_channel.outputs.is_rolling == 'True'
92+
uses: softprops/action-gh-release@v2
93+
with:
94+
tag_name: ${{ steps.resolve_channel.outputs.tag }}
95+
name: ${{ steps.resolve_channel.outputs.release_name }}
96+
prerelease: true
97+
make_latest: false
98+
generate_release_notes: false
99+
overwrite_files: true
100+
files: |
101+
release-windows/OCCDesktop-windows-x64.exe
102+
release-windows/OCCDesktop-windows-x64.zip
103+
release-windows/OCCDesktop-Setup-windows-x64.exe
104+
release-windows/OCCDesktop-build-info.json
105+
release-windows/OCCDesktop-windows-x64.sha256
106+
107+
- name: Upload versioned assets (tags/manual)
108+
if: steps.resolve_channel.outputs.is_rolling != 'True'
71109
uses: softprops/action-gh-release@v2
72110
with:
73-
tag_name: ${{ steps.resolve_tag.outputs.tag }}
111+
tag_name: ${{ steps.resolve_channel.outputs.tag }}
112+
name: ${{ steps.resolve_channel.outputs.release_name }}
74113
generate_release_notes: true
75114
overwrite_files: true
76115
files: |
77116
release-windows/OCCDesktop-windows-x64.exe
78117
release-windows/OCCDesktop-windows-x64.zip
79118
release-windows/OCCDesktop-Setup-windows-x64.exe
119+
release-windows/OCCDesktop-build-info.json
80120
release-windows/OCCDesktop-windows-x64.sha256

README.es.md

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,28 @@ Experiment Lab (nuevo en 1.4.0):
113113
- CLI:
114114
`occ lab run --claims-dir examples/claim_specs --profiles core nuclear --out .occ_lab/latest`
115115

116-
Descargar paquete preconstruido más reciente para Windows:
116+
Descargar paquete preconstruido para Windows:
117117

118-
- Página de release (siempre disponible): [Último release](https://github.com/MarcoAIsaac/OCC/releases/latest)
119-
- Instalador (recomendado): [`OCCDesktop-Setup-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-Setup-windows-x64.exe)
120-
- ZIP (recomendado): [`OCCDesktop-windows-x64.zip`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.zip)
121-
- EXE: [`OCCDesktop-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.exe)
122-
- Checksums: [`OCCDesktop-windows-x64.sha256`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.sha256)
118+
- Canal automático rolling (siempre el último build de `main`):
119+
- Instalador (recomendado): [`OCCDesktop-Setup-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-Setup-windows-x64.exe)
120+
- Build info: [`OCCDesktop-build-info.json`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-build-info.json)
121+
- Checksums: [`OCCDesktop-windows-x64.sha256`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-windows-x64.sha256)
122+
- Canal estable (último tag de versión): [Último release](https://github.com/MarcoAIsaac/OCC/releases/latest)
123123

124-
Si los enlaces directos devuelven `404`, abre la página del release y espera a que el workflow
125-
`Windows desktop release` termine de subir los assets.
126-
Ese pipeline corre automáticamente cuando empujas un tag de versión (por ejemplo `1.4.0` o `v1.4.0`).
127-
Si hace falta, ejecuta ese workflow manualmente y usa `release_tag` con la versión
128-
(ejemplo `1.4.0`) para adjuntar assets a un release ya existente.
124+
Si el enlace directo del instalador devuelve `404`, abre la página del último release y espera a
125+
que el workflow `Windows desktop release` termine de subir los assets.
126+
Ese pipeline corre automáticamente en cada push a `main` (rolling `desktop-latest`)
127+
y también en tags de versión (por ejemplo `1.4.0` o `v1.4.0`).
128+
Si hace falta, ejecútalo manualmente y usa `release_tag`
129+
(ejemplo `1.4.0` o `desktop-latest`) para refrescar assets.
129130

130131
Verificación SHA256 en Windows:
131132

132133
```powershell
133-
certutil -hashfile .\OCCDesktop-windows-x64.exe SHA256
134+
certutil -hashfile .\OCCDesktop-Setup-windows-x64.exe SHA256
134135
```
135136

136-
Compara con `OCCDesktop-windows-x64.sha256`.
137+
Compara con la fila `OCCDesktop-Setup-windows-x64.exe` en `OCCDesktop-windows-x64.sha256`.
137138

138139
Desde código fuente sin entrypoint instalado:
139140

@@ -155,6 +156,42 @@ Para reducir avisos de SmartScreen en binarios distribuidos, configura secretos
155156
Sin un certificado de firma confiable (idealmente EV), no se puede eliminar por completo
156157
la advertencia de SmartScreen en binarios nuevos.
157158

159+
## App móvil (Android)
160+
161+
La app compañera Android (`android/`) incluye:
162+
163+
- Pestaña Workbench (claim YAML + perfiles `core`/`nuclear`)
164+
- Pestaña Lab (matriz de perfiles sobre claims de muestra con resumen de divergencia)
165+
- Pestaña Assistant (guía OCC offline)
166+
- Pestaña History (base de datos local Room)
167+
168+
Permisos Android requeridos:
169+
170+
- `INTERNET` (endpoints/enlaces online opcionales)
171+
- `ACCESS_NETWORK_STATE` (comprobación de conectividad)
172+
173+
Compilar localmente:
174+
175+
```bash
176+
cd android
177+
./gradlew assembleRelease
178+
```
179+
180+
Prerequisitos: JDK 17 y Android SDK (`ANDROID_HOME` configurado).
181+
182+
APK generado:
183+
184+
- `android/app/build/outputs/apk/release/app-release.apk`
185+
186+
Descargar APK preconstruido del último release:
187+
188+
- [`OCCMobile-android.apk`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCMobile-android.apk)
189+
- [`OCCMobile-android.sha256`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCMobile-android.sha256)
190+
191+
Automatización de release:
192+
193+
- El workflow `.github/workflows/android_release.yml` publica assets Android automáticamente al empujar tags de versión (`1.4.0` o `v1.4.0`).
194+
158195
## Utilidades de mantenimiento
159196

160197
```bash
@@ -225,9 +262,9 @@ Para ejecuciones largas, conviene usar el flujo manual de verificación completa
225262

226263
## Expansiones de dominio
227264

228-
`v1.4.0` mantiene el conjunto de candados nucleares (`nuclear_guard`, `NUC*`) y agrega
265+
`v1.4.0` mantiene el conjunto de candados nucleares (`j4_nuclear_guard`, `L4C*/L4E*`) y agrega
229266
flujos matriciales de Experiment Lab junto con distribución de escritorio para Windows vía GitHub Releases
230-
(`OCCDesktop-windows-x64.exe/.zip`).
267+
(`OCCDesktop-Setup-windows-x64.exe`).
231268

232269
## Estructura del repositorio
233270

README.md

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,28 @@ Experiment Lab (new in 1.4.0):
113113
- CLI:
114114
`occ lab run --claims-dir examples/claim_specs --profiles core nuclear --out .occ_lab/latest`
115115

116-
Download latest prebuilt Windows package:
116+
Download prebuilt Windows package:
117117

118-
- Release page (always available): [Latest release](https://github.com/MarcoAIsaac/OCC/releases/latest)
119-
- Installer (recommended): [`OCCDesktop-Setup-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-Setup-windows-x64.exe)
120-
- ZIP (recommended): [`OCCDesktop-windows-x64.zip`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.zip)
121-
- EXE: [`OCCDesktop-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.exe)
122-
- Checksums: [`OCCDesktop-windows-x64.sha256`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCDesktop-windows-x64.sha256)
118+
- Automatic rolling channel (always latest `main` build):
119+
- Installer (recommended): [`OCCDesktop-Setup-windows-x64.exe`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-Setup-windows-x64.exe)
120+
- Build info: [`OCCDesktop-build-info.json`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-build-info.json)
121+
- Checksums: [`OCCDesktop-windows-x64.sha256`](https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/OCCDesktop-windows-x64.sha256)
122+
- Stable channel (latest version tag): [Latest release](https://github.com/MarcoAIsaac/OCC/releases/latest)
123123

124-
If direct download links return `404`, open the release page and wait for workflow
124+
If the direct installer link returns `404`, open the latest release page and wait for workflow
125125
`Windows desktop release` to finish uploading assets.
126-
This pipeline runs automatically when you push a version tag (for example `1.4.0` or `v1.4.0`).
127-
If needed, trigger that workflow manually and set `release_tag` to your version
128-
(example `1.4.0`) to attach assets to an existing release.
126+
This pipeline runs automatically on every push to `main` (rolling `desktop-latest`)
127+
and on version tags (for example `1.4.0` or `v1.4.0`).
128+
If needed, trigger the workflow manually and set `release_tag`
129+
(example `1.4.0` or `desktop-latest`) to refresh assets.
129130

130131
Windows checksum verification:
131132

132133
```powershell
133-
certutil -hashfile .\OCCDesktop-windows-x64.exe SHA256
134+
certutil -hashfile .\OCCDesktop-Setup-windows-x64.exe SHA256
134135
```
135136

136-
Compare with `OCCDesktop-windows-x64.sha256`.
137+
Compare with the `OCCDesktop-Setup-windows-x64.exe` row in `OCCDesktop-windows-x64.sha256`.
137138

138139
From source without install entrypoint:
139140

@@ -155,6 +156,42 @@ To reduce SmartScreen warnings in distributed binaries, configure repository sec
155156
Without a trusted code-signing certificate (ideally EV), SmartScreen warnings cannot be fully
156157
eliminated for fresh binaries.
157158

159+
## Mobile app (Android)
160+
161+
Android companion app (`android/`) includes:
162+
163+
- Workbench tab (claim YAML + `core`/`nuclear` judge profiles)
164+
- Lab tab (profile matrix over sample claims with divergence summary)
165+
- Assistant tab (offline OCC guidance)
166+
- History tab (local Room database)
167+
168+
Required Android permissions:
169+
170+
- `INTERNET` (optional online endpoints / links)
171+
- `ACCESS_NETWORK_STATE` (network availability checks)
172+
173+
Build locally:
174+
175+
```bash
176+
cd android
177+
./gradlew assembleRelease
178+
```
179+
180+
Prerequisites: JDK 17 and Android SDK (`ANDROID_HOME` configured).
181+
182+
Generated APK:
183+
184+
- `android/app/build/outputs/apk/release/app-release.apk`
185+
186+
Download prebuilt APK from latest release:
187+
188+
- [`OCCMobile-android.apk`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCMobile-android.apk)
189+
- [`OCCMobile-android.sha256`](https://github.com/MarcoAIsaac/OCC/releases/latest/download/OCCMobile-android.sha256)
190+
191+
Release automation:
192+
193+
- Workflow `.github/workflows/android_release.yml` publishes Android assets automatically on pushed version tags (`1.4.0` or `v1.4.0`).
194+
158195
## Maintenance helpers
159196

160197
```bash
@@ -225,9 +262,9 @@ For long runs, prefer the manual full-suite workflow in GitHub Actions.
225262

226263
## Domain expansions
227264

228-
`v1.4.0` keeps the nuclear-domain lock set (`nuclear_guard`, `NUC*`) and adds
265+
`v1.4.0` keeps the nuclear-domain lock set (`j4_nuclear_guard`, `L4C*/L4E*`) and adds
229266
Experiment Lab matrix workflows plus Windows desktop distribution via GitHub Releases
230-
(`OCCDesktop-windows-x64.exe/.zip`).
267+
(`OCCDesktop-Setup-windows-x64.exe`).
231268

232269
## Repository layout
233270

occ/desktop.py

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ def _fmt_cmd(cmd: Sequence[str]) -> str:
8585
return " ".join(shlex.quote(x) for x in cmd)
8686

8787

88+
RELEASE_STABLE_URL = "https://github.com/MarcoAIsaac/OCC/releases/latest"
89+
RELEASE_DESKTOP_ROLLING_URL = "https://github.com/MarcoAIsaac/OCC/releases/tag/desktop-latest"
90+
RELEASE_DESKTOP_ROLLING_BASE = (
91+
"https://github.com/MarcoAIsaac/OCC/releases/download/desktop-latest/"
92+
)
93+
94+
8895
class OCCDesktopApp(tk.Tk):
8996
BG = "#0b1220"
9097
SURFACE = "#111827"
@@ -549,7 +556,7 @@ def _build_menu(self) -> None:
549556
)
550557
help_menu.add_command(
551558
label=_tr("Latest release", "Ultimo release"),
552-
command=lambda: webbrowser.open("https://github.com/MarcoAIsaac/OCC/releases/latest"),
559+
command=lambda: webbrowser.open(RELEASE_STABLE_URL),
553560
)
554561
help_menu.add_separator()
555562
help_menu.add_command(label=_tr("About", "Acerca de"), command=self._show_about_dialog)
@@ -817,8 +824,8 @@ def _build_sidebar(self, parent: ttk.Frame) -> None:
817824
link_row.pack(fill=tk.X, pady=(6, 0))
818825
release_btn = self._create_modern_button(
819826
link_row,
820-
label=_tr("Open latest release", "Abrir ultimo release"),
821-
command=lambda: self._open_url("https://github.com/MarcoAIsaac/OCC/releases/latest"),
827+
label=_tr("Open desktop-latest release", "Abrir release desktop-latest"),
828+
command=lambda: self._open_url(RELEASE_DESKTOP_ROLLING_URL),
822829
variant="ghost",
823830
)
824831
release_btn.pack(fill=tk.X)
@@ -981,8 +988,8 @@ def _build_workbench_tab(self, tab: ttk.Frame) -> None:
981988
).grid(row=0, column=1, sticky="e")
982989
ttk.Button(
983990
hero,
984-
text=_tr("Open release page", "Abrir pagina release"),
985-
command=lambda: webbrowser.open("https://github.com/MarcoAIsaac/OCC/releases/latest"),
991+
text=_tr("Open desktop-latest page", "Abrir pagina desktop-latest"),
992+
command=lambda: webbrowser.open(RELEASE_DESKTOP_ROLLING_URL),
986993
style="Ghost.TButton",
987994
).grid(row=1, column=1, sticky="e", pady=(4, 0))
988995

@@ -1684,40 +1691,12 @@ def _build_security_tab(self, tab: ttk.Frame) -> None:
16841691

16851692
ttk.Button(
16861693
link_frame,
1687-
text=_tr("Open latest release", "Abrir ultimo release"),
1688-
command=lambda: webbrowser.open("https://github.com/MarcoAIsaac/OCC/releases/latest"),
1689-
style="Primary.TButton",
1690-
).pack(side=tk.LEFT)
1691-
1692-
ttk.Button(
1693-
link_frame,
1694-
text=_tr("Open latest ZIP", "Abrir ultimo ZIP"),
1694+
text=_tr("Download Setup installer", "Descargar instalador Setup"),
16951695
command=lambda: webbrowser.open(
1696-
"https://github.com/MarcoAIsaac/OCC/releases/latest/download/"
1697-
"OCCDesktop-windows-x64.zip"
1696+
RELEASE_DESKTOP_ROLLING_BASE + "OCCDesktop-Setup-windows-x64.exe"
16981697
),
1699-
style="Ghost.TButton",
1700-
).pack(side=tk.LEFT, padx=(8, 0))
1701-
1702-
ttk.Button(
1703-
link_frame,
1704-
text=_tr("Open Setup installer", "Abrir instalador Setup"),
1705-
command=lambda: webbrowser.open(
1706-
"https://github.com/MarcoAIsaac/OCC/releases/latest/download/"
1707-
"OCCDesktop-Setup-windows-x64.exe"
1708-
),
1709-
style="Ghost.TButton",
1710-
).pack(side=tk.LEFT, padx=(8, 0))
1711-
1712-
ttk.Button(
1713-
link_frame,
1714-
text=_tr("Open latest EXE", "Abrir ultimo EXE"),
1715-
command=lambda: webbrowser.open(
1716-
"https://github.com/MarcoAIsaac/OCC/releases/latest/download/"
1717-
"OCCDesktop-windows-x64.exe"
1718-
),
1719-
style="Ghost.TButton",
1720-
).pack(side=tk.LEFT, padx=(8, 0))
1698+
style="Primary.TButton",
1699+
).pack(side=tk.LEFT)
17211700

17221701
ttk.Button(
17231702
tab,

0 commit comments

Comments
 (0)