Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ba9a5c5
Optimize CI with dynamic matrix, concurrency groups, and cache cleanu…
leogdion Apr 2, 2026
a21698e
Address PR review comments: update CI matrix and CodeQL workflow
leogdion Apr 2, 2026
9efa950
Restructure ubuntu matrix to include WASM types; fix Android matrix
leogdion Apr 2, 2026
9f4f487
Fix full matrix not running on PRs
leogdion Apr 2, 2026
68455ac
Install curl in Swift 6.3 Ubuntu container before coverage upload
leogdion Apr 2, 2026
9ef6549
Fix PR trigger for version branches and prevent duplicate push/PR runs
leogdion Apr 2, 2026
c90daf8
Fix test file path resolution for WASM/Android/Linux CI
leogdion Apr 2, 2026
b1414b6
Limit doc test paths on WASM to tutorial files only
leogdion Apr 2, 2026
9c8c103
Fix Android/WASM doc path resolution and coverage conditions
leogdion Apr 2, 2026
426285a
Install curl only when code coverage is present on Ubuntu
leogdion Apr 2, 2026
a77fb0f
Update swift-docc-plugin to 1.4.6 to fix Windows CI
leogdion Apr 2, 2026
9f5276f
Fix Android doc test path resolution
leogdion Apr 2, 2026
51cf82b
Fix CI workflow issues from PR review
leogdion Apr 2, 2026
4ecbcde
Exclude wasm/wasm-embedded builds for Swift 6.1 and older on Ubuntu
leogdion Apr 2, 2026
b9aaf24
Drop Swift 6.1 from Windows and exclude wasm for Swift <=6.1 on Ubuntu
leogdion Apr 2, 2026
5db53e6
Enable git symlinks on Windows before swift-build runs
leogdion Apr 2, 2026
8f6ea6d
Exclude wasm/wasm-embedded builds for Swift 6.2 on Ubuntu
leogdion Apr 2, 2026
f442e81
Restore Swift 6.1 Windows, remove wasm excludes, disable fail-fast on…
leogdion Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
288 changes: 214 additions & 74 deletions .github/workflows/SyntaxKit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,174 +3,314 @@ on:
push:
branches-ignore:
- '*WIP'
paths-ignore:
- '**.md'
- 'Docs/**'
- 'LICENSE'
- '.github/ISSUE_TEMPLATE/**'
pull_request:
branches:
- main
- 'v[0-9]*.[0-9]*.[0-9]*'
paths-ignore:
- '**.md'
- 'Docs/**'
- 'LICENSE'

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true

