Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
43eb57a
try signpath
jay-418 Feb 4, 2026
6119108
add temp todo
jay-418 Feb 4, 2026
dd3a932
reenable windows builds
jay-418 Feb 4, 2026
15627f8
reenable windows, finally, maybe
jay-418 Feb 4, 2026
988ad6b
update signpath action format
jay-418 Feb 4, 2026
d551109
connector
jay-418 Feb 4, 2026
822250d
try direct api to skip trusted build requirements
jay-418 Feb 4, 2026
976bb69
verify
jay-418 Feb 4, 2026
c13febd
install self sign cert for validation
jay-418 Feb 5, 2026
6ba6b61
bugfix
jay-418 Feb 5, 2026
d070d46
better comment
jay-418 Feb 5, 2026
7c30e9f
refactor build CI
jay-418 Feb 6, 2026
ce07a0c
pass both version and tag
jay-418 Feb 10, 2026
d5d55d2
correct build type tag bug
jay-418 Feb 10, 2026
164cadf
fix windows naming issue
jay-418 Feb 10, 2026
5be498c
fixes
jay-418 Feb 10, 2026
51dc961
handle error
jay-418 Feb 10, 2026
515d482
makefile changes
jay-418 Feb 10, 2026
7e5d046
accept platform tag
jay-418 Feb 10, 2026
eb146ec
Merge branch 'main' into jay/releases
jay-418 Feb 10, 2026
b88110d
better tag filtering
jay-418 Feb 10, 2026
710d553
use linux for android build
jay-418 Feb 10, 2026
cd04ba9
annotate
jay-418 Feb 10, 2026
13b45eb
filter with valid yaml
jay-418 Feb 10, 2026
f63b1c9
back to macos for android
jay-418 Feb 11, 2026
e128ce4
use correct ref
jay-418 Feb 11, 2026
f3fb5ba
review fixes: correct tag enforcement, concurrency guard
jay-418 Feb 11, 2026
77825a7
Merge branch 'main' into jay/releases
jay-418 Feb 14, 2026
30565d1
7 char hash for consistency
jay-418 Feb 14, 2026
54e3e51
update with main
jay-418 Feb 14, 2026
06c8e7a
windows
jay-418 Feb 14, 2026
40d97fe
update
jay-418 Feb 14, 2026
474c28b
remove nightly
jay-418 Feb 14, 2026
8d9dd51
update deps and env for windows
jay-418 Feb 14, 2026
cb7700d
consistent parsing of installer names for windows
jay-418 Feb 14, 2026
c299a2f
fix windows release notes
jay-418 Feb 14, 2026
999c93a
delete notes
jay-418 Feb 14, 2026
842ffe5
fixes for windows failures with debug
jay-418 Feb 14, 2026
41ab425
correct vars
jay-418 Feb 14, 2026
5eb060f
conflicts
jay-418 Feb 14, 2026
3747c62
fixes
jay-418 Feb 14, 2026
1f29ef6
Merge branch 'main' into jay/signpath
jay-418 Feb 24, 2026
5daac1d
use prod signing policy by default
jay-418 Feb 24, 2026
29fc917
re-enable windows to s3
jay-418 Feb 24, 2026
eead1b4
restructure to sign all parts of the windows package
jay-418 Feb 24, 2026
b5b2e73
extracted script
jay-418 Feb 24, 2026
0d10a23
underscores
jay-418 Feb 24, 2026
13bf1c6
accept suggestion
jay-418 Feb 24, 2026
6be33f9
use fixed windows to attempt build failure fix
jay-418 Feb 24, 2026
9ec53f5
fixes to build failure
jay-418 Feb 24, 2026
2181e52
more attempted fixes to windows build
jay-418 Feb 24, 2026
4304cd9
index correctly
jay-418 Feb 24, 2026
e8aa68e
path fix
jay-418 Feb 24, 2026
2ed9d33
more lib signing fixes
jay-418 Feb 24, 2026
af44a15
better handling for signing errors
jay-418 Feb 24, 2026
33014ef
revert to windows latest, exit powershell correctly
jay-418 Feb 24, 2026
e0ac20a
handle return correctly
jay-418 Feb 24, 2026
9848077
accept suggestion
jay-418 Feb 28, 2026
05632e6
Update scripts/ci/sign-windows.ps1
jay-418 Feb 28, 2026
9de9503
Update scripts/ci/sign-windows.ps1
jay-418 Feb 28, 2026
148646f
Merge branch 'main' into jay/signpath
jay-418 Feb 28, 2026
67a90b1
explicit test cert flag, no exit
jay-418 Feb 28, 2026
47bc56b
refactor ps script to incoporate pr comments
jay-418 Feb 28, 2026
543226b
Merge branch 'main' into jay/signpath
jay-418 Feb 28, 2026
47457d1
Merge branch 'main' into jay/signpath
atavism Mar 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 87 additions & 22 deletions .github/workflows/build-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,18 @@ on:
installer_base_name:
required: true
type: string
use_self_signed_cert:
description: "Use self-signed code signing certificate"
required: false
type: boolean
default: false # when true, uses self-signed certificate

