Skip to content

Commit 1535d39

Browse files
Build the Windows Warp Agent CLI installer in dev releases (#14476)
## Description Add a dev-only Windows x64 release job for the Warp Agent CLI Inno installer. The job builds the real CLI, signs the CLI and Windows runtime payloads with Azure Trusted Signing, signs the setup engine and uninstaller, and uploads the installer and raw PDB as workflow artifacts. Inno signing setup is shared with the existing Windows GUI release job. Artifact publication remains intentionally disabled. This replaces reference PR #14445 without modifying it. Depends on #14475. Implementation plan: https://staging.warp.dev/drive/notebook/BI2TyxneCNDssiTUVIF0iK ## Linked Issue - [ ] The linked issue is labeled `ready-to-spec` or `ready-to-implement`. - [ ] Where appropriate, screenshots or a short video of the implementation are included below. ## Testing - `./script/format` - Repository-prescribed split Clippy checks - `cargo check -p warp --lib` - Release workflow validates the installer fixture, real signed build, shared Inno signing setup, and installer/raw-PDB artifact output - Credentialed non-publishing release validation will be linked after this branch is remotely exercised - [ ] I have manually tested my changes locally with `./script/run` ## Agent Mode - [x] Warp Agent Mode - This PR was created via Warp's AI Agent Mode CHANGELOG-NONE Co-Authored-By: Warp <agent@warp.dev> Co-authored-by: Warp <agent@warp.dev>
1 parent baee919 commit 1535d39

3 files changed

Lines changed: 130 additions & 16 deletions

File tree

.github/actions/prepare_environment/action.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ runs:
146146
echo "::error::Missing logic to install build dependencies for OS \"${{ inputs.target_os }}\""
147147
exit 1
148148
fi
149+
- name: Install warp-channel-config for Windows releases
150+
if: ${{ github.repository == 'warpdotdev/warp-internal' && inputs.target_os == 'windows' && inputs.install_release_deps == 'true' && inputs.ssh_key != '' }}
151+
shell: bash
152+
run: |
153+
cd "${{ steps.repo-root.outputs.path }}"
154+
./script/install_channel_config
149155
150156
- name: Install Node
151157
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0

.github/workflows/create_release.yml

Lines changed: 86 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,87 @@ jobs:
16241624
name: release-web-${{ steps.get-config.outputs.channel }}
16251625
path: ${{ steps.bundle_app.outputs.packages_dir }}
16261626

1627+
release_windows_tui:
1628+
name: Build Release (Windows TUI x64)
1629+
runs-on: windows-latest-large
1630+
needs: prepare_release
1631+
if: ${{ inputs.build_windows != false && inputs.channel == 'dev' }}
1632+
timeout-minutes: 150
1633+
env:
1634+
TRUSTED_SIGNING_ENDPOINT: https://eus.codesigning.azure.net/
1635+
TRUSTED_SIGNING_ACCOUNT: warpdotdev
1636+
TRUSTED_SIGNING_CERT_PROFILE: warpterminal
1637+
steps:
1638+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
1639+
1640+
- uses: ./.github/actions/prepare_environment
1641+
with:
1642+
target_os: windows
1643+
cache_key: tui-x64
1644+
is_self_hosted: false
1645+
ref: ${{ needs.prepare_release.outputs.release_branch }}
1646+
install_release_deps: true
1647+
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}
1648+
1649+
- name: Get channel configuration
1650+
id: get-config
1651+
uses: ./.github/actions/get_channel_config/
1652+
with:
1653+
config_file: ${{ env.CONFIG_FILE }}
1654+
channel: ${{ inputs.channel }}
1655+
1656+
- name: Test Windows TUI installer
1657+
run: ./script/windows/test_tui_installer.ps1
1658+
shell: pwsh
1659+
1660+
- name: Build Warp Agent CLI
1661+
id: build_tui
1662+
run: script/bundle --artifact tui --channel "$CHANNEL" --skip_build_installer --arch x64
1663+
shell: bash
1664+
env:
1665+
CHANNEL: ${{ steps.get-config.outputs.channel }}
1666+
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
1667+
1668+
- name: Sign Warp Agent CLI and PTY executables
1669+
uses: azure/artifact-signing-action@b443cf8ea4124818d2ea9f043cba29fc3ec47b16 # v1.2.0
1670+
with:
1671+
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
1672+
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
1673+
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
1674+
endpoint: ${{ env.TRUSTED_SIGNING_ENDPOINT }}
1675+
trusted-signing-account-name: ${{ env.TRUSTED_SIGNING_ACCOUNT }}
1676+
certificate-profile-name: ${{ env.TRUSTED_SIGNING_CERT_PROFILE }}
1677+
files: ${{ steps.build_tui.outputs.binary_path }}
1678+
files-folder: ${{ github.workspace }}\app\assets\windows\x64
1679+
files-folder-filter: dll,exe
1680+
files-folder-recurse: true
1681+
files-folder-depth: 2
1682+
file-digest: SHA256
1683+
timestamp-rfc3161: http://timestamp.acs.microsoft.com
1684+
timestamp-digest: SHA256
1685+
- name: Build sign-tool command for Inno Setup
1686+
id: setup_signing
1687+
shell: pwsh
1688+
run: ./script/windows/build_inno_sign_tool_command.ps1
1689+
1690+
- name: Bundle signed Warp Agent CLI installer
1691+
id: bundle_tui
1692+
run: script/bundle --artifact tui --channel "$CHANNEL" --skip_build_binary --require_signatures --arch x64
1693+
shell: bash
1694+
env:
1695+
CHANNEL: ${{ steps.get-config.outputs.channel }}
1696+
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
1697+
SIGN_TOOL_CMD: ${{ steps.setup_signing.outputs.sign_tool_cmd }}
1698+
1699+
- name: Upload Windows TUI installer
1700+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
1701+
with:
1702+
name: release-windows-tui-x64-${{ steps.get-config.outputs.channel }}
1703+
path: |
1704+
${{ steps.bundle_tui.outputs.installer_path }}
1705+
${{ steps.bundle_tui.outputs.pdb_file_path }}
1706+
if-no-files-found: error
1707+
16271708
release_windows:
16281709
name: Build Release (Windows ${{ matrix.arch }})
16291710
runs-on: ${{ matrix.runner }}
@@ -1701,22 +1782,7 @@ jobs:
17011782
- name: Build sign-tool command for Inno Setup
17021783
id: setup_signing
17031784
shell: pwsh
1704-
run: |
1705-
$Dlib = (Get-ChildItem -Recurse "$env:LOCALAPPDATA" -Filter "Azure.CodeSigning.Dlib.dll" -ErrorAction SilentlyContinue |
1706-
Where-Object { $_.FullName -match 'x64' } | Select-Object -First 1).FullName
1707-
if (-not $Dlib) { throw "Azure.CodeSigning.Dlib.dll not found — did the earlier signing action run?" }
1708-
Write-Output "Dlib: $Dlib"
1709-
$SignTool = (Get-ChildItem -Recurse "C:\Program Files (x86)\Windows Kits" -Filter "signtool.exe" |
1710-
Where-Object { $_.FullName -match 'x64' } | Sort-Object FullName -Descending | Select-Object -First 1).FullName
1711-
if (-not $SignTool) { throw "signtool.exe not found in Windows SDK" }
1712-
Write-Output "SignTool: $SignTool"
1713-
# Add signtool's directory to PATH so the ISCC sign command can reference it as just "signtool.exe".
1714-
# Embedded quotes in the /Scodesign= value break PowerShell's native-command argument passing to ISCC.
1715-
(Split-Path $SignTool) >> $env:GITHUB_PATH
1716-
$MetadataPath = "${{ runner.temp }}\tsc-metadata.json"
1717-
@{Endpoint=$env:TRUSTED_SIGNING_ENDPOINT;CodeSigningAccountName=$env:TRUSTED_SIGNING_ACCOUNT;CertificateProfileName=$env:TRUSTED_SIGNING_CERT_PROFILE} |
1718-
ConvertTo-Json | Set-Content $MetadataPath
1719-
"sign_tool_cmd=signtool.exe sign /v /fd SHA256 /tr http://timestamp.acs.microsoft.com /td SHA256 /dlib $Dlib /dmdf $MetadataPath `$f" >> $env:GITHUB_OUTPUT
1785+
run: ./script/windows/build_inno_sign_tool_command.ps1
17201786

