Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 62254fcd8c | |||
| 7aa96c99a3 | |||
| 35455c2ef6 |
@@ -268,14 +268,47 @@ If the session is on the Linux dev server (`/home/chaim/espocrm-extensions/Outlo
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## How releases work (current, 2026-05-24)
|
||||||
|
|
||||||
|
**Production install URL:** `https://platform.dev.marcus-law.co.il/outlook-addin/OutlookAddin.vsto`
|
||||||
|
|
||||||
|
**Release flow:**
|
||||||
|
|
||||||
|
1. Code change merged to `main` (push or PR-merge — no CI fires yet)
|
||||||
|
2. Bump `<ApplicationVersion>` in `src/OutlookAddin/OutlookAddin.csproj` and `AssemblyVersion` + `AssemblyFileVersion` in `src/OutlookAddin/Properties/AssemblyInfo.cs` to the next 4-part version (e.g. `1.2.1.0`). CI overrides `ApplicationVersion` from the tag at build time, but leaves AssemblyInfo alone — keep them in sync manually so the bundled DLL's FileVersion matches the manifest.
|
||||||
|
3. `git tag -a v1.2.1 -m "..." && git push --tags`
|
||||||
|
4. Gitea Actions workflow (`.gitea/workflows/build.yml`) fires:
|
||||||
|
- Imports the **real** codesign cert from secrets `CODESIGN_CERT_PFX_BASE64` + `CODESIGN_THUMBPRINT` (publicKeyToken `c68d2b4c25051c5b`, `CN=Marcus-Law OutlookAddin`)
|
||||||
|
- Patches csproj to swap the dev self-signed thumbprint (`2399E9BF…`) for the real one
|
||||||
|
- `msbuild /t:Publish` with `/p:InstallUrl=https://platform.dev.marcus-law.co.il/outlook-addin/` and `/p:ApplicationVersion=<tag>.0`
|
||||||
|
- Uploads `publish.tar.gz` to Gitea generic registry (`outlook-addin-publish/<version>/publish.tar.gz`)
|
||||||
|
- Linux job downloads the tar.gz, builds a Docker image `outlook-addin-cdn:latest`, pushes to Gitea registry, calls Coolify to redeploy the CDN container
|
||||||
|
- Posts to Mattermost channel `git-verelasim` with the install URL on success / a failure link on failure
|
||||||
|
5. Lawyers' installed Add-in checks the deployment manifest at the install URL every 7 days (configured in csproj `<UpdateInterval>7</UpdateInterval>`) or whenever they click "בדוק עדכונים" in Settings → אודות.
|
||||||
|
|
||||||
|
**Semver policy:** PATCH for bug fixes (unilateral), MINOR for visible features (unilateral when warranted), MAJOR only with Chaim's explicit approval.
|
||||||
|
|
||||||
|
**Branding (`KlearBranding` repo):** the product is presented to lawyers as **Klear** — title bars, MessageBox titles, ribbon group label, About header all say "Klear". The logo is mirrored from `espocrm-extensions/KlearBranding/files/client/custom/img/logo-klear.png` into `src/OutlookAddin.UI/Resources/logo-klear.png` and embedded as a WPF Resource. Brand accent color: `#121d2e` (dark navy).
|
||||||
|
|
||||||
|
**What stays MarcusLaw under the hood (deliberate — preserves auto-update across the rebrand):**
|
||||||
|
- ClickOnce app identity (`AssemblyName=MarcusLaw.OutlookAddin`)
|
||||||
|
- `%APPDATA%\MarcusLaw\OutlookAddin\settings.json` and `creds.dat`
|
||||||
|
- `%LOCALAPPDATA%\MarcusLaw\OutlookAddin\logs\`
|
||||||
|
- `DpapiCredentialStore.EntropySeed = "MarcusLaw.OutlookAddin.v1"`
|
||||||
|
- Code namespaces `MarcusLaw.OutlookAddin.*`
|
||||||
|
- Named pipe `MarcusLaw.OutlookAddin`
|
||||||
|
|
||||||
|
Changing any of these would orphan all existing installs and require a coordinated uninstall+reinstall on every lawyer's PC plus an entropy migration for DPAPI-encrypted credentials. See the LegalCRM rebrand misadventure in git history for what *not* to do.
|
||||||
|
|
||||||
|
**Known traps when releasing:**
|
||||||
|
- VS Publish wizard (Project Properties → Publish) **rewrites** csproj at every click — flips `<AutoIncrementApplicationRevision>` back to `true`, resets `<ApplicationVersion>` to whatever's in the UI, sometimes deletes prior `Application Files/<...>/` bundles. **Don't use it.** Tag and let CI do it.
|
||||||
|
- There's an old `Publish/` directory in git history that was a parallel manual-release channel via `gitea.../raw/branch/main/Publish/`. It's **not the production install URL** — that's platform.dev. The folder was dropped in v1.2.0.
|
||||||
|
|
||||||
## Things deliberately deferred
|
## Things deliberately deferred
|
||||||
|
|
||||||
| What | When | Why deferred |
|
| What | When | Why deferred |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Windows CI runner on Coolify | Until ClickOnce publish becomes useful | Local builds on dev's VS 2022 suffice through week 5 |
|
| Identity-level rebrand to a pure Klear product (AssemblyName, namespaces, DPAPI entropy, AppData paths) | Until there's another reason to force-reinstall on all 10 PCs | Visible rebrand already done in v1.2.0 without disrupting users; full rename trades aesthetic cleanliness for a day of IT coordination + lost credentials |
|
||||||
| Code signing cert (self-signed) + GPO push to 10 PCs | Week 6 (before release) | IT task; cert isn't useful until we have something to sign |
|
|
||||||
| ClickOnce hosting setup at `platform.dev.marcus-law.co.il/outlook-addin/` | Week 6 | No build artifacts yet |
|
|
||||||
| Mattermost release notification webhook in CI | Week 6 | Coupled to CI runner |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -123,10 +123,22 @@
|
|||||||
Foreground="{Binding UpdateStatusBrush}"
|
Foreground="{Binding UpdateStatusBrush}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
Margin="0,4,0,0" />
|
Margin="0,4,0,0" />
|
||||||
<TextBlock Margin="0,16,0,0" TextWrapping="Wrap"
|
<TextBlock Margin="0,16,0,0" TextWrapping="Wrap">
|
||||||
Text="לוגים: %LOCALAPPDATA%\MarcusLaw\OutlookAddin\logs" />
|
<Run Text="לוגים: " />
|
||||||
<TextBlock TextWrapping="Wrap"
|
<Hyperlink Tag="%LOCALAPPDATA%\MarcusLaw\OutlookAddin\logs"
|
||||||
Text="הגדרות: %APPDATA%\MarcusLaw\OutlookAddin\settings.json" />
|
Click="OnOpenFolderHyperlink"
|
||||||
|
ToolTip="פתח את התיקייה ב-Explorer">
|
||||||
|
<Run Text="%LOCALAPPDATA%\MarcusLaw\OutlookAddin\logs" />
|
||||||
|
</Hyperlink>
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock TextWrapping="Wrap">
|
||||||
|
<Run Text="הגדרות: " />
|
||||||
|
<Hyperlink Tag="%APPDATA%\MarcusLaw\OutlookAddin"
|
||||||
|
Click="OnOpenFolderHyperlink"
|
||||||
|
ToolTip="פתח את התיקייה ב-Explorer">
|
||||||
|
<Run Text="%APPDATA%\MarcusLaw\OutlookAddin\settings.json" />
|
||||||
|
</Hyperlink>
|
||||||
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Documents;
|
||||||
using MarcusLaw.OutlookAddin.UI.ViewModels;
|
using MarcusLaw.OutlookAddin.UI.ViewModels;
|
||||||
|
|
||||||
namespace MarcusLaw.OutlookAddin.UI.Dialogs
|
namespace MarcusLaw.OutlookAddin.UI.Dialogs
|
||||||
@@ -40,5 +43,23 @@ namespace MarcusLaw.OutlookAddin.UI.Dialogs
|
|||||||
DialogResult = _viewModel?.DialogResult;
|
DialogResult = _viewModel?.DialogResult;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnOpenFolderHyperlink(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (!(sender is Hyperlink h) || !(h.Tag is string raw)) return;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var path = Environment.ExpandEnvironmentVariables(raw);
|
||||||
|
// Create the folder lazily so the link works even on the very
|
||||||
|
// first run, before any log has been written.
|
||||||
|
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
|
||||||
|
Process.Start(new ProcessStartInfo("explorer.exe", "\"" + path + "\"") { UseShellExecute = true });
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show("פתיחת התיקייה נכשלה: " + ex.Message, "Klear",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<PublishUrl>C:\Users\Chaim\source\repos\OutlookAddin\Publish\</PublishUrl>
|
<PublishUrl>C:\Users\Chaim\source\repos\OutlookAddin\Publish\</PublishUrl>
|
||||||
<InstallUrl>https://gitea.dev.marcus-law.co.il/espocrm-extensions/OutlookAddin/raw/branch/main/Publish/</InstallUrl>
|
<InstallUrl>https://gitea.dev.marcus-law.co.il/espocrm-extensions/OutlookAddin/raw/branch/main/Publish/</InstallUrl>
|
||||||
<TargetCulture>en</TargetCulture>
|
<TargetCulture>en</TargetCulture>
|
||||||
<ApplicationVersion>1.2.0.0</ApplicationVersion>
|
<ApplicationVersion>1.2.2.0</ApplicationVersion>
|
||||||
<AutoIncrementApplicationRevision>false</AutoIncrementApplicationRevision>
|
<AutoIncrementApplicationRevision>false</AutoIncrementApplicationRevision>
|
||||||
<UpdateEnabled>true</UpdateEnabled>
|
<UpdateEnabled>true</UpdateEnabled>
|
||||||
<UpdateInterval>7</UpdateInterval>
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
|||||||
@@ -33,6 +33,6 @@ using System.Security;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0.0")]
|
[assembly: AssemblyVersion("1.2.2.0")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
[assembly: AssemblyFileVersion("1.2.2.0")]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user