CI #5018
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: CI | |
| on: | |
| push: | |
| branches: ["primary", "release/**"] | |
| pull_request: | |
| branches: ["primary"] | |
| merge_group: | |
| branches: ["primary"] | |
| # CI on the "primary" branch opts out of concurrency grouping by using the run's | |
| # unique run_id. | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/primary' && github.run_id || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| run-lutecli-luau-tests: | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 20 | |
| strategy: | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| options: --c-compiler cl.exe --cxx-compiler cl.exe | |
| run-on-event: all | |
| - os: macos-latest | |
| options: --enable-sanitizers | |
| run-on-event: all | |
| - os: ubuntu-latest | |
| options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers | |
| run-on-event: pull_request | |
| - os: ubuntu-latest | |
| options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers | |
| run-on-event: pull_request | |
| - os: ubuntu-latest | |
| options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers | |
| use-bootstrap: true | |
| run-on-event: push | |
| - os: ubuntu-latest | |
| options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers | |
| use-bootstrap: true | |
| run-on-event: push | |
| - os: ubuntu-latest | |
| options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers | |
| use-bootstrap: true | |
| run-on-event: merge_group | |
| - os: ubuntu-latest | |
| options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers | |
| use-bootstrap: true | |
| run-on-event: merge_group | |
| fail-fast: false | |
| steps: | |
| - name: Determine if this matrix job should run | |
| id: should_run | |
| shell: bash | |
| run: | | |
| if [[ "${{ matrix.run-on-event }}" == "all" || "${{ matrix.run-on-event }}" == "${{ github.event_name }}" ]]; then | |
| echo "proceed=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "proceed=false" >> "$GITHUB_OUTPUT" | |
| fi | |
| - uses: actions/checkout@v6 | |
| - name: Setup and Build Lute | |
| id: build_lute | |
| if: ${{ steps.should_run.outputs.proceed == 'true' }} | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.CLI | |
| config: debug | |
| options: ${{ matrix.options }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| use-bootstrap: ${{ matrix.use-bootstrap || 'false' }} | |
| - name: Mount cross-device tmpfs for fs.move test | |
| if: ${{ steps.should_run.outputs.proceed == 'true' && runner.os == 'Linux' }} | |
| run: | | |
| sudo mkdir /mnt/lute-test-tmp | |
| sudo mount -t tmpfs tmpfs /mnt/lute-test-tmp | |
| sudo chmod 777 /mnt/lute-test-tmp | |
| echo "LUTE_CROSSDEV_TMPDIR=/mnt/lute-test-tmp" >> "$GITHUB_ENV" | |
| - name: Mount cross-device RAM disk for fs.move test | |
| if: ${{ steps.should_run.outputs.proceed == 'true' && runner.os == 'macOS' }} | |
| run: | | |
| DISK=$(hdiutil attach -nomount ram://131072 | xargs) | |
| diskutil erasevolume HFS+ 'LuteTestDisk' "$DISK" | |
| echo "LUTE_CROSSDEV_TMPDIR=/Volumes/LuteTestDisk" >> "$GITHUB_ENV" | |
| - name: Set up cross-device directory for fs.move test | |
| if: ${{ steps.should_run.outputs.proceed == 'true' && runner.os == 'Windows' }} | |
| shell: pwsh | |
| run: | | |
| New-Item -ItemType Directory -Force -Path "D:\lute-test-tmp" | |
| echo "LUTE_CROSSDEV_TMPDIR=D:\lute-test-tmp" >> $env:GITHUB_ENV | |
| - name: Run Luau Tests | |
| if: ${{ steps.should_run.outputs.proceed == 'true' }} | |
| run: ${{ steps.build_lute.outputs.exe_path }} test --verbose | |
| - name: Run Luau Snapshots | |
| if: ${{ steps.should_run.outputs.proceed == 'true' }} | |
| run: ${{ steps.build_lute.outputs.exe_path }} test snapshots | |
| run-lute-cxx-unittests: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| options: --c-compiler cl.exe --cxx-compiler cl.exe | |
| - os: ubuntu-latest | |
| options: --c-compiler gcc --cxx-compiler g++ --enable-sanitizers | |
| - os: ubuntu-latest | |
| options: --c-compiler clang --cxx-compiler clang++ --enable-sanitizers | |
| - os: macos-latest | |
| options: --enable-sanitizers | |
| fail-fast: false | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Setup and Build C++ Unit Tests | |
| id: build_tests | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.Test | |
| config: debug | |
| options: ${{ matrix.options }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Run C++ Tests | |
| run: ${{ steps.build_tests.outputs.exe_path }} | |
| check-format: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install tools | |
| uses: Roblox/setup-foreman@v3 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| allow-external-github-orgs: true | |
| - name: Run StyLua | |
| run: stylua --check . .lute | |
| build-docs-site: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Setup and Build Lute | |
| id: build_lute | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.CLI | |
| config: debug | |
| options: ${{ matrix.options }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v6 | |
| - name: Install dependencies | |
| run: npm install | |
| working-directory: docs | |
| - name: Build docs site | |
| run: | | |
| export PATH="$(dirname '${{ steps.build_lute.outputs.exe_path }}'):$PATH" | |
| npm run build | |
| working-directory: docs | |
| - name: Upload docs artifact | |
| id: deployment | |
| uses: actions/upload-pages-artifact@v5 | |
| with: | |
| path: docs/.vitepress/dist/ | |
| lute-lint: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Setup and Build Lute | |
| id: build_lute | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.CLI | |
| config: debug | |
| options: ${{ matrix.options }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Run Lute Lint | |
| run: ${{ steps.build_lute.outputs.exe_path }} lint -v . | |
| lute-check: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Setup and Build Lute | |
| id: build_lute | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.CLI | |
| config: debug | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Run Lute Check | |
| shell: bash | |
| run: | | |
| # @lute typechecks | |
| find definitions -name "*.luau" -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| # @std and @cli commands typechecks | |
| find lute -name "*.luau" -not -path '*/extern/*' -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| # @batteries typechecks | |
| find batteries -name "*.luau" -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| # All tests typecheck (special case for tests/src because they mess with config files) | |
| find tests -name "*.luau" -not -path "tests/src/*" -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| # All tools typecheck | |
| find tools -name "*.luau" -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| # All examples typecheck | |
| find examples -name "*.luau" -exec ${{ steps.build_lute.outputs.exe_path }} check {} + | |
| lute-format: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Setup and Build Lute | |
| id: build_lute | |
| uses: ./.github/actions/setup-and-build | |
| with: | |
| target: Lute.CLI | |
| config: debug | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Run Lute Format | |
| run: ${{ steps.build_lute.outputs.exe_path }} format -c -v . | |
| aggregator: | |
| name: Gated Commits | |
| runs-on: ubuntu-latest | |
| needs: | |
| [ | |
| run-lutecli-luau-tests, | |
| run-lute-cxx-unittests, | |
| check-format, | |
| build-docs-site, | |
| lute-lint, | |
| lute-check, | |
| lute-format, | |
| ] | |
| if: ${{ always() }} | |
| steps: | |
| - name: Aggregator | |
| id: aggregator | |
| run: | | |
| if [[ "${{ needs.run-lutecli-luau-tests.result }}" == "success" && | |
| "${{ needs.run-lute-cxx-unittests.result }}" == "success" && | |
| "${{ needs.check-format.result }}" == "success" && | |
| "${{ needs.build-docs-site.result }}" == "success" && | |
| "${{ needs.lute-lint.result }}" == "success" && | |
| "${{ needs.lute-check.result }}" == "success" && | |
| "${{ needs.lute-format.result }}" == "success" ]] | |
| then | |
| echo "All jobs succeeded" | |
| echo "result=success" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "One or more jobs failed" | |
| echo "result=failure" >> "$GITHUB_OUTPUT" | |
| exit 1 | |
| fi | |
| - name: Post-aggregation notification | |
| if: > | |
| always() && | |
| github.event_name == 'push' && | |
| github.ref == 'refs/heads/primary' | |
| env: | |
| SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} | |
| run: | | |
| LAST_STATUS=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| "https://api.github.com/repos/luau-lang/lute/actions/workflows/ci.yml/runs?branch=primary&status=completed&per_page=1" \ | |
| | jq -r '.workflow_runs[0].conclusion') | |
| if [[ "$LAST_STATUS" == "${{ steps.aggregator.outputs.result }}" ]]; then | |
| echo "No status change detected. Skipping notification." | |
| exit 0 | |
| elif [[ "$LAST_STATUS" == "failure" ]]; then | |
| TEXT=":white_check_mark: *Lute CI is passing again*" | |
| elif [[ "$LAST_STATUS" == "success" ]]; then | |
| TEXT=":rotating_light: *Lute CI has started failing*" | |
| fi | |
| echo Sending Slack notification: "$TEXT" | |
| CHANNEL_ID="${{ secrets.SLACK_CHANNEL_ID }}" | |
| RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" | |
| curl -sS -o /dev/null -X POST https://slack.com/api/chat.postMessage \ | |
| -H "Authorization: Bearer $SLACK_BOT_TOKEN" \ | |
| -H "Content-Type: application/json; charset=utf-8" \ | |
| --data "{ | |
| \"channel\": \"$CHANNEL_ID\", | |
| \"text\": \"$TEXT (<$RUN_URL|view workflow run>)\" | |
| }" |