17211787
- name: Bundle app
17221788
id: bundle_app
@@ -1801,6 +1867,7 @@ jobs:
18011867
- release_linux_arm
18021868
- release_linux_cli_x86
18031869
- release_web
1870+
- release_windows_tui
18041871
- release_windows
18051872
if: ${{ always() && needs.prepare_release.outputs.should_publish == 'true' }}
18061873
steps:
@@ -1841,6 +1908,9 @@ jobs:
18411908
if [[ ${{ needs.release_windows.result }} != 'success' ]]; then
18421909
FAILED+=("Windows")
18431910
fi
1911+
if [[ ${{ needs.release_windows_tui.result }} != 'success' && ${{ inputs.channel }} == 'dev' ]]; then
1912+
FAILED+=("Windows TUI")
1913+
fi
18441914
18451915
if (( ${#FAILED[@]} )); then
18461916
printf -v FORMATTED "%s, " "${FAILED[@]}"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[CmdletBinding()]
2+
param()
3+
4+
$ErrorActionPreference = 'Stop'
5+
Set-StrictMode -Version Latest
6+
7+
$dlib = (
8+
Get-ChildItem -Recurse $env:LOCALAPPDATA -Filter 'Azure.CodeSigning.Dlib.dll' `
9+
-ErrorAction SilentlyContinue |
10+
Where-Object { $_.FullName -match 'x64' } |
11+
Select-Object -First 1
12+
).FullName
13+
if (-not $dlib) {
14+
throw 'Azure.CodeSigning.Dlib.dll was not installed by the signing action'
15+
}
16+
17+
$signTool = (
18+
Get-ChildItem -Recurse 'C:\Program Files (x86)\Windows Kits' -Filter 'signtool.exe' |
19+
Where-Object { $_.FullName -match 'x64' } |
20+
Sort-Object FullName -Descending |
21+
Select-Object -First 1
22+
).FullName
23+
if (-not $signTool) {
24+
throw 'signtool.exe was not found in the Windows SDK'
25+
}
26+
if (-not $env:GITHUB_OUTPUT) {
27+
throw 'GITHUB_OUTPUT is required'
28+
}
29+
30+
(Split-Path $signTool) >> $env:GITHUB_PATH
31+
$metadataPath = Join-Path $env:RUNNER_TEMP 'tsc-metadata.json'
32+
@{
33+
Endpoint = $env:TRUSTED_SIGNING_ENDPOINT
34+
CodeSigningAccountName = $env:TRUSTED_SIGNING_ACCOUNT
35+
CertificateProfileName = $env:TRUSTED_SIGNING_CERT_PROFILE
36+
} | ConvertTo-Json | Set-Content $metadataPath
37+
38+
"sign_tool_cmd=signtool.exe sign /v /fd SHA256 /tr http://timestamp.acs.microsoft.com /td SHA256 /dlib $dlib /dmdf $metadataPath `$f" >> $env:GITHUB_OUTPUT

0 commit comments

Comments
 (0)