From f27cd16b902ae0fa6d9628cfbc626ec1934cdc5e Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 6 Aug 2026 11:47:03 -0500 Subject: [PATCH 1/9] LT-22652: Automatically update strings in Crowdin Update Crowdin source strings as soon as they are updated in FLEx. Doing so requires Crowdin access, and developers frequently forget. FUTURE WORK: automate list export --- .github/workflows/patch-installer-cd.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/patch-installer-cd.yml b/.github/workflows/patch-installer-cd.yml index c52578186a..708389208c 100644 --- a/.github/workflows/patch-installer-cd.yml +++ b/.github/workflows/patch-installer-cd.yml @@ -54,7 +54,7 @@ concurrency: cancel-in-progress: true jobs: - debug_build_and_test: + upload_strings_build_and_test: permissions: contents: read env: @@ -63,7 +63,7 @@ jobs: FILESTOSIGNLATER: ./signExternally GH_TOKEN: ${{ github.token }} BASE_BUILD_NUMBER: ${{ inputs.base_build_number || '1452' }} - name: Build Debug and run Tests + name: Upload strings for l10n, Build, and run Tests runs-on: windows-2022 steps: - name: Compute build number for archival @@ -220,6 +220,13 @@ jobs: New-ItemProperty -Path $path -Name $valueName -Value $expectedValue -Type String -Force } + - name: Upload strings for translation + id: upload + if: github.event_name == 'push' + shell: powershell + run: | + .\build.ps1 -Target uploadUpdatesForTranslation | Tee-Object -FilePath uploadStrings.log + - name: Build id: build shell: powershell From 77ed49e0c3206a1b8c2ff8675d4cee622515beec Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 6 Aug 2026 14:48:25 -0500 Subject: [PATCH 2/9] fix logging and build Release (not that it matters, but it looks consistent) --- .github/workflows/patch-installer-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/patch-installer-cd.yml b/.github/workflows/patch-installer-cd.yml index 708389208c..9ef6fccf94 100644 --- a/.github/workflows/patch-installer-cd.yml +++ b/.github/workflows/patch-installer-cd.yml @@ -225,7 +225,7 @@ jobs: if: github.event_name == 'push' shell: powershell run: | - .\build.ps1 -Target uploadUpdatesForTranslation | Tee-Object -FilePath uploadStrings.log + .\build.ps1 -Target uploadUpdatesForTranslation -Configuration Release *>&1 | Tee-Object -FilePath uploadStrings.log - name: Build id: build From ce76bbd8489008176e357979268cffb3514f0222 Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 6 Aug 2026 16:20:14 -0500 Subject: [PATCH 3/9] Limit to pushes to main In case strings diverge and we don't remember to remove the branch from crowdin.json when creating a branch for a patch on stable. This will prevent stable strings overwriting latest strings. --- .github/workflows/patch-installer-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/patch-installer-cd.yml b/.github/workflows/patch-installer-cd.yml index 9ef6fccf94..4d6df3ed3e 100644 --- a/.github/workflows/patch-installer-cd.yml +++ b/.github/workflows/patch-installer-cd.yml @@ -222,7 +222,7 @@ jobs: - name: Upload strings for translation id: upload - if: github.event_name == 'push' + if: github.event_name == 'push' && github.ref == 'refs/heads/main' shell: powershell run: | .\build.ps1 -Target uploadUpdatesForTranslation -Configuration Release *>&1 | Tee-Object -FilePath uploadStrings.log From 12acafeb820bf0f625703d3c3569d4e4994fcbcb Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 13 Aug 2026 11:47:09 -0500 Subject: [PATCH 4/9] Check out liblcm to Localizations/LCMRepo instead of LCM to distinguish the entire repo from localizable files copied from it --- .github/workflows/base-installer-cd.yml | 4 ++-- .github/workflows/patch-installer-cd.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/base-installer-cd.yml b/.github/workflows/base-installer-cd.yml index 99f88e46bd..500edfcd47 100644 --- a/.github/workflows/base-installer-cd.yml +++ b/.github/workflows/base-installer-cd.yml @@ -47,7 +47,7 @@ jobs: debug_build_and_test: env: CROWDIN_API_KEY: ${{ secrets.FLEX_CROWDIN_API }} - LcmRootDir: ${{ github.workspace }}/Localizations/LCM + LcmRootDir: ${{ github.workspace }}/Localizations/LCMRepo FILESTOSIGNLATER: ./signExternally name: Build Debug and run Tests runs-on: windows-2022 @@ -101,7 +101,7 @@ jobs: repository: 'sillsdev/liblcm' ref: ${{ github.event.inputs.installer_ref || 'master' }} fetch-depth: 0 - path: 'Localizations/LCM' + path: 'Localizations/LCMRepo' - name: Ensure .NET Framework 4.8 targeting pack shell: pwsh diff --git a/.github/workflows/patch-installer-cd.yml b/.github/workflows/patch-installer-cd.yml index 4d6df3ed3e..7dc06a635d 100644 --- a/.github/workflows/patch-installer-cd.yml +++ b/.github/workflows/patch-installer-cd.yml @@ -59,7 +59,7 @@ jobs: contents: read env: CROWDIN_API_KEY: ${{ secrets.FLEX_CROWDIN_API }} - LcmRootDir: ${{ github.workspace }}/Localizations/LCM + LcmRootDir: ${{ github.workspace }}/Localizations/LCMRepo FILESTOSIGNLATER: ./signExternally GH_TOKEN: ${{ github.token }} BASE_BUILD_NUMBER: ${{ inputs.base_build_number || '1452' }} @@ -116,7 +116,7 @@ jobs: repository: 'sillsdev/liblcm' ref: ${{ github.event.inputs.lcm_ref || 'master' }} fetch-depth: 0 - path: 'Localizations/LCM' + path: 'Localizations/LCMRepo' - name: Ensure .NET Framework 4.8 targeting pack shell: pwsh From 0332fc4c3e71e453c2f88ac365920a69a22794cf Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 13 Aug 2026 15:42:58 -0500 Subject: [PATCH 5/9] Remove "Debug" from release job names and IDs --- .github/workflows/base-installer-cd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/base-installer-cd.yml b/.github/workflows/base-installer-cd.yml index 500edfcd47..6e76094318 100644 --- a/.github/workflows/base-installer-cd.yml +++ b/.github/workflows/base-installer-cd.yml @@ -44,12 +44,12 @@ concurrency: cancel-in-progress: true jobs: - debug_build_and_test: + build_and_test: env: CROWDIN_API_KEY: ${{ secrets.FLEX_CROWDIN_API }} LcmRootDir: ${{ github.workspace }}/Localizations/LCMRepo FILESTOSIGNLATER: ./signExternally - name: Build Debug and run Tests + name: Build installer and run tests runs-on: windows-2022 steps: - name: Compute build number From 1ed07531967b619ca26a27605ec22bb64672d3e9 Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 13 Aug 2026 16:11:40 -0500 Subject: [PATCH 6/9] Clone liblcm into Localizations/LCMRepo in all scripts --- .github/workflows/copilot-setup-steps.yml | 2 +- Build/Agent/Setup-InstallerBuild.ps1 | 2 +- Docs/installer-build-guide.md | 2 +- Setup-Developer-Machine.ps1 | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 8ae32c2b35..e1afa92c9b 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -206,7 +206,7 @@ jobs: Invoke-ShallowClone -RepoUrl 'https://github.com/sillsdev/FwHelps.git' -Destination 'DistFiles/Helps' Invoke-ShallowClone -RepoUrl 'https://github.com/sillsdev/FwLocalizations.git' -Destination 'Localizations' - Invoke-ShallowClone -RepoUrl 'https://github.com/sillsdev/liblcm.git' -Destination 'Localizations/LCM' + Invoke-ShallowClone -RepoUrl 'https://github.com/sillsdev/liblcm.git' -Destination 'Localizations/LCMRepo' # ================================================================ # SERENA MCP SETUP - for agent code intelligence diff --git a/Build/Agent/Setup-InstallerBuild.ps1 b/Build/Agent/Setup-InstallerBuild.ps1 index 398a3c6d6f..fa0cd7f51d 100644 --- a/Build/Agent/Setup-InstallerBuild.ps1 +++ b/Build/Agent/Setup-InstallerBuild.ps1 @@ -176,7 +176,7 @@ Write-Host "`n--- Checking Helper Repositories ---" -ForegroundColor Yellow $helperRepos = @( @{ Name = "FwHelps"; Path = "DistFiles/Helps"; Required = $true }, @{ Name = "FwLocalizations"; Path = "Localizations"; Required = $true }, - @{ Name = "liblcm"; Path = "Localizations/LCM"; Required = $true } + @{ Name = "liblcm"; Path = "Localizations/LCMRepo"; Required = $true } ) $missingRepos = @() diff --git a/Docs/installer-build-guide.md b/Docs/installer-build-guide.md index b307744099..de04c5ad04 100644 --- a/Docs/installer-build-guide.md +++ b/Docs/installer-build-guide.md @@ -50,7 +50,7 @@ cd fieldworks # Clone required helper repositories git clone https://github.com/sillsdev/FwHelps.git DistFiles/Helps git clone https://github.com/sillsdev/FwLocalizations.git Localizations -git clone https://github.com/sillsdev/liblcm.git Localizations/LCM +git clone https://github.com/sillsdev/liblcm.git Localizations/LCMRepo ``` ## Building a Base Installer diff --git a/Setup-Developer-Machine.ps1 b/Setup-Developer-Machine.ps1 index d196454100..d60ef07f01 100644 --- a/Setup-Developer-Machine.ps1 +++ b/Setup-Developer-Machine.ps1 @@ -203,7 +203,7 @@ if ($InstallerDeps) { } # Special case: liblcm goes inside Localizations - $lcmTarget = Join-Path $scriptDir "Localizations/LCM" + $lcmTarget = Join-Path $scriptDir "Localizations/LCMRepo" $localizationsPath = Join-Path $scriptDir "Localizations" if ((Test-Path $localizationsPath) -and -not (Test-Path $lcmTarget)) { if ($isWorktree) { @@ -215,9 +215,9 @@ if ($InstallerDeps) { } } if (Test-Path $sharedLcm) { - if ($PSCmdlet.ShouldProcess("Localizations/LCM", "Create junction to $sharedLcm")) { + if ($PSCmdlet.ShouldProcess("Localizations/LCMRepo", "Create junction to $sharedLcm")) { New-Item -ItemType Junction -Path $lcmTarget -Target $sharedLcm -Force | Out-Null - Write-Host "[OK] Created junction: Localizations/LCM -> $sharedLcm" -ForegroundColor Green + Write-Host "[OK] Created junction: Localizations/LCMRepo -> $sharedLcm" -ForegroundColor Green } } } else { From 118e42e9eb53740e16b1c398aee5cf3b4e40eb35 Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 13 Aug 2026 16:13:23 -0500 Subject: [PATCH 7/9] Fix LCM checkout in Base Installer CD --- .github/workflows/base-installer-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/base-installer-cd.yml b/.github/workflows/base-installer-cd.yml index 6e76094318..71149c12ba 100644 --- a/.github/workflows/base-installer-cd.yml +++ b/.github/workflows/base-installer-cd.yml @@ -99,7 +99,7 @@ jobs: id: liblcm-checkout with: repository: 'sillsdev/liblcm' - ref: ${{ github.event.inputs.installer_ref || 'master' }} + ref: ${{ github.event.inputs.lcm_ref || 'master' }} fetch-depth: 0 path: 'Localizations/LCMRepo' From 4921901e7cea85dada28ad455d45aa0e58cf052c Mon Sep 17 00:00:00 2001 From: Hasso Date: Mon, 17 Aug 2026 16:37:35 -0500 Subject: [PATCH 8/9] Turn builds yellow and continue on upload failure It is possible that Crowdin has made their uploads finicky; this should not fail the whole build, but we need to know. --- .github/workflows/patch-installer-cd.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/patch-installer-cd.yml b/.github/workflows/patch-installer-cd.yml index 7dc06a635d..0f0279b162 100644 --- a/.github/workflows/patch-installer-cd.yml +++ b/.github/workflows/patch-installer-cd.yml @@ -222,10 +222,14 @@ jobs: - name: Upload strings for translation id: upload + continue-on-error: true if: github.event_name == 'push' && github.ref == 'refs/heads/main' shell: powershell run: | .\build.ps1 -Target uploadUpdatesForTranslation -Configuration Release *>&1 | Tee-Object -FilePath uploadStrings.log + if ($LASTEXITCODE -ne 0) { + echo "::warning::Upload strings failed with exit code $LASTEXITCODE. See log for details." + } - name: Build id: build From e16347378a4afa42eb260895cdc5a0afd6ca4eb9 Mon Sep 17 00:00:00 2001 From: Hasso Date: Mon, 17 Aug 2026 17:07:35 -0500 Subject: [PATCH 9/9] Update documentation as recommended by Devin --- Docs/installer-build-guide.md | 3 ++- Setup-Developer-Machine.ps1 | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Docs/installer-build-guide.md b/Docs/installer-build-guide.md index de04c5ad04..693e88f0bc 100644 --- a/Docs/installer-build-guide.md +++ b/Docs/installer-build-guide.md @@ -129,12 +129,13 @@ The automated build process is defined in two GitHub Actions workflows: ### Patch Installer Workflow (`.github/workflows/patch-installer-cd.yml`) **Triggers:** -- Push to `release/9.3` branch +- Push to certain branches - Scheduled: Every Monday at 03:30 UTC - Manual: `workflow_dispatch` with parameters **Key Steps:** 1. Checkout repos (same as base installer) +1. Upload updated strings for translation 2. Download base build artifacts from GitHub Release 3. Set registry key for WiX temp file handling 4. Build patch using `msbuild Build/InstallerBuild.proj /t:BuildPatchInstaller` diff --git a/Setup-Developer-Machine.ps1 b/Setup-Developer-Machine.ps1 index d60ef07f01..48f4c50694 100644 --- a/Setup-Developer-Machine.ps1 +++ b/Setup-Developer-Machine.ps1 @@ -230,7 +230,7 @@ if ($InstallerDeps) { } } } elseif (Test-Path $lcmTarget) { - Write-Host "[OK] Localizations/LCM already exists" -ForegroundColor Green + Write-Host "[OK] Localizations/LCMRepo already exists" -ForegroundColor Green } }