mirror of
https://github.com/leanprover/lean4.git
synced 2026-03-17 10:24:07 +00:00
feat: add lake-ci label to enable full Lake test suite (#12836)
This PR adds a `lake-ci` label that enables the full Lake test suite in CI, avoiding the need to temporarily commit and revert changes to `tests/CMakeLists.txt`. The `lake-ci` label implies `release-ci` (check level 3), so all release platforms are also tested. Motivated by https://github.com/leanprover/lean4/pull/12540#issuecomment-4000081071 where @tydeu requested running `release-ci` with Lake tests enabled, which previously required temporarily uncommenting a line in `tests/CMakeLists.txt`. Users can add it via a PR comment containing `lake-ci` on its own line, or by adding the label manually. CI automatically restarts when the label is added. Implementation: - `ci.yml`: detect `lake-ci` label, set check level 3, pass `-DLAKE_CI=ON` to cmake - `tests/CMakeLists.txt`: `option(LAKE_CI ...)` conditionally enables full `tests/lake/tests/` glob - `restart-on-label.yml`: restart CI on `lake-ci` label - `labels-from-comments.yml`: support `lake-ci` comment 🤖 Prepared with Claude Code --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
19
.github/workflows/ci.yml
vendored
19
.github/workflows/ci.yml
vendored
@@ -166,7 +166,7 @@ jobs:
|
|||||||
# 0: PRs without special label
|
# 0: PRs without special label
|
||||||
# 1: PRs with `merge-ci` label, merge queue checks, master commits
|
# 1: PRs with `merge-ci` label, merge queue checks, master commits
|
||||||
# 2: nightlies
|
# 2: nightlies
|
||||||
# 3: PRs with `release-ci` label, full releases
|
# 3: PRs with `release-ci` or `lake-ci` label, full releases
|
||||||
- name: Set check level
|
- name: Set check level
|
||||||
id: set-level
|
id: set-level
|
||||||
# We do not use github.event.pull_request.labels.*.name here because
|
# We do not use github.event.pull_request.labels.*.name here because
|
||||||
@@ -175,6 +175,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
check_level=0
|
check_level=0
|
||||||
fast=false
|
fast=false
|
||||||
|
lake_ci=false
|
||||||
|
|
||||||
if [[ -n "${{ steps.set-release.outputs.RELEASE_TAG }}" || -n "${{ steps.set-release-custom.outputs.RELEASE_TAG }}" ]]; then
|
if [[ -n "${{ steps.set-release.outputs.RELEASE_TAG }}" || -n "${{ steps.set-release-custom.outputs.RELEASE_TAG }}" ]]; then
|
||||||
check_level=3
|
check_level=3
|
||||||
@@ -189,13 +190,19 @@ jobs:
|
|||||||
elif echo "$labels" | grep -q "merge-ci"; then
|
elif echo "$labels" | grep -q "merge-ci"; then
|
||||||
check_level=1
|
check_level=1
|
||||||
fi
|
fi
|
||||||
|
if echo "$labels" | grep -q "lake-ci"; then
|
||||||
|
lake_ci=true
|
||||||
|
fi
|
||||||
if echo "$labels" | grep -q "fast-ci"; then
|
if echo "$labels" | grep -q "fast-ci"; then
|
||||||
fast=true
|
fast=true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "check-level=$check_level" >> "$GITHUB_OUTPUT"
|
{
|
||||||
echo "fast=$fast" >> "$GITHUB_OUTPUT"
|
echo "check-level=$check_level"
|
||||||
|
echo "fast=$fast"
|
||||||
|
echo "lake-ci=$lake_ci"
|
||||||
|
} >> "$GITHUB_OUTPUT"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ github.token }}
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
|
||||||
@@ -206,6 +213,7 @@ jobs:
|
|||||||
script: |
|
script: |
|
||||||
const level = ${{ steps.set-level.outputs.check-level }};
|
const level = ${{ steps.set-level.outputs.check-level }};
|
||||||
const fast = ${{ steps.set-level.outputs.fast }};
|
const fast = ${{ steps.set-level.outputs.fast }};
|
||||||
|
const lakeCi = "${{ steps.set-level.outputs.lake-ci }}" == "true";
|
||||||
console.log(`level: ${level}, fast: ${fast}`);
|
console.log(`level: ${level}, fast: ${fast}`);
|
||||||
// use large runners where available (original repo)
|
// use large runners where available (original repo)
|
||||||
let large = ${{ github.repository == 'leanprover/lean4' }};
|
let large = ${{ github.repository == 'leanprover/lean4' }};
|
||||||
@@ -379,6 +387,11 @@ jobs:
|
|||||||
job["CMAKE_OPTIONS"] = (job["CMAKE_OPTIONS"] ? job["CMAKE_OPTIONS"] + " " : "") + "-DUSE_LAKE=OFF";
|
job["CMAKE_OPTIONS"] = (job["CMAKE_OPTIONS"] ? job["CMAKE_OPTIONS"] + " " : "") + "-DUSE_LAKE=OFF";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lakeCi) {
|
||||||
|
for (const job of matrix) {
|
||||||
|
job["CMAKE_OPTIONS"] = (job["CMAKE_OPTIONS"] ? job["CMAKE_OPTIONS"] + " " : "") + "-DLAKE_CI=ON";
|
||||||
|
}
|
||||||
|
}
|
||||||
console.log(`matrix:\n${JSON.stringify(matrix, null, 2)}`);
|
console.log(`matrix:\n${JSON.stringify(matrix, null, 2)}`);
|
||||||
matrix = matrix.filter((job) => job["enabled"]);
|
matrix = matrix.filter((job) => job["enabled"]);
|
||||||
core.setOutput('matrix', matrix.filter((job) => !job["secondary"]));
|
core.setOutput('matrix', matrix.filter((job) => !job["secondary"]));
|
||||||
|
|||||||
8
.github/workflows/labels-from-comments.yml
vendored
8
.github/workflows/labels-from-comments.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# This workflow allows any user to add one of the `awaiting-review`, `awaiting-author`, `WIP`,
|
# This workflow allows any user to add one of the `awaiting-review`, `awaiting-author`, `WIP`,
|
||||||
# `release-ci`, or a `changelog-XXX` label by commenting on the PR or issue.
|
# `release-ci`, `lake-ci`, or a `changelog-XXX` label by commenting on the PR or issue.
|
||||||
# If any labels from the set {`awaiting-review`, `awaiting-author`, `WIP`} are added, other labels
|
# If any labels from the set {`awaiting-review`, `awaiting-author`, `WIP`} are added, other labels
|
||||||
# from that set are removed automatically at the same time.
|
# from that set are removed automatically at the same time.
|
||||||
# Similarly, if any `changelog-XXX` label is added, other `changelog-YYY` labels are removed.
|
# Similarly, if any `changelog-XXX` label is added, other `changelog-YYY` labels are removed.
|
||||||
@@ -12,7 +12,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-label:
|
update-label:
|
||||||
if: github.event.issue.pull_request != null && (contains(github.event.comment.body, 'awaiting-review') || contains(github.event.comment.body, 'awaiting-author') || contains(github.event.comment.body, 'WIP') || contains(github.event.comment.body, 'release-ci') || contains(github.event.comment.body, 'changelog-'))
|
if: github.event.issue.pull_request != null && (contains(github.event.comment.body, 'awaiting-review') || contains(github.event.comment.body, 'awaiting-author') || contains(github.event.comment.body, 'WIP') || contains(github.event.comment.body, 'release-ci') || contains(github.event.comment.body, 'lake-ci') || contains(github.event.comment.body, 'changelog-'))
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -28,6 +28,7 @@ jobs:
|
|||||||
const awaitingAuthor = commentLines.includes('awaiting-author');
|
const awaitingAuthor = commentLines.includes('awaiting-author');
|
||||||
const wip = commentLines.includes('WIP');
|
const wip = commentLines.includes('WIP');
|
||||||
const releaseCI = commentLines.includes('release-ci');
|
const releaseCI = commentLines.includes('release-ci');
|
||||||
|
const lakeCI = commentLines.includes('lake-ci');
|
||||||
const changelogMatch = commentLines.find(line => line.startsWith('changelog-'));
|
const changelogMatch = commentLines.find(line => line.startsWith('changelog-'));
|
||||||
|
|
||||||
if (awaitingReview || awaitingAuthor || wip) {
|
if (awaitingReview || awaitingAuthor || wip) {
|
||||||
@@ -49,6 +50,9 @@ jobs:
|
|||||||
if (releaseCI) {
|
if (releaseCI) {
|
||||||
await github.rest.issues.addLabels({ owner, repo, issue_number, labels: ['release-ci'] });
|
await github.rest.issues.addLabels({ owner, repo, issue_number, labels: ['release-ci'] });
|
||||||
}
|
}
|
||||||
|
if (lakeCI) {
|
||||||
|
await github.rest.issues.addLabels({ owner, repo, issue_number, labels: ['lake-ci'] });
|
||||||
|
}
|
||||||
|
|
||||||
if (changelogMatch) {
|
if (changelogMatch) {
|
||||||
const changelogLabel = changelogMatch.trim();
|
const changelogLabel = changelogMatch.trim();
|
||||||
|
|||||||
2
.github/workflows/restart-on-label.yml
vendored
2
.github/workflows/restart-on-label.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
restart-on-label:
|
restart-on-label:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: contains(github.event.label.name, 'merge-ci') || contains(github.event.label.name, 'release-ci')
|
if: contains(github.event.label.name, 'merge-ci') || contains(github.event.label.name, 'release-ci') || contains(github.event.label.name, 'lake-ci')
|
||||||
steps:
|
steps:
|
||||||
- run: |
|
- run: |
|
||||||
# Finding latest CI workflow run on current pull request
|
# Finding latest CI workflow run on current pull request
|
||||||
|
|||||||
@@ -237,12 +237,19 @@ endforeach(T)
|
|||||||
# bootstrap: too slow
|
# bootstrap: too slow
|
||||||
# toolchain: requires elan to download toolchain
|
# toolchain: requires elan to download toolchain
|
||||||
# online: downloads remote repositories
|
# online: downloads remote repositories
|
||||||
|
option(LAKE_CI "Enable full Lake test suite (use `lake-ci` label on PRs)" OFF)
|
||||||
file(
|
file(
|
||||||
GLOB_RECURSE LEANLAKETESTS
|
GLOB_RECURSE LEANLAKETESTS
|
||||||
#"${LEAN_SOURCE_DIR}/../tests/lake/tests/test.sh"
|
|
||||||
"${LEAN_SOURCE_DIR}/../tests/lake/examples/test.sh"
|
"${LEAN_SOURCE_DIR}/../tests/lake/examples/test.sh"
|
||||||
"${LEAN_SOURCE_DIR}/../tests/lake/tests/shake/test.sh"
|
"${LEAN_SOURCE_DIR}/../tests/lake/tests/shake/test.sh"
|
||||||
)
|
)
|
||||||
|
if(LAKE_CI)
|
||||||
|
file(
|
||||||
|
GLOB_RECURSE LEANLAKETESTS_FULL
|
||||||
|
"${LEAN_SOURCE_DIR}/../tests/lake/tests/test.sh"
|
||||||
|
)
|
||||||
|
list(APPEND LEANLAKETESTS ${LEANLAKETESTS_FULL})
|
||||||
|
endif()
|
||||||
foreach(T ${LEANLAKETESTS})
|
foreach(T ${LEANLAKETESTS})
|
||||||
if(NOT T MATCHES ".*(lake-packages|bootstrap|toolchain|online).*")
|
if(NOT T MATCHES ".*(lake-packages|bootstrap|toolchain|online).*")
|
||||||
get_filename_component(T_DIR ${T} DIRECTORY)
|
get_filename_component(T_DIR ${T} DIRECTORY)
|
||||||
|
|||||||
Reference in New Issue
Block a user