-
Notifications
You must be signed in to change notification settings - Fork 11
Description
Problem / Background
Windows users currently need to manually download and install all-smi from GitHub releases. Registering the package with WinGet (Windows Package Manager) will enable users to install via a simple command:
winget install all-smiThis aligns with our distribution strategy for other platforms (Ubuntu PPA, Homebrew consideration) and improves discoverability for Windows users.
Proposed Solution
Submit all-smi to the microsoft/winget-pkgs repository by creating the required manifest files and opening a pull request.
Package Information
| Field | Value |
|---|---|
| PackageIdentifier | Lablup.AllSmi |
| PackageVersion | 0.14.0 |
| Moniker | all-smi |
| Publisher | Lablup Inc. |
| License | Apache-2.0 |
| Homepage | https://github.com/lablup/all-smi |
| InstallerUrl | https://github.com/lablup/all-smi/releases/download/v{version}/all-smi-windows-x86_64.zip |
Implementation Steps
1. Fork and Clone winget-pkgs Repository
gh repo fork microsoft/winget-pkgs --clone
cd winget-pkgs2. Create Manifest Directory Structure
manifests/
l/
Lablup/
AllSmi/
0.14.0/
Lablup.AllSmi.yaml # Version manifest
Lablup.AllSmi.installer.yaml # Installer manifest
Lablup.AllSmi.locale.en-US.yaml # Locale manifest (default)
3. Create Version Manifest (Lablup.AllSmi.yaml)
PackageIdentifier: Lablup.AllSmi
PackageVersion: 0.14.0
DefaultLocale: en-US
ManifestType: version
ManifestVersion: 1.6.04. Create Installer Manifest (Lablup.AllSmi.installer.yaml)
PackageIdentifier: Lablup.AllSmi
PackageVersion: 0.14.0
Platform:
- Windows.Desktop
MinimumOSVersion: 10.0.0.0
InstallerType: zip
NestedInstallerType: portable
NestedInstallerFiles:
- RelativeFilePath: all-smi.exe
PortableCommandAlias: all-smi
Installers:
- Architecture: x64
InstallerUrl: https://github.com/lablup/all-smi/releases/download/v0.14.0/all-smi-windows-x86_64.zip
InstallerSha256: <SHA256_HASH>
ManifestType: installer
ManifestVersion: 1.6.0Note: The SHA256 hash should be obtained from the .sha256 file in the release or computed locally:
(Get-FileHash -Algorithm SHA256 all-smi-windows-x86_64.zip).Hash5. Create Locale Manifest (Lablup.AllSmi.locale.en-US.yaml)
PackageIdentifier: Lablup.AllSmi
PackageVersion: 0.14.0
PackageLocale: en-US
Publisher: Lablup Inc.
PublisherUrl: https://www.lablup.com
PublisherSupportUrl: https://github.com/lablup/all-smi/issues
PackageName: all-smi
PackageUrl: https://github.com/lablup/all-smi
License: Apache-2.0
LicenseUrl: https://github.com/lablup/all-smi/blob/main/LICENSE
ShortDescription: Command-line utility for monitoring GPU hardware
Description: |-
all-smi is a unified command-line utility for monitoring GPU and AI accelerator hardware.
It provides real-time metrics including utilization, memory usage, temperature, and power consumption.
Supports NVIDIA GPUs, Apple Silicon, Intel Gaudi, AMD GPUs, and various NPU platforms.
Tags:
- gpu
- nvidia
- monitoring
- hardware
- cli
- gpu-monitor
- nvidia-smi
- system-monitor
Moniker: all-smi
ManifestType: defaultLocale
ManifestVersion: 1.6.06. Validate Manifests
# Install winget-create tool
winget install wingetcreate
# Validate manifests
winget validate --manifest manifests/l/Lablup/AllSmi/0.14.0/7. Test Installation Locally
winget install --manifest manifests/l/Lablup/AllSmi/0.14.0/8. Submit Pull Request
Create a PR to microsoft/winget-pkgs with:
- Title:
New package: Lablup.AllSmi version 0.14.0 - Description explaining the package and its purpose
- Ensure all automated checks pass
GitHub Action Automation for WinGet PR
This section provides a complete setup for automatically creating WinGet pull requests when new releases are published.
Prerequisites
-
Fork microsoft/winget-pkgs - Required for creating PRs
-
Create GitHub Personal Access Token (PAT):
- Go to GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens
- Token name:
WINGET_TOKEN - Repository access: Select
microsoft/winget-pkgs(your fork) - Permissions required:
- Contents: Read and write
- Pull requests: Read and write
- Metadata: Read-only
-
Add Secret to Repository:
- Go to lablup/all-smi → Settings → Secrets and variables → Actions
- Add new secret:
WINGET_TOKENwith your PAT value
GitHub Action Workflow
Create .github/workflows/winget-publish.yml:
name: Publish to WinGet
on:
release:
types: [published]
jobs:
publish:
# Only run on non-prerelease Windows releases
if: ${{ !github.event.release.prerelease }}
runs-on: windows-latest
steps:
- name: Publish to WinGet
uses: vedantmgoyal9/winget-releaser@v2
with:
# Package identifier in WinGet
identifier: Lablup.AllSmi
# Regex to match the Windows installer asset
installers-regex: 'all-smi-windows-x86_64\.zip$'
# GitHub PAT with access to fork winget-pkgs and create PRs
token: ${{ secrets.WINGET_TOKEN }}How It Works
- Trigger: When a new release is published on GitHub
- Asset Detection: Finds
all-smi-windows-x86_64.zipusing the regex pattern - Hash Calculation: Automatically downloads and computes SHA256 hash
- Manifest Generation: Creates/updates manifest files in winget-pkgs fork
- PR Creation: Opens a pull request to microsoft/winget-pkgs
Workflow Features
| Feature | Description |
|---|---|
| Auto version detection | Extracts version from release tag (e.g., v0.14.0 → 0.14.0) |
| SHA256 auto-calculation | Downloads asset and computes hash automatically |
| Existing version check | Skips if version already exists in winget-pkgs |
| PR auto-formatting | Follows microsoft/winget-pkgs PR conventions |
Advanced Configuration
For more control, use the extended configuration with manual trigger support:
name: Publish to WinGet
on:
release:
types: [published]
workflow_dispatch:
inputs:
release-tag:
description: 'Release tag to publish (e.g., v0.15.0)'
required: true
type: string
jobs:
publish:
if: ${{ !github.event.release.prerelease || github.event_name == 'workflow_dispatch' }}
runs-on: windows-latest
steps:
- name: Publish to WinGet
uses: vedantmgoyal9/winget-releaser@v2
with:
identifier: Lablup.AllSmi
installers-regex: 'all-smi-windows-x86_64\.zip$'
token: ${{ secrets.WINGET_TOKEN }}
release-tag: ${{ inputs.release-tag || github.event.release.tag_name }}Manual Trigger Support
The workflow_dispatch event allows manual triggering from GitHub Actions UI:
- Go to Actions → "Publish to WinGet"
- Click "Run workflow"
- Enter the release tag (e.g.,
v0.15.0) - Click "Run workflow"
This is useful for:
- Retrying failed submissions
- Publishing older versions
- Testing the workflow
Troubleshooting
| Issue | Solution |
|---|---|
| "Resource not accessible by integration" | PAT lacks required permissions. Regenerate with correct scopes. |
| "Version already exists" | Normal - package version already in winget-pkgs |
| "No matching assets found" | Check installers-regex matches your release asset name |
| PR validation fails | Check manifest schema version and required fields |
Monitoring
After setup, monitor the workflow:
- GitHub Actions tab shows workflow runs
- Check winget-pkgs fork for created branches
- Monitor microsoft/winget-pkgs PRs for your submissions
Acceptance Criteria
- Create manifest files following WinGet manifest schema v1.6.0
- Validate manifests using
winget validate - Test local installation with
winget install --manifest - Submit PR to microsoft/winget-pkgs repository
- PR passes all automated validation checks
- Package is searchable via
winget search all-smiafter merge - Set up GitHub Action for automated WinGet PR creation
- Add
WINGET_TOKENsecret to repository
First-Time Setup Checklist
- Fork microsoft/winget-pkgs repository
- Create GitHub PAT with required permissions
- Add
WINGET_TOKENsecret to lablup/all-smi repository - Create
.github/workflows/winget-publish.yml - Initial manual submission to establish package in winget-pkgs
- Test automation with next release
Technical Considerations
Portable vs Installer
We are using the portable installation type (zip extraction) since:
- Our release is a standalone executable in a zip file
- No registry entries or complex installation required
- Simpler maintenance and updates
InstallerType Details
For zip files containing a portable executable:
InstallerType: zip- indicates the package is distributed as a zip fileNestedInstallerType: portable- indicates the zip contains a portable appNestedInstallerFiles- specifies the executable path within the zip
SHA256 Hash Management
Each version update requires:
- Computing SHA256 of the new zip file
- Updating the installer manifest with the new hash
With the GitHub Action automation, this is handled automatically.
Additional Context
- WinGet Package Manifest Documentation
- WinGet CLI Repository
- WinGet Packages Repository
- vedantmgoyal9/winget-releaser - GitHub Action for WinGet
- Example Portable Package
- Related: Add Windows x64 build target #97 (Add Windows x64 build target)