Optimize CI workflows with dynamic matrix and cache cleanup #260
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SyntaxKit | |
| 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 | |
| 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.type == 'wasm' || matrix.type == 'wasm-embedded') && 'swift:6.3-noble' || matrix.swift.nightly && format('swiftlang/swift:nightly-{0}-{1}', matrix.swift.version, matrix.os) || format('swift:{0}-{1}', matrix.swift.version, matrix.os) }} | |
| strategy: | |
| matrix: | |
| 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@v6 | |
| - uses: brightdigit/swift-build@v1.5.2 | |
| with: | |
| type: ${{ matrix.type }} | |
| wasmtime-version: 41.0.3 | |
| - name: Install curl | |
| if: matrix.swift.version == '6.3' | |
| run: | | |
| apt-get update -q | |
| apt-get install -y curl | |
| - uses: sersoft-gmbh/swift-coverage-action@v5 | |
| id: coverage-files | |
| with: | |
| fail-on-empty-output: true | |
| - name: Upload coverage to Codecov | |
| 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), ',') }} | |
| 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.3-release | |
| swift-build: 6.3-RELEASE | |
| - swift-version: swift-6.2-release | |
| swift-build: 6.2-RELEASE | |
| - swift-version: swift-6.1-release | |
| swift-build: 6.1-RELEASE | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - uses: brightdigit/swift-build@v1.5.2 | |
| with: | |
| windows-swift-version: ${{ matrix.swift-version }} | |
| windows-swift-build: ${{ matrix.swift-build }} | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v6 | |
| with: | |
| fail_ci_if_error: true | |
| flags: swift-${{ matrix.swift-version }},windows | |
| verbose: true | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| os: windows | |
| swift_project: SyntaxKit | |
| build-macos: | |
| name: Build on macOS | |
| needs: [configure] | |
| env: | |
| PACKAGE_NAME: SyntaxKit | |
| runs-on: ${{ matrix.runs-on }} | |
| if: ${{ !cancelled() && needs.configure.result == 'success' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # SPM Build | |
| - runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Build and Test | |
| 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@v5 | |
| - name: Upload Coverage | |
| 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: 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 (older Xcode) | |
| - type: macos | |
| runs-on: macos-15 | |
| xcode: "/Applications/Xcode_16.4.app" | |
| # macOS Build | |
| - type: macos | |
| runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| # iOS Build Matrix | |
| - type: ios | |
| runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| deviceName: "iPhone 17 Pro" | |
| osVersion: "26.4" | |
| download-platform: true | |
| # watchOS Build Matrix | |
| - type: watchos | |
| runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| deviceName: "Apple Watch Ultra 3 (49mm)" | |
| osVersion: "26.4" | |
| download-platform: true | |
| # tvOS Build Matrix | |
| - type: tvos | |
| runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| deviceName: "Apple TV" | |
| osVersion: "26.4" | |
| download-platform: true | |
| # visionOS Build Matrix | |
| - type: visionos | |
| runs-on: macos-26 | |
| xcode: "/Applications/Xcode_26.4.app" | |
| deviceName: "Apple Vision Pro" | |
| osVersion: "26.4" | |
| download-platform: true | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Build and Test | |
| 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@v5 | |
| - name: Upload Coverage | |
| 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: ${{ !cancelled() && !failure() && !contains(github.event.head_commit.message, 'ci skip') }} | |
| runs-on: ubuntu-latest | |
| 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@v6 | |
| - name: Cache mint | |
| id: cache-mint | |
| uses: actions/cache@v5 | |
| env: | |
| cache-name: cache | |
| with: | |
| path: | | |
| .mint | |
| Mint | |
| key: ${{ runner.os }}-mint-${{ hashFiles('**/Mintfile') }} | |
| restore-keys: | | |
| ${{ runner.os }}-mint- | |
| - name: Install mint | |
| if: steps.cache-mint.outputs.cache-hit == '' | |
| run: | | |
| git clone https://github.com/yonaskolb/Mint.git | |
| cd Mint | |
| swift run mint install yonaskolb/mint | |
| - name: Lint | |
| run: ./Scripts/lint.sh | |
| docs: | |
| name: Documentation Validation | |
| if: ${{ !cancelled() && !failure() && !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@v6 | |
| - name: Validate Documentation | |
| run: ./Scripts/validate-docs.sh |