From cde8c0fb8168c39cbbe7fc71e6a0b5e05cb275f6 Mon Sep 17 00:00:00 2001 From: metif12 Date: Thu, 15 Oct 2026 11:10:24 +0330 Subject: [PATCH 1/2] ci: add timeouts and fail-fast guards to the workflows Every job gets a `timeout-minutes` so a hung step can no longer burn GitHub's 6 hour default, and every step after the first gets an `!cancelled() && steps..outcome == 'success'` guard so a failure skips the remaining work instead of running on. Jobs that run V tests also get VTEST_FAIL_FAST=1, which stops the test session after the first failing file (a red suite stays red). No step was added, removed, renamed or reordered, and no `run:` command was touched. Runner images and toolchains are unchanged. --- .github/workflows/ci.yml | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a68e6bf..bd32c909 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,162 +5,228 @@ on: [push, pull_request] jobs: ubuntu-gcc: runs-on: ubuntu-latest + timeout-minutes: 60 steps: - name: Checkout V + id: checkout_v uses: actions/checkout@v4 with: repository: vlang/v - name: Checkout gitly + id: checkout_gitly + if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install Dependencies + id: install_dependencies + if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: sudo apt install libsqlite3-dev - name: Build V + id: build_v + if: ${{ !cancelled() && steps.install_dependencies.outcome == 'success' }} run: | make sudo ./v symlink - name: Compile gitly + id: compile_gitly + if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -cc gcc . - name: Compile gitly with -autofree + id: compile_gitly_with_autofree + if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} run: | cd gitly v -cc gcc -autofree . - name: Compile gitly with -prod + id: compile_gitly_with_prod + if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v -cc gcc -prod . - name: Compile CSS from SCSS files + id: compile_css_from_scss_files + if: ${{ !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss destination: gitly/static/css/gitly.css - name: Run all tests + id: run_all_tests + if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -cc gcc -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v + id: run_tests_first_run_v + if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -cc gcc -g run tests/first_run.v macos-clang: runs-on: macos-latest + timeout-minutes: 60 steps: - name: Checkout V + id: checkout_v uses: actions/checkout@v4 with: repository: vlang/v - name: Checkout gitly + id: checkout_gitly + if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Build V + id: build_v + if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: | make ./v symlink - name: Compile gitly + id: compile_gitly + if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -cc clang . - name: Compile gitly with -autofree + id: compile_gitly_with_autofree + if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} run: | cd gitly v -cc clang -autofree . - name: Compile gitly with -prod + id: compile_gitly_with_prod + if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v -cc clang -prod . - name: Compile CSS from SCSS files + id: compile_css_from_scss_files + if: ${{ !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss destination: gitly/static/css/gitly.css - name: Run all tests + id: run_all_tests + if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -cc clang -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v + id: run_tests_first_run_v + if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -cc clang -g run tests/first_run.v windows-gcc: runs-on: windows-latest + timeout-minutes: 60 env: VFLAGS: -cc gcc steps: - name: Checkout V + id: checkout_v uses: actions/checkout@v4 with: repository: vlang/v - name: Checkout gitly + id: checkout_gitly + if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install SQLite + id: install_sqlite + if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: | .github\workflows\windows-install-sqlite.bat dir thirdparty\sqlite\ - name: Build V + id: build_v + if: ${{ !cancelled() && steps.install_sqlite.outcome == 'success' }} run: | ./make.bat -gcc - name: Compile gitly + id: compile_gitly + if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} run: | dir .\v.exe -cc gcc gitly ubuntu-tcc: runs-on: ubuntu-latest + timeout-minutes: 60 env: VFLAGS: -cc tcc -d no_backtrace -d no_segfault_handler steps: - name: Checkout V + id: checkout_v uses: actions/checkout@v4 with: repository: vlang/v - name: Checkout gitly + id: checkout_gitly + if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install Dependencies + id: install_dependencies + if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: sudo apt install libsqlite3-dev - name: Build V + id: build_v + if: ${{ !cancelled() && steps.install_dependencies.outcome == 'success' }} run: | echo $VFLAGS make sudo ./v symlink - name: Compile gitly with -autofree + id: compile_gitly_with_autofree + if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -autofree . - name: Compile gitly + id: compile_gitly + if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v . - name: Compile CSS from SCSS files + id: compile_css_from_scss_files + if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss destination: gitly/static/css/gitly.css - name: Run all tests + id: run_all_tests + if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v + id: run_tests_first_run_v + if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -g run tests/first_run.v From ecdb779470a5dfd6e0ad169d062d9c203cce831d Mon Sep 17 00:00:00 2001 From: metif12 Date: Thu, 15 Oct 2026 12:22:25 +0330 Subject: [PATCH 2/2] ci: fix guard shape, reusable timeouts, and chain completeness Address review findings on the fail-fast change: - Guards now read `success() && !cancelled() && steps..outcome == 'success'`. A bare `!cancelled()` suppresses GitHub's implicit `success()` check, so a failure in a step outside the immediate chain would not have stopped later steps. - A step that already carries a condition of our exact shape gets it replaced in place instead of gaining a second `if:` key, which is invalid workflow syntax. Steps whose condition is anything else (matrix picks, failure reporters such as `steps.x.outcome != 'success'`) keep it and stay out of the chain. - Jobs that call a reusable workflow no longer get `timeout-minutes:` (GitHub forbids it there); the timeouts live on the jobs inside the called workflows instead. --- .github/workflows/ci.yml | 58 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd32c909..ffb8c125 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,45 +14,45 @@ jobs: repository: vlang/v - name: Checkout gitly id: checkout_gitly - if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install Dependencies id: install_dependencies - if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: sudo apt install libsqlite3-dev - name: Build V id: build_v - if: ${{ !cancelled() && steps.install_dependencies.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.install_dependencies.outcome == 'success' }} run: | make sudo ./v symlink - name: Compile gitly id: compile_gitly - if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -cc gcc . - name: Compile gitly with -autofree id: compile_gitly_with_autofree - if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly.outcome == 'success' }} run: | cd gitly v -cc gcc -autofree . - name: Compile gitly with -prod id: compile_gitly_with_prod - if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v -cc gcc -prod . - name: Compile CSS from SCSS files id: compile_css_from_scss_files - if: ${{ !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss @@ -60,14 +60,14 @@ jobs: - name: Run all tests id: run_all_tests - if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -cc gcc -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v id: run_tests_first_run_v - if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -cc gcc -g run tests/first_run.v @@ -83,50 +83,50 @@ jobs: repository: vlang/v - name: Checkout gitly id: checkout_gitly - if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Build V id: build_v - if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: | make ./v symlink - name: Compile gitly id: compile_gitly - if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -cc clang . - name: Compile gitly with -autofree id: compile_gitly_with_autofree - if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly.outcome == 'success' }} run: | cd gitly v -cc clang -autofree . - name: Compile gitly with -prod id: compile_gitly_with_prod - if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v -cc clang -prod . - name: Compile CSS from SCSS files id: compile_css_from_scss_files - if: ${{ !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly_with_prod.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss destination: gitly/static/css/gitly.css - name: Run all tests id: run_all_tests - if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -cc clang -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v id: run_tests_first_run_v - if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -cc clang -g run tests/first_run.v @@ -144,24 +144,24 @@ jobs: repository: vlang/v - name: Checkout gitly id: checkout_gitly - if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install SQLite id: install_sqlite - if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: | .github\workflows\windows-install-sqlite.bat dir thirdparty\sqlite\ - name: Build V id: build_v - if: ${{ !cancelled() && steps.install_sqlite.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.install_sqlite.outcome == 'success' }} run: | ./make.bat -gcc - name: Compile gitly id: compile_gitly - if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.build_v.outcome == 'success' }} run: | dir .\v.exe -cc gcc gitly @@ -179,17 +179,17 @@ jobs: repository: vlang/v - name: Checkout gitly id: checkout_gitly - if: ${{ !cancelled() && steps.checkout_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_v.outcome == 'success' }} uses: actions/checkout@v4 with: path: gitly - name: Install Dependencies id: install_dependencies - if: ${{ !cancelled() && steps.checkout_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.checkout_gitly.outcome == 'success' }} run: sudo apt install libsqlite3-dev - name: Build V id: build_v - if: ${{ !cancelled() && steps.install_dependencies.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.install_dependencies.outcome == 'success' }} run: | echo $VFLAGS make @@ -197,21 +197,21 @@ jobs: - name: Compile gitly with -autofree id: compile_gitly_with_autofree - if: ${{ !cancelled() && steps.build_v.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.build_v.outcome == 'success' }} run: | cd gitly v -autofree . - name: Compile gitly id: compile_gitly - if: ${{ !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly_with_autofree.outcome == 'success' }} run: | cd gitly v . - name: Compile CSS from SCSS files id: compile_css_from_scss_files - if: ${{ !cancelled() && steps.compile_gitly.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_gitly.outcome == 'success' }} uses: gha-utilities/sass-build@v0.4.11 with: source: gitly/static/css/gitly.scss @@ -219,14 +219,14 @@ jobs: - name: Run all tests id: run_all_tests - if: ${{ !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.compile_css_from_scss_files.outcome == 'success' }} run: | cd gitly v -d sqlite -d use_openssl test $(git ls-files '*_test.v') - name: Run tests/first_run.v id: run_tests_first_run_v - if: ${{ !cancelled() && steps.run_all_tests.outcome == 'success' }} + if: ${{ success() && !cancelled() && steps.run_all_tests.outcome == 'success' }} run: | cd gitly v -g run tests/first_run.v