Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
70971b4
Initial plan
Copilot Jan 10, 2026
f9bb5b7
Add pr-builds module with GitHub API integration and tests
Copilot Jan 10, 2026
a6a754b
Add IPC handlers and startup logic for PR builds feature
Copilot Jan 10, 2026
0ef3eff
Add frontend UI for PR builds settings
Copilot Jan 10, 2026
af5e810
Add documentation and fix tests for PR builds feature
Copilot Jan 10, 2026
2d14d1c
Use nightly.link for artifact downloads and enable feature by default
Copilot Jan 10, 2026
a3b0fa5
Fix linting errors
Copilot Jan 10, 2026
197a394
Apply prettier formatting and add compiled .js files to .prettierignore
Copilot Jan 10, 2026
0fd67a4
Fix TypeScript errors by removing conflicting Window.desktopApi decla…
Copilot Jan 10, 2026
3976218
Fix Windows path test failure in pr-builds.test.ts
Copilot Jan 10, 2026
4118f9a
Add i18n translations for PR builds feature
Copilot Jan 10, 2026
4f8d85b
Remove compiled .js files from version control and update .gitignore
Copilot Jan 11, 2026
67e1ddd
Refactor PR builds to reduce main.ts complexity
Copilot Jan 11, 2026
1c1e710
Add e2e test for PR builds feature
Copilot Jan 11, 2026
99ec8f4
Add Electron dialog confirmation for PR build operations
Copilot Jan 11, 2026
97ec424
Apply prettier formatting to pr-builds.ts
Copilot Jan 11, 2026
952f5f6
Rename pr-builds to prBuilds (Phase 1)
Copilot Jan 11, 2026
e9b5e27
Add Cosign signing to GitHub Actions workflows (Phase 2)
Copilot Jan 11, 2026
20988bd
Add Sigstore signature verification using @sigstore/verify (Phase 3)
Copilot Jan 11, 2026
4f12ba6
Add signature verification documentation and complete Phase 4-5
Copilot Jan 11, 2026
106229c
Fix TypeScript and linting errors in prBuilds module
Copilot Jan 11, 2026
7addc95
Implement full Sigstore cryptographic verification
Copilot Jan 11, 2026
30702bc
Run frontend lint fix to resolve import sorting
Copilot Jan 11, 2026
45ecb1e
Address all PR review feedback: TSDoc, Snackbar, Storybook, security …
Copilot Jan 11, 2026
4f6ccb4
Fix Settings module export: remove duplicate index.ts file
Copilot Jan 11, 2026
2cbb918
Fix Storybook import and update test snapshots
Copilot Jan 11, 2026
2a0a5a5
Enhance PR builds UI with auto-refresh, build progress, avatars, and …
Copilot Jan 11, 2026
8846250
Add accessibility testing to PR builds e2e tests and update snapshots
Copilot Jan 11, 2026
71e84c5
Mock dates in Storybook stories and add failed build status display
Copilot Jan 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
24 changes: 21 additions & 3 deletions .github/workflows/app-artifacts-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
permissions:
actions: write # needed to upload artifacts
contents: write
id-token: write # needed for Sigstore keyless signing
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
Expand All @@ -34,24 +35,41 @@ jobs:
- name: Rename AppImage 64bit version
run: |
FILE_PATH=$(echo app/dist/Headlamp*x86_64*.AppImage); mv ${FILE_PATH} $(echo ${FILE_PATH}|sed s/x86_64/x64/)
- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Sign Linux artifacts with Cosign
run: |
cd app/dist
for file in Headlamp*.tar.* Headlamp*.AppImage headlamp*.deb; do
if [ -f "$file" ]; then
echo "Signing $file"
cosign sign-blob --yes --bundle "${file}.cosign.bundle" "$file"
fi
done
- name: Upload Tarball artifacts
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: Tarballs
path: ./app/dist/Headlamp*.tar.*
path: |
./app/dist/Headlamp*.tar.*
./app/dist/Headlamp*.tar.*.cosign.bundle
if-no-files-found: error
retention-days: 1
- name: Upload AppImage artifacts
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: AppImages
path: ./app/dist/Headlamp*.AppImage
path: |
./app/dist/Headlamp*.AppImage
./app/dist/Headlamp*.AppImage.cosign.bundle
if-no-files-found: error
retention-days: 1
- name: Upload Debian artifacts
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: Debian
path: ./app/dist/headlamp*.deb
path: |
./app/dist/headlamp*.deb
./app/dist/headlamp*.deb.cosign.bundle
if-no-files-found: error
retention-days: 1
24 changes: 21 additions & 3 deletions .github/workflows/app-artifacts-mac.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ jobs:
permissions:
contents: read
actions: write # needed to upload artifacts
id-token: write # needed for Sigstore keyless signing
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
Expand Down Expand Up @@ -63,11 +64,24 @@ jobs:
if: ${{ ! inputs.signBinaries }}
run: |
make app-mac
- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Sign Mac artifacts with Cosign
run: |
cd app/dist
for file in Headlamp*.dmg; do
if [ -f "$file" ]; then
echo "Signing $file"
cosign sign-blob --yes --bundle "${file}.cosign.bundle" "$file"
fi
done
- name: Upload artifact
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: dmgs
path: ./app/dist/Headlamp*.dmg
path: |
./app/dist/Headlamp*.dmg
./app/dist/Headlamp*.dmg.cosign.bundle
if-no-files-found: error
retention-days: 1
notarize:
Expand Down Expand Up @@ -139,7 +153,9 @@ jobs:
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: dmgs
path: ./dmgs/Headlamp*.dmg
path: |
./dmgs/Headlamp*.dmg
./dmgs/Headlamp*.dmg.cosign.bundle
if-no-files-found: error
overwrite: true
retention-days: 2
Expand Down Expand Up @@ -212,7 +228,9 @@ jobs:
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: dmgs
path: ./dmgs/Headlamp*.dmg
path: |
./dmgs/Headlamp*.dmg
./dmgs/Headlamp*.dmg.cosign.bundle
if-no-files-found: error
overwrite: true
retention-days: 2
20 changes: 18 additions & 2 deletions .github/workflows/app-artifacts-win.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ permissions:
jobs:
build-windows:
permissions:
id-token: write # For fetching an OpenID Connect (OIDC) token
id-token: write # For fetching an OpenID Connect (OIDC) token and Sigstore keyless signing
contents: read
actions: write # needed to upload artifacts
runs-on: windows-2022
Expand Down Expand Up @@ -88,10 +88,26 @@ jobs:
}
make app-win

- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

- name: Sign Windows artifacts with Cosign
shell: pwsh
working-directory: headlamp
run: |
cd app/dist
Get-ChildItem -Filter "Headlamp*.*" | ForEach-Object {
$file = $_.Name
Write-Host "Signing $file"
cosign sign-blob --yes --bundle "$file.cosign.bundle" $file
}

- name: Upload artifact
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with:
name: Win exes
path: ./headlamp/app/dist/Headlamp*.*
path: |
./headlamp/app/dist/Headlamp*.*
./headlamp/app/dist/Headlamp*.*.cosign.bundle
if-no-files-found: error
retention-days: 2
21 changes: 21 additions & 0 deletions .github/workflows/push-release-assets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write # need to write to releases and download artifacts
id-token: write # needed for Sigstore keyless signing
steps:
- name: Checkout code
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
Expand Down Expand Up @@ -83,6 +84,26 @@ jobs:
exit 0
fi

- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

- name: Sign artifacts with Cosign for release
run: |
cd ./flattened-artifacts
# Sign only the actual binary artifacts (not existing .cosign.bundle files)
for file in Headlamp*.*; do
# Skip if file is already a cosign bundle
if [[ "$file" != *.cosign.bundle ]]; then
# Skip if cosign bundle already exists (from PR builds)
if [ ! -f "${file}.cosign.bundle" ]; then
echo "Signing $file for release"
cosign sign-blob --yes --bundle "${file}.cosign.bundle" "$file"
else
echo "Signature already exists for $file"
fi
fi
done