jobs:
build-windows:
env:
AC_USERNAME: ${{ secrets.AC_USERNAME }}
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
BUILD_TYPE: ${{ inputs.build_type }}
VERSION: ${{ inputs.version }}
SIGNPATH_SIGNING_POLICY: ${{ inputs.use_self_signed_cert && vars.SIGNPATH_SIGNING_POLICY_SLUG_TEST || vars.SIGNPATH_SIGNING_POLICY_SLUG }}
permissions:
contents: "read"
id-token: "write"
Expand Down Expand Up @@ -99,42 +103,103 @@ jobs:
Write-Host "APP_NAME=$name"
Write-Host "APP_VERSION=$version"

- name: Build Windows release
- name: Build Windows binaries
shell: pwsh
env:
FULL_INSTALLER_NAME: ${{ inputs.installer_base_name }}${{ inputs.build_type != 'production' && format('-{0}', inputs.build_type) || '' }}
run: |
dart pub global activate flutter_distributor
make windows-release
if ($LASTEXITCODE -ne 0) {
Write-Error "make windows-release failed with exit code $LASTEXITCODE"
exit $LASTEXITCODE
}

Write-Host "=== Files in build/windows/x64/runner/Release/ ==="
if (Test-Path "build/windows/x64/runner/Release/") {
Get-ChildItem -Path "build/windows/x64/runner/Release/" -Recurse | Select-Object -First 20 FullName
} else {
Write-Warning "Release directory does not exist"
}

- name: Sign embedded binaries
shell: pwsh
env:
SIGNPATH_API_TOKEN: ${{ secrets.SIGNPATH_API_TOKEN }}
run: |
$buildDir = "build/windows/x64/runner/Release"
$signScript = "./scripts/ci/sign-windows.ps1"

# Third-party binaries that are already signed by their vendors
$thirdParty = @(
'wintun.dll', # WinTun
'flutter_windows.dll', # Google/Flutter
'WebView2Loader.dll', # Microsoft
'WinSparkle.dll' # WinSparkle
)

# Discover all EXEs and DLLs, excluding third-party signed binaries
$binaries = Get-ChildItem -Path $buildDir -Include '*.exe','*.dll' -Recurse -File |
Where-Object { $thirdParty -notcontains $_.Name } |
Select-Object -ExpandProperty FullName
# Sign each binary
foreach ($binary in $binaries) {
if (Test-Path $binary) {
Write-Host "Signing $binary..."
& $signScript `
-FilePath $binary `
-SigningPolicy "${{ env.SIGNPATH_SIGNING_POLICY }}" `
-OrganizationId "${{ vars.SIGNPATH_ORG_ID }}" `
-ProjectSlug "${{ vars.SIGNPATH_PROJECT_SLUG }}" `
-ApiToken $env:SIGNPATH_API_TOKEN `
-Description "GitHub Actions build ${{ inputs.version }}"

if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to sign $binary"
exit 1
}
} else {
Write-Warning "Binary not found, skipping: $binary"
}
}