env:
PACKAGE_NAME: SyntaxKit
PACKAGE_NAME: SyntaxKit
jobs:
configure:
name: Configure Build Matrix
runs-on: ubuntu-latest
if: ${{ github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip') }}
outputs:
full-matrix: ${{ steps.set-matrix.outputs.full-matrix }}
ubuntu-os: ${{ steps.set-matrix.outputs.ubuntu-os }}
ubuntu-swift: ${{ steps.set-matrix.outputs.ubuntu-swift }}
ubuntu-type: ${{ steps.set-matrix.outputs.ubuntu-type }}
steps:
- name: Determine build matrix
id: set-matrix
run: |
if [[ "${{ github.ref }}" == "refs/heads/main" || "${{ github.event_name }}" == "pull_request" ]]; then
echo "full-matrix=true" >> "$GITHUB_OUTPUT"
echo 'ubuntu-os=["noble","jammy"]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-swift=[{"version":"6.0"},{"version":"6.1"},{"version":"6.2"},{"version":"6.3"}]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-type=["","wasm","wasm-embedded"]' >> "$GITHUB_OUTPUT"
else
echo "full-matrix=false" >> "$GITHUB_OUTPUT"
echo 'ubuntu-os=["noble"]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-swift=[{"version":"6.3"}]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-type=[""]' >> "$GITHUB_OUTPUT"
fi

build-ubuntu:
name: Build on Ubuntu
needs: [configure]
runs-on: ubuntu-latest
container: ${{ matrix.swift.nightly && format('swiftlang/swift:nightly-{0}-{1}', matrix.swift.version, matrix.os) || format('swift:{0}-{1}', matrix.swift.version, matrix.os) }}
if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}
strategy:
fail-fast: false
matrix:
os: [noble, jammy]
swift:
- version: "6.0"
- version: "6.1"
- version: "6.1"
nightly: true
- version: "6.2"
nightly: true
os: ${{ fromJSON(needs.configure.outputs.ubuntu-os) }}
swift: ${{ fromJSON(needs.configure.outputs.ubuntu-swift) }}
type: ${{ fromJSON(needs.configure.outputs.ubuntu-type) }}
steps:
- uses: actions/checkout@v4
- uses: brightdigit/swift-build@v1.3.1
- uses: sersoft-gmbh/swift-coverage-action@v4
- uses: actions/checkout@v6
- uses: brightdigit/swift-build@v1.5.2
id: build
with:
type: ${{ matrix.type }}
wasmtime-version: 41.0.3
- name: Install curl
if: steps.build.outputs.contains-code-coverage == 'true'
run: |
apt-get update -q
apt-get install -y curl
- uses: sersoft-gmbh/swift-coverage-action@v5
id: coverage-files
with:
if: steps.build.outputs.contains-code-coverage == 'true'
with:
fail-on-empty-output: true
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
if: steps.build.outputs.contains-code-coverage == 'true'
uses: codecov/codecov-action@v6
with:
fail_ci_if_error: true
flags: swift-${{ matrix.swift-version }},ubuntu
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
files: ${{ join(fromJSON(steps.coverage-files.outputs.files), ',') }}
flags: swift-${{ matrix.swift.version }},ubuntu
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
files: ${{ join(fromJSON(steps.coverage-files.outputs.files), ',') }}

build-windows:
name: Build on Windows
needs: [configure]
if: needs.configure.outputs.full-matrix == 'true'
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
runs-on: [windows-2022, windows-2025]
include:
- swift-version: swift-6.2-branch
swift-build: 6.2-DEVELOPMENT-SNAPSHOT-2025-09-06-a
- swift-version: swift-6.1-release
swift-build: 6.1-RELEASE
swift:
- version: swift-6.3-release
build: 6.3-RELEASE
- version: swift-6.2-release
build: 6.2-RELEASE
- version: swift-6.1-release
build: 6.1-RELEASE
steps:
- uses: actions/checkout@v4
- uses: brightdigit/swift-build@v1.3.1
- uses: actions/checkout@v6
- name: Enable git symlinks
shell: pwsh
run: git config --global core.symlinks true
- uses: brightdigit/swift-build@v1.5.2
id: build
with:
windows-swift-version: ${{ matrix.swift-version }}
windows-swift-build: ${{ matrix.swift-build }}
windows-swift-version: ${{ matrix.swift.version }}
windows-swift-build: ${{ matrix.swift.build }}
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
if: steps.build.outputs.contains-code-coverage == 'true'
uses: codecov/codecov-action@v6
with:
fail_ci_if_error: true
flags: swift-${{ matrix.swift-version }},windows
verbose: true
flags: swift-${{ matrix.swift.version }},windows
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
os: windows
swift_project: SyntaxKit
# files: ${{ join(fromJSON(steps.coverage-files.outputs.files), ',') }}

build-macos:
name: Build on macOS
needs: [configure]
env:
PACKAGE_NAME: SyntaxKit
runs-on: ${{ matrix.runs-on }}
if: "!contains(github.event.head_commit.message, 'ci skip')"
if: ${{ !cancelled() && needs.configure.result == 'success' }}
strategy:
fail-fast: false
matrix:
include:
# SPM Build Matrix
- runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
# SPM Build
- runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"

steps:
- uses: actions/checkout@v6

- name: Build and Test
id: build
uses: brightdigit/swift-build@v1.5.2
with:
scheme: ${{ env.PACKAGE_NAME }}-Package
type: ${{ matrix.type }}
xcode: ${{ matrix.xcode }}
deviceName: ${{ matrix.deviceName }}
osVersion: ${{ matrix.osVersion }}
download-platform: ${{ matrix.download-platform }}

# Common Coverage Steps
- name: Process Coverage
if: steps.build.outputs.contains-code-coverage == 'true'
uses: sersoft-gmbh/swift-coverage-action@v5

- name: Upload Coverage
if: steps.build.outputs.contains-code-coverage == 'true'
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: ${{ matrix.type && format('{0}{1}', matrix.type, matrix.osVersion) || 'spm' }}

build-macos-full:
name: Build on macOS (Full)
needs: [configure]
if: ${{ !cancelled() && needs.configure.result == 'success' && needs.configure.outputs.full-matrix == 'true' }}
env:
PACKAGE_NAME: SyntaxKit
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
include:
# SPM Build (older Xcode)
- runs-on: macos-15
xcode: "/Applications/Xcode_16.4.app"

# macOS Build Matrix
- type: macos
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"

# macOS Build (older Xcode)
- type: macos
runs-on: macos-15
xcode: "/Applications/Xcode_16.4.app"

# macOS Build
- type: macos
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"

# iOS Build Matrix
- type: ios
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"
deviceName: "iPhone 17 Pro"
osVersion: "26.0"
osVersion: "26.4"
download-platform: true

# watchOS Build Matrix
- type: watchos
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"
deviceName: "Apple Watch Ultra 3 (49mm)"
osVersion: "26.0"
osVersion: "26.4"
download-platform: true

# tvOS Build Matrix
- type: tvos
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"
deviceName: "Apple TV"
osVersion: "26.0"
osVersion: "26.4"
download-platform: true

# visionOS Build Matrix
# visionOS Build Matrix
- type: visionos
runs-on: macos-15
xcode: "/Applications/Xcode_26.0.app"
runs-on: macos-26
xcode: "/Applications/Xcode_26.4.app"
deviceName: "Apple Vision Pro"
osVersion: "26.0"
osVersion: "26.4"
download-platform: true

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Build and Test
uses: brightdigit/swift-build@v1.3.1
id: build
uses: brightdigit/swift-build@v1.5.2
with:
scheme: ${{ env.PACKAGE_NAME }}-Package
type: ${{ matrix.type }}
xcode: ${{ matrix.xcode }}
deviceName: ${{ matrix.deviceName }}
osVersion: ${{ matrix.osVersion }}
download-platform: ${{ matrix.download-platform }}

# Common Coverage Steps
- name: Process Coverage
uses: sersoft-gmbh/swift-coverage-action@v4

if: steps.build.outputs.contains-code-coverage == 'true'
uses: sersoft-gmbh/swift-coverage-action@v5

- name: Upload Coverage
uses: codecov/codecov-action@v4
if: steps.build.outputs.contains-code-coverage == 'true'
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: ${{ matrix.type && format('{0}{1}', matrix.type, matrix.osVersion) || 'spm' }}

build-android:
name: Build for Android
needs: [configure]
if: needs.configure.outputs.full-matrix == 'true'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
swift:
- version: "6.2"
- version: "6.3"
android-api-level: [33, 34]
steps:
- uses: actions/checkout@v6
- name: Free disk space
uses: jlumbroso/free-disk-space@v1.3.1
with:
tool-cache: false
android: false
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: brightdigit/swift-build@v1.5.2
id: build
with:
type: android
android-swift-version: ${{ matrix.swift.version }}
android-api-level: ${{ matrix.android-api-level }}
android-run-tests: true
android-copy-files: Sources/SyntaxKit/Documentation.docc
- name: Upload coverage to Codecov
if: steps.build.outputs.contains-code-coverage == 'true'
uses: codecov/codecov-action@v6
with:
fail_ci_if_error: true
flags: android-api${{ matrix.android-api-level }}-swift${{ matrix.swift.version }}
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}

lint:
name: Linting
if: "!contains(github.event.head_commit.message, 'ci skip')"
if: ${{ !cancelled() && !failure() && (github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip')) }}
runs-on: ubuntu-latest
needs: [build-ubuntu, build-macos, build-windows]
needs: [build-ubuntu, build-macos, build-windows, build-macos-full, build-android]
env:
MINT_PATH: .mint/lib
MINT_LINK_PATH: .mint/bin
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Cache mint
id: cache-mint
uses: actions/cache@v4
uses: actions/cache@v5
env:
cache-name: cache
with:
path: |
.mint
Mint
Mint
key: ${{ runner.os }}-mint-${{ hashFiles('**/Mintfile') }}
restore-keys: |
${{ runner.os }}-mint-
${{ runner.os }}-mint-
- name: Install mint
if: steps.cache-mint.outputs.cache-hit == ''
run: |
Expand All @@ -182,10 +322,10 @@ jobs:

docs:
name: Documentation Validation
if: "!contains(github.event.head_commit.message, 'ci skip')"
needs: [build-ubuntu, build-macos, build-windows]
if: ${{ !cancelled() && !failure() && (github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip')) }}
needs: [build-ubuntu, build-macos, build-windows, build-macos-full, build-android]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Validate Documentation
run: ./Scripts/validate-docs.sh
Loading
Loading