- name: Prepare GPG key
run: |
gpg_dir=.cr-gpg
Expand Down
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,37 @@ We maintain a list of the [Kubernetes platforms](./docs/platforms.md) we have
tested Headlamp with. We invite you to add any missing platforms you have
tested, or comment if there are any regressions in the existing ones.

## Security & Verification

### Signature Verification

All Headlamp desktop application artifacts (releases and PR builds) are signed using [Sigstore](https://www.sigstore.dev/) keyless signing with GitHub Actions OIDC identity. This provides cryptographic verification that binaries were built by official GitHub Actions workflows.

#### Verifying Release Artifacts

You can verify the authenticity of Headlamp releases using the Cosign CLI:

```bash
# Install Cosign (https://docs.sigstore.dev/cosign/installation/)
# macOS: brew install sigstore/tap/cosign
# Linux/Windows: See https://docs.sigstore.dev/cosign/installation/

# Download artifact and signature bundle
wget https://github.com/kubernetes-sigs/headlamp/releases/download/v0.40.0/Headlamp-0.40.0.AppImage
wget https://github.com/kubernetes-sigs/headlamp/releases/download/v0.40.0/Headlamp-0.40.0.AppImage.cosign.bundle

# Verify signature
cosign verify-blob \
--bundle Headlamp-0.40.0.AppImage.cosign.bundle \
--certificate-identity "https://github.com/kubernetes-sigs/headlamp/.github/workflows/push-release-assets.yml@refs/tags/v0.40.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
Headlamp-0.40.0.AppImage
```

Successful verification confirms the artifact was built by the official release workflow.

For more information about signature verification, including how to verify PR artifacts, see the [PR Development Builds documentation](./docs/development/prBuilds.md#signature-verification).

## Extensions / Plugins

Please see [headlamp plugins on Artifact Hub](https://artifacthub.io/packages/search?kind=21&sort=relevance&page=1) for a list of plugins published.
Expand Down
2 changes: 2 additions & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@
electron/windowSize.test.js
electron/env-paths.js
electron/runCmd.test.js
/electron/prBuilds.js
/electron/prBuilds.test.js
26 changes: 26 additions & 0 deletions app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,29 @@ Note, it runs the development servers for the backend and the frontend as well.
- `npm start`: Starts the app in dev mode along with the backend server, and the frontend development server.
- `npm run test`: Runs the tests. See the \*.test.js files in the electron/ folder.
- `npm run tsc`: Runs the type checker.

## Environment Variables

The Headlamp desktop app supports several environment variables to control its behavior:

- `HEADLAMP_ENABLE_APP_DEV_BUILDS`: Set to `false` to disable the PR builds feature. This feature allows testing development builds from pull requests. **Default:** enabled (set to `false` to disable)
- `HEADLAMP_CHECK_FOR_UPDATES`: Set to `false` to disable automatic update checks. **Default:** `true`
- `HEADLAMP_MAX_PORT_ATTEMPTS`: Maximum number of ports to try when starting the backend server. **Default:** `100`
- `ELECTRON_DEV`: Set to `1` for development mode. Used internally by `npm run dev`.
- `ELECTRON_START_URL`: Override the frontend URL. Used for development.
- `EXTERNAL_SERVER`: Set to `true` to use an external backend server instead of starting one.

Example usage:

```bash
# Disable PR builds feature (macOS/Linux)
export HEADLAMP_ENABLE_APP_DEV_BUILDS=false
./Headlamp

# Windows PowerShell
$env:HEADLAMP_ENABLE_APP_DEV_BUILDS="false"
.\Headlamp.exe
```

For more information about the PR builds feature, see the [PR Builds documentation](../docs/development/prBuilds.md).

Loading
Loading