Write-Host "All binaries signed successfully"

- name: Package installer
shell: pwsh
env:
FULL_INSTALLER_NAME: ${{ inputs.installer_base_name }}${{ inputs.build_type != 'production' && format('-{0}', inputs.build_type) || '' }}
run: |
flutter_distributor package `
--platform windows `
--targets "exe" `
--skip-clean `
--build-dart-define=BUILD_TYPE=${{ env.BUILD_TYPE }} `
--build-dart-define=VERSION=${{ inputs.version }} `
--flutter-build-args=verbose

Write-Host ""
Write-Host "=== Contents of dist/$env:APP_VERSION/ ==="
Get-ChildItem -Path "dist/$env:APP_VERSION/" -Recurse | Select-Object FullName
Write-Host ""

Move-Item "dist/$env:APP_VERSION/$env:APP_NAME-$env:APP_VERSION-windows-setup.exe" "$env:FULL_INSTALLER_NAME.exe"

- name: Sign EXE with Azure Code Signing
uses: getlantern/trusted-signing-action@main
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
endpoint: https://wus2.codesigning.azure.net/
code-signing-account-name: code-signing
certificate-profile-name: Lantern
files-folder: ${{ github.workspace }}/
files-folder-filter: exe,dll,msix
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
- name: Sign installer
shell: pwsh
env:
SIGNPATH_API_TOKEN: ${{ secrets.SIGNPATH_API_TOKEN }}
FULL_INSTALLER_NAME: ${{ inputs.installer_base_name }}${{ inputs.build_type != 'production' && format('-{0}', inputs.build_type) || '' }}
run: |
./scripts/ci/sign-windows.ps1 `
-FilePath "$env:FULL_INSTALLER_NAME.exe" `
-SigningPolicy "${{ env.SIGNPATH_SIGNING_POLICY }}" `
-OrganizationId "${{ vars.SIGNPATH_ORG_ID }}" `
-ProjectSlug "${{ vars.SIGNPATH_PROJECT_SLUG }}" `
-ApiToken $env:SIGNPATH_API_TOKEN `
-Description "Installer - GitHub Actions build ${{ inputs.version }}"

- name: Upload Windows installer
uses: actions/upload-artifact@v4
env:
FULL_INSTALLER_NAME: ${{ inputs.installer_base_name }}${{ inputs.build_type != 'production' && format('-{0}', inputs.build_type) || '' }}
with:
name: lantern-installer-exe
path: ${{ env.FULL_INSTALLER_NAME }}.exe
path: ${{ inputs.installer_base_name }}${{ inputs.build_type != 'production' && format('-{0}', inputs.build_type) || '' }}.exe
retention-days: 2
24 changes: 23 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,16 @@ jobs:
build_type: ${{ needs.set-metadata.outputs.build_type }}
installer_base_name: ${{ needs.set-metadata.outputs.installer_base_name }}

build-windows:
needs: [set-metadata, release-create]
uses: ./.github/workflows/build-windows.yml
secrets: inherit
if: ${{ needs.set-metadata.outputs.platform == 'all' || contains(needs.set-metadata.outputs.platform, 'windows') }}
with:
version: ${{ needs.set-metadata.outputs.version }}
build_type: ${{ needs.set-metadata.outputs.build_type }}
installer_base_name: ${{ needs.set-metadata.outputs.installer_base_name }}

build-linux:
needs: [set-metadata, release-create]
uses: ./.github/workflows/build-linux.yml
Expand Down Expand Up @@ -265,10 +275,19 @@ jobs:
--notes "Build [in progress](${WORKFLOW_URL})..."

