Skip to content

2026.14

2026.14 #133

name: Create Ubuntu and Window Releases
on:
push:
tags:
- '*'
workflow_dispatch:
jobs:
build-linux:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
submodules: 'true'
- name: Extract release notes
id: release_notes
run: |
NOTES=$(python3 ci_scripts/release_notes_to_md.py "${GITHUB_REF_NAME}")
{
echo "notes<<RELEASE_NOTES_EOF"
echo "$NOTES"
echo "RELEASE_NOTES_EOF"
} >> "$GITHUB_OUTPUT"
- run: docker pull ghcr.io/xlightssequencer/xlights-build-docker:master
- run: docker run -e XLIGHTS_REF="${GITHUB_REF_NAME}" -e XLIGHTS_VERSION="${GITHUB_REF_NAME}" --name buildvm ghcr.io/xlightssequencer/xlights-build-docker:master /bin/bash Recipe.appimage
- run: 'docker cp buildvm:/xLights/xLights/AppImage/ /tmp/'
- run: ls -lh /tmp/AppImage
- uses: ncipollo/release-action@v1
with:
allowUpdates: true
draft: true
artifacts: "/tmp/AppImage/*.AppImage"
body: ${{ steps.release_notes.outputs.notes }}
token: ${{ secrets.GITHUB_TOKEN }}
build-windows:
runs-on: windows-2022
# Tag/dispatch-only workflow, so always enter the `release` environment: the
# OIDC token subject (repo:.../environment:release) must match the Entra
# federated credential that authorizes Azure Trusted Signing. Signing is then
# gated on the WINDOWS_SIGNING_ENABLED repo variable, so releases keep
# building (unsigned) until Trusted Signing is configured.
environment: release
permissions:
id-token: write
contents: write
env:
SIGN: ${{ vars.WINDOWS_SIGNING_ENABLED == 'true' }}
steps:
- name: Checkout xLights
uses: actions/checkout@v4
with:
submodules: 'true'
- name: Setup msbuild
uses: microsoft/setup-msbuild@v3
- name: install ISPC
uses: ispc/install-ispc-action@main
with:
version: 1.31.0
# glslc (Vulkan SDK Bin) compiles the .comp compute kernels to SPIR-V
# headers via the Xlights.vcxproj CompileVulkanShaders pre-build target
# (x64). The action exports VULKAN_SDK so that target's PowerShell script
# finds glslc; without it the msbuild step fails at the pre-build event.
- name: Install Vulkan SDK
uses: jakoch/install-vulkan-sdk-action@v1
with:
install_runtime: false
cache: true
- name: Download wxWidgets
run:
git clone --depth=1 --shallow-submodules --recurse-submodules -b xlights_2026.13 https://github.com/xLightsSequencer/wxWidgets ..\wxWidgets\
- name: Build wxWidgets
working-directory: ..\wxWidgets\
run: msbuild /m .\build\msw\wx_vc17.sln /p:Configuration="Release" /p:Platform="x64"
- name: Build All
shell: cmd
working-directory: build_scripts\msw
run: call build_VS_x64_skip_libltc.cmd
# --- Authenticode signing via Azure Trusted Signing (Kulp Lights LLC) ------
# Sign our own executables before packaging, then sign the installer after
# ISCC (the artifact users download and that SmartScreen/AV evaluate).
# Third-party DLLs keep their vendors' signatures. Reuses fppMon's signing
# account/profile; runs only when WINDOWS_SIGNING_ENABLED is set.
- name: Azure login (OIDC for Trusted Signing)
if: env.SIGN == 'true'
uses: azure/login@v3
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Sign xLights.exe (Trusted Signing)
if: env.SIGN == 'true'
uses: azure/artifact-signing-action@v2
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: kulplightssigning
certificate-profile-name: kulplights-public
files-folder: xlights\x64\Release
files-folder-filter: exe
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
- name: Sign xlDo.exe (Trusted Signing)
if: env.SIGN == 'true'
uses: azure/artifact-signing-action@v2
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: kulplightssigning
certificate-profile-name: kulplights-public
files-folder: xlDo\x64\Release
files-folder-filter: exe
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
- name: Sign fseq_convert.exe (Trusted Signing)
if: env.SIGN == 'true'
uses: azure/artifact-signing-action@v2
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: kulplightssigning
certificate-profile-name: kulplights-public
files-folder: fseq_convert\cmake_vs\Release
files-folder-filter: exe
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
- name: Build Installer
working-directory: build_scripts\msw
run: ISCC.exe xLights_4_64bit_VS.iss
- name: Sign installer (Trusted Signing)
if: env.SIGN == 'true'
uses: azure/artifact-signing-action@v2
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: kulplightssigning
certificate-profile-name: kulplights-public
files-folder: build_scripts\msw\output
files-folder-filter: exe
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
# --- Microsoft Store package (unsigned; the Store re-signs on ingestion) ----
# Built every release so the .msix is ready for manual Partner Center upload.
# Bundles the already-signed exes. Output to a separate dir and uploaded as a
# workflow artifact (NOT a public release asset) - an unsigned Store-identity
# package isn't user-installable, so it must not land in the GitHub release.
- name: Build Store MSIX
shell: pwsh
working-directory: build_scripts\msw\msix
run: ./BuildMSIX.ps1 -Store -OutDir ..\store-output
- name: Upload Store MSIX artifact
uses: actions/upload-artifact@v4
with:
name: xLights_Store_MSIX
path: build_scripts\msw\store-output\xLights-Store-x64.msix
- name: Stage Windows symbol map
shell: pwsh
run: |
if (-not (Test-Path bin64\xLights.map)) {
throw "bin64\xLights.map not produced - PrepMap step likely failed"
}
Copy-Item bin64\xLights.map "build_scripts\msw\output\xLights-${{ github.ref_name }}-win64.map"
Write-Host "Staged symbol map: $((Get-Item bin64\xLights.map).Length) bytes"
- uses: ncipollo/release-action@v1
with:
allowUpdates: true
draft: true
omitBodyDuringUpdate: true
artifacts: 'build_scripts\msw\output\*'
token: ${{ secrets.GITHUB_TOKEN }}
publish-release:
needs: [build-linux, build-windows]
runs-on: ubuntu-24.04
steps:
- name: Publish draft release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release edit "${GITHUB_REF_NAME}" --draft=false --repo "${GITHUB_REPOSITORY}"
- uses: vedantmgoyal9/winget-releaser@main
with:
identifier: xLightsSequencer.xLights
installers-regex: '\.exe$' # Only .exe files
token: ${{ secrets.WINGET_TOKEN }}