This document explains how to locally set up and run the LabVIEW Icon Editor workflows on a self-hosted runner using GitHub Actions.
This document details how to automate building, testing, and packaging the LabVIEW Icon Editor on Windows using GitHub Actions on a self-hosted runner. By employing these workflows, you can:
vi.lib or toggling labview.ini..vip artifact for download; the workflow does not create tags or GitHub releases.Additionally, you can pass metadata fields (like organization or repository name) to the build script. These fields are embedded into the VI Package display information, effectively branding the Icon Editor package with a unique identifier. This is especially useful when multiple forks or organizations produce their own versions of the Icon Editor—ensuring each .vip is clearly labeled with the correct “author” or “company.”
Prerequisites:
- LabVIEW 2021 (21.0), 32-bit and 64-bit.
- The relevant VIPC file is now at
.github/actions/apply-vipc/runner_dependencies.vipc.- PowerShell 7+
- Git for Windows
For experienced users, a brief overview:
.github/actions/apply-vipc/runner_dependencies.vipc with VIPM in LabVIEW 2021 (21.0) 32-bit; repeat for LabVIEW 2021 (21.0) 64-bit.apply-deps job in .github/workflows/ci-composite.yml runs only when .vipc files change (if: needs.changes.outputs.vipc == 'true'). When no .vipc updates exist, dependencies aren’t installed automatically, so apply the VIPC manually.Set_Development_Mode.ps1 or RevertDevelopmentMode.ps1) via the Development Mode Toggle workflow..vip using the version computed by the workflow’s separate version job (see that job’s output for the generated version). Publishing tags or GitHub releases requires a separate workflow.-CompanyName "MyOrg" or -AuthorName "myorg/myrepo") to brand the resulting package with your unique identifiers.Development Mode
labview.ini and vi.lib so LabVIEW loads your Icon Editor source directly, renaming lv_icon.lvlibp to lv_icon.ship and packaging the LabVIEW Icon API.Testing / Distributable Builds
.vip artifact or tests reflect a standard environment.mode: enable → calls Set_Development_Mode.ps1.mode: disable → calls RevertDevelopmentMode.ps1.labview_version (default 2021, only 2021 is supported)..vip using the version job’s outputs.major, minor, patch). Defaults to patch if no label.git rev-list --count HEAD)..vip as an artifact; creating Git tags or GitHub releases requires a separate workflow.-CompanyName and -AuthorName into the build script. These map to fields in the VI Package (e.g., “Company Name,” “Author Name (Person or Company)”).Steps:
.github/actions/apply-vipc/runner_dependencies.vipc to each if needed..lvversion as the single source of truth. The runner sanity step validates that the installed LabVIEW version matches .lvversion and fails fast if it does not.C:\Program Files\National Instruments\LabVIEW <Year> (64-bit)C:\Program Files (x86)\National Instruments\LabVIEW <Year> (32-bit)HKLM:\SOFTWARE\National Instruments\LabVIEW <Year>HKLM:\SOFTWARE\WOW6432Node\National Instruments\LabVIEW <Year>Path, InstallDir, or InstallPath values for a valid install root.LVIE_FORCE_NO_LABVIEW_DEVMODE=1 is set, runner sanity also checks write access to:
vi.libvi.lib\LabVIEW Icon API (if present)resource\pluginsLabVIEW.iniLVIE_RUNNER_ACL_CHECK=0 (not recommended).LVIE_RUNNER_ACL_AUTOFIX=1 to grant Modify permissions to the current runner identity.icacls).self-hosted-windows-lv label by default (or LVIE_RUNNER_LABEL if set). Its runs-on expression also references self-hosted-linux-lv for potential Linux jobs, though the default matrix runs only on Windows. Label your runner accordingly, and prepare a Linux runner with self-hosted-linux-lv if you expand the matrix._diag\pages folder..github\scripts\cleanup-runner-diag-pages.ps1.github\scripts\runner-job-started-clean-diag.ps1<runner-root>\scripts\ and set the hook in <runner-root>\.env:
ACTIONS_RUNNER_HOOK_JOB_STARTED=C:\path\to\runner\scripts\runner-job-started-clean-diag.ps1.env.RUNNER_DIAG_RETENTION_DAYS=7 in .env if you want to keep recent logs.<runner-root>\_work\lvie\w (for example C:\actions-runner\_work\lvie\w).pwsh -NoProfile -File .\Tooling\Setup-Runner.ps1 -RunnerRoot C:\actions-runner -Scope Machine<runner-root>\_work\lvie\runner-contract.json and sets LVIE_WORKTREE_ROOT, LVIE_ARTIFACT_ROOT, LVIE_LOCK_ROOT, and LVIE_LOG_ROOT.runner-bootstrap action, which runs Tooling/Initialize-Runner.ps1 at job start to refresh the runner contract and export LVIE_* variables into the job environment.With your runner online:
mode: enable.labview_version is fixed to 2021 if provided..vip using the version computed in the version job (review that job’s output for version details). The workflow only uploads the artifact; creating tags or GitHub releases requires additional steps.-CompanyName "AcmeCorp" / -AuthorName "AcmeCorp/IconEditor") to embed in the final package.mode: disable reverts your LabVIEW environment.labview_version set to 2021 if you include it..vip
CI jobs run from short-path worktrees to avoid Windows path limits. Each job creates:
ci-<jobhash>-<bitness>-<runid>-<attempt>jobhash = first 8 chars of SHA1(GITHUB_JOB) to keep job names unique.<jobhash> and <bitness>.C:\dev\ci-D170BDEE-64-21534416929-1The workflow exports:
REPO_ROOT → worktree path (authoritative for scripts)PROJECT_PATH → $REPO_ROOT\lv_icon_editor.lvprojLABVIEW_VERSION_YEAR / LABVIEW_MINOR_REVISION → derived from .lvversion (e.g., 21.0 → 2021 and minor 0)CI treats .lvversion in REPO_ROOT as the canonical LabVIEW version for the run.
If you need deterministic runs for a specific commit, use the helper script:
pwsh -NoProfile -File .\Tooling\Run-CICompositeForCommit.ps1 -Sha <commit>
Notes:
ci-run/<shortsha> branch and dispatches the workflow on it.-CleanupRemote to delete the temporary branch after dispatch.major, minor, or patch..vip..vip, so each build is easily identified..vip artifact for final validations.ManualSetup.md or the original documentation for advanced configuration steps.Happy Building! By integrating these workflows, you’ll maintain a robust, automated CI/CD pipeline for the LabVIEW Icon Editor—complete with semantic versioning, build artifact uploads, and metadata branding (company/repo).