upload-s3:
needs: [set-metadata, build-macos, build-linux, build-android, build-ios]
needs:
[
set-metadata,
build-macos,
build-windows,
build-linux,
build-android,
build-ios,
]
if: |
!cancelled() &&
(needs.build-macos.result == 'success' || needs.build-macos.result == 'skipped') &&
(needs.build-windows.result == 'success' || needs.build-windows.result == 'skipped') &&
(needs.build-linux.result == 'success' || needs.build-linux.result == 'skipped') &&
(needs.build-android.result == 'success' || needs.build-android.result == 'skipped') &&
(needs.build-ios.result == 'success' || needs.build-ios.result == 'skipped')
Expand Down Expand Up @@ -336,6 +355,7 @@ jobs:
set-metadata,
release-create,
build-macos,
build-windows,
build-linux,
build-android,
build-ios,
Expand All @@ -344,6 +364,7 @@ jobs:
!cancelled() &&
needs.release-create.result == 'success' &&
(needs.build-macos.result == 'success' || needs.build-macos.result == 'skipped') &&
(needs.build-windows.result == 'success' || needs.build-windows.result == 'skipped') &&
(needs.build-linux.result == 'success' || needs.build-linux.result == 'skipped') &&
(needs.build-android.result == 'success' || needs.build-android.result == 'skipped') &&
(needs.build-ios.result == 'success' || needs.build-ios.result == 'skipped')
Expand Down Expand Up @@ -393,6 +414,7 @@ jobs:
}

upload_if_exists "lantern-installer-dmg/${FULL_NAME}.dmg"
upload_if_exists "lantern-installer-exe/${FULL_NAME}.exe"
upload_if_exists "lantern-installer-apk/${FULL_NAME}.apk"
upload_if_exists "lantern-installer-deb/${FULL_NAME}.deb"
upload_if_exists "lantern-installer-rpm/${FULL_NAME}.rpm"
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ windows-debug: windows
.PHONY: build-windows-release
build-windows-release:
@echo "Building Flutter app (release) for Windows..."
flutter build windows --release
flutter build windows --release --verbose

.PHONY: windows-release
windows-release: clean windows pubget gen build-windows-release prepare-windows-release
Expand Down
8 changes: 5 additions & 3 deletions linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,11 @@ endforeach(bundled_library)

# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
if(EXISTS "${NATIVE_ASSETS_DIR}")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
endif()

# Fully re-copy the assets directory on each build to avoid having stale files
# from a previous install.
Expand Down
8 changes: 8 additions & 0 deletions scripts/ci/format.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ release-notes)
echo "- [macOS (.dmg)](${LATEST_URL}/${FULL_INSTALLER_NAME}.dmg) ([permalink](${VERSION_URL}/${FULL_INSTALLER_NAME}.dmg))"
fi

if should_include "windows"; then
echo "- [Windows (.exe)](${LATEST_URL}/${FULL_INSTALLER_NAME}.exe) ([permalink](${VERSION_URL}/${FULL_INSTALLER_NAME}.exe))"
fi

if should_include "android"; then
echo "- [Android (.apk)](${LATEST_URL}/${FULL_INSTALLER_NAME}.apk) ([permalink](${VERSION_URL}/${FULL_INSTALLER_NAME}.apk))"
fi
Expand Down Expand Up @@ -94,6 +98,10 @@ slack)
text="${text}\n• macOS <${LATEST_URL}/${FULL_INSTALLER_NAME}.dmg|${FULL_INSTALLER_NAME}.dmg> (<${VERSION_URL}/${FULL_INSTALLER_NAME}.dmg|permalink>)"
fi

if should_include "windows"; then
text="${text}\n• Windows <${LATEST_URL}/${FULL_INSTALLER_NAME}.exe|${FULL_INSTALLER_NAME}.exe> (<${VERSION_URL}/${FULL_INSTALLER_NAME}.exe|permalink>)"
fi

if should_include "android"; then
text="${text}\n• Android <${LATEST_URL}/${FULL_INSTALLER_NAME}.apk|${FULL_INSTALLER_NAME}.apk> (<${VERSION_URL}/${FULL_INSTALLER_NAME}.apk|permalink>)"
fi
Expand Down
2 changes: 1 addition & 1 deletion scripts/ci/publish-to-s3.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ upload_artifact() {
# platform:extension
declare -a artifacts=(
"macos:dmg"
# "windows:exe" # TODO: re-enable when windows is built
"windows:exe"
"android:apk"
"linux:deb"
"linux:rpm"
Expand Down
Loading
Loading