This document describes the Continuous Integration and Continuous Deployment (CI/CD) infrastructure for fastfetch, including the GitHub Actions workflow, test strategies, platform build matrix, and release automation. The pipeline ensures code quality and cross-platform compatibility across 20+ operating system and architecture combinations.
For information about the CMake build configuration that underpins these builds, see Cross-Platform Build Configuration. For details on packaging artifacts produced by the CI pipeline, see Packaging and Distribution.
The CI/CD pipeline is defined in .github/workflows/ci.yml and consists of multiple parallel job stages that execute on push and pull request events. The workflow uses a matrix strategy to test across diverse platforms while maintaining a single source of truth for build configuration.
Workflow Job Structure
Sources: .github/workflows/ci.yml1-813
Each build job executes a standardized test sequence that validates functionality across multiple dimensions. Tests run in a fixed order to catch both build-time and runtime issues.
Standard Test Sequence
The test sequence verifies:
--list-features confirms compiled-in features match expectationsflashfetch binary (lightweight variant) executes correctlyldd/otool output validates dynamic linkingctest executes test suite defined in CMakeLists.txtSources: .github/workflows/ci.yml46-62 .github/workflows/ci.yml119-135
The CI pipeline builds and tests fastfetch on 20+ platform/architecture combinations using a mix of native runners and emulated environments via QEMU.
| Architecture | Runner | Build Strategy | Key Dependencies |
|---|---|---|---|
amd64 | ubuntu-22.04 | Native | gcc-13, full feature set + CodeQL |
aarch64 | ubuntu-22.04-arm | Native | gcc-13, full feature set |
i686 | ubuntu-22.04 | Cross-compile | gcc-13 multilib, -m32 -march=i686 |
armv7l | ubuntu-20.04 (QEMU) | Emulated | gcc-13, limited features |
armv6l | Debian Bookworm (QEMU) | Emulated | gcc, limited features |
riscv64 | ubuntu-22.04 (QEMU) | Emulated | gcc-13, full feature set |
ppc64le | ubuntu-22.04 (QEMU) | Emulated | gcc-13, full feature set |
s390x | ubuntu-22.04 (QEMU) | Emulated | gcc-13, full feature set |
glibc Polyfill: The amd64 and aarch64 builds apply glibc symbol polyfilling to achieve compatibility with glibc 2.17+, extending compatibility to older Linux distributions.
Sources: .github/workflows/ci.yml64-158 .github/workflows/ci.yml159-220 .github/workflows/ci.yml222-260 .github/workflows/ci.yml262-296 .github/workflows/ci.yml298-339
| Architecture | Distribution | Features |
|---|---|---|
amd64 | Alpine Linux | Static linking option, minimal dependencies |
The musl build uses Alpine Linux and enables the IS_MUSL flag, which adjusts memory allocation and system call patterns for musl libc compatibility.
Sources: .github/workflows/ci.yml341-377
| Architecture | Runner | Toolchain |
|---|---|---|
amd64 (Intel) | macos-15-intel | Homebrew clang |
aarch64 (Apple Silicon) | macos-latest | Homebrew clang |
macOS builds install dependencies via Homebrew, including vulkan-loader, vulkan-headers, molten-vk, imagemagick, and chafa.
Sources: .github/workflows/ci.yml379-431
| Architecture | Runner | Environment | Toolchain |
|---|---|---|---|
amd64 | windows-latest | MSYS2/CLANG64 | clang + mingw-w64 |
aarch64 | windows-11-arm | MSYS2/CLANGARM64 | clang + mingw-w64 |
Windows builds use MSYS2 with the Clang environment for better standards compliance and cross-platform consistency. Binaries are code-signed using SignPath integration for release builds.
Sources: .github/workflows/ci.yml647-745
| Platform | Version | Runner Strategy | Package Manager |
|---|---|---|---|
| FreeBSD | 14.3 | VM (cross-platform-actions) | pkg |
| OpenBSD | 7.7 | VM (cross-platform-actions) | pkg_add |
| NetBSD | 10.1 | VM (cross-platform-actions) | pkgin |
| DragonFly BSD | Latest | VM (vmactions) | pkg |
| SunOS (OmniOS) | Latest | VM (vmactions) | pkg |
| Haiku | r1beta5 | VM (cross-platform-actions) | pkgman |
BSD and other Unix builds execute in virtual machines using GitHub Actions' VM action providers, which configure the environment and install dependencies via platform-native package managers.
Sources: .github/workflows/ci.yml467-502 .github/workflows/ci.yml504-539 .github/workflows/ci.yml541-575 .github/workflows/ci.yml577-610 .github/workflows/ci.yml433-465 .github/workflows/ci.yml612-645
The spellcheck job runs codespell to detect common spelling errors in source code, comments, and documentation. This catches typos before they reach production.
Sources: .github/workflows/ci.yml11-25
The no-features-test job builds fastfetch with all optional features disabled to ensure the codebase compiles and functions with minimal dependencies. This validates that feature flags are correctly implemented and that no feature has become accidentally required.
Sources: .github/workflows/ci.yml27-62
The linux-hosts job on amd64 includes GitHub CodeQL analysis for C code. CodeQL performs static analysis to identify potential security vulnerabilities, code quality issues, and common programming errors.
Sources: .github/workflows/ci.yml103-107 .github/workflows/ci.yml115-117
All build jobs execute fastfetch with presets/ci.jsonc, which enables a comprehensive set of modules to exercise detection logic across all subsystems. The preset is designed for CI environments with:
"logo": null) to avoid terminal compatibility issues"stat": true) to verify performance metrics collection"pipe": true) for clean output"showErrors": true) to surface issuesThe CI preset configuration:
Sources: presets/ci.jsonc1-115
Key characteristics:
"driverSpecific": true)The test suite executes via ctest --output-on-failure, which runs unit tests for core data structures and utilities. Tests are defined in CMakeLists.txt with -DBUILD_TESTS=On.
Common test targets:
FFstrbuf tests: Dynamic string manipulation, memory managementFFlist tests: Dynamic array operations, resizingSources: .github/workflows/ci.yml61-62 .github/workflows/ci.yml134-135
Dependencies are installed differently per platform to balance availability, version requirements, and build reproducibility:
Linuxbrew provides newer ImageMagick versions than Ubuntu repositories, with --ignore-dependencies to avoid pulling unnecessary dependencies.
Sources: .github/workflows/ci.yml92-101
The HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 environment variable prevents Homebrew from attempting to rebuild dependent packages, speeding up CI runs.
Sources: .github/workflows/ci.yml399-401
MSYS2 packages are prefixed with mingw-w64-clang-$ARCH- for the Clang toolchain:
Sources: .github/workflows/ci.yml673-678
The release job creates GitHub releases automatically when new versions are detected on the master branch.
Release Process Details
The release job only executes when:
master branchfastfetch-cli/fastfetch (prevents forks from releasing)Version detection:
This output is captured in linux-hosts job and passed to the release job via job outputs.
Sources: .github/workflows/ci.yml137-139 .github/workflows/ci.yml746-812
Release notes include SHA256 and SHA512 checksums for all artifacts in collapsible Markdown sections:
[checksums listed here]
</details> <details><summary>SHA512SUMs</summary><br> [checksums listed here]
</details> Sources: .github/workflows/ci.yml794-803
Windows builds integrate with SignPath for code signing, which is required for SmartScreen reputation and user trust. The signing process occurs as a separate step after building:
Signing Configuration
master branch (signing-policy-slug: 'release-signing')signing-policy-slug: 'test-signing').exe filesoverwrite: trueSources: .github/workflows/ci.yml710-744
Build artifacts follow a consistent naming convention:
| Platform | Format | Example |
|---|---|---|
| Linux | DEB | fastfetch-linux-amd64.deb |
| Linux | RPM | fastfetch-linux-amd64.rpm |
| Linux (polyfilled) | DEB | fastfetch-linux-amd64-polyfilled.deb |
| macOS | DMG | fastfetch-macos-aarch64.dmg |
| Windows | ZIP | fastfetch-windows-amd64.zip |
| Windows | 7z | fastfetch-windows-amd64.7z |
| BSD | TGZ | fastfetch-freebsd-amd64.tar.gz |
The --target package flag to cmake --build invokes CPack to generate platform-appropriate packages. Polyfilled Linux builds append -polyfilled to the package name to indicate glibc compatibility patching.
Sources: .github/workflows/ci.yml113 .github/workflows/ci.yml147-151 .github/workflows/ci.yml733-737
Several build jobs enable embedded data to reduce runtime dependencies:
The PCI IDs database is generated from pci.ids via scripts/gen-pciids.py, which filters vendors relevant to GPU detection:
The script generates fastfetch_pciids.c.inc containing FFPciVendor and FFPciDevice structures for offline GPU name resolution.
Sources: .github/workflows/ci.yml110 scripts/gen-pciids.py1-96
Test executions include timing via the time command to track performance regressions:
The --stat false flag suppresses statistics display while still collecting them internally. This provides baseline timing data without visual overhead.
Sources: .github/workflows/ci.yml50 .github/workflows/ci.yml52 .github/workflows/ci.yml55
The CI preset exercises the entire module registry defined in src/common/modules.c. The registry organizes 70+ modules in alphabetical arrays (A[] through Z[]), indexed by module name's first letter.
Module Coverage in CI
The CI preset tests modules from all registry categories:
| Letter | Modules Tested |
|---|---|
| B | Battery, BIOS, Board, Bootmgr, Break, Brightness, Btrfs |
| C | Camera, Chassis, Colors, CPU, CPUCache, CPUUsage, Cursor |
| D | DateTime, DE, Display, Disk, DiskIO, DNS |
| E | Editor |
| F | Font |
| G | Gamepad, GPU |
| H | Host |
| I | Icons, InitSystem |
| K | Kernel, Keyboard |
| L | LM, Loadavg, Locale, LocalIP |
| M | Media, Memory, Monitor, Mouse |
| N | NetIO |
| O | OpenCL, OpenGL, OS |
| P | Packages, PhysicalDisk, PhysicalMemory, Player, PowerAdapter, Processes, PublicIP |
| S | Separator, Shell, Sound, Swap |
| T | Terminal, TerminalFont, TerminalSize, TerminalTheme, Theme, Title, TPM |
| U | Uptime, Users |
| V | Version, Vulkan |
| W | Wallpaper, Weather, WM, WMTheme, Wifi |
| Z | Zpool |
This comprehensive testing ensures all detection paths are validated on every platform build.
Sources: presets/ci.jsonc10-114 src/common/modules.c1-183
The workflow defines global environment variables for consistency:
This allows repository owners to override the default build type via GitHub Actions variables while defaulting to RelWithDebInfo (optimized with debug symbols) for release builds.
Sources: .github/workflows/ci.yml7-8
Refresh this wiki
This wiki was recently refreshed. Please wait 1 day to refresh again.