[libc++] Switch over to the LLVM-wide premerge test runners. (#147794)

Update the premerge testing system to use the LLVM-wide premerge
infrastructure. Also remove libcxx-restart-preempted-jobs.yaml, as this
should no longer be needed.
This commit is contained in:
cmtice
2025-07-10 10:34:01 -07:00
committed by GitHub
parent ca888f085c
commit 582cfb142c
2 changed files with 8 additions and 169 deletions

View File

@@ -36,8 +36,7 @@ concurrency:
jobs:
stage1:
if: github.repository_owner == 'llvm'
runs-on: libcxx-self-hosted-linux
container: ghcr.io/llvm/libcxx-linux-builder:b060022103f551d8ca1dad84122ef73927c86512
runs-on: llvm-premerge-libcxx-runners
continue-on-error: false
strategy:
fail-fast: false
@@ -74,8 +73,7 @@ jobs:
**/crash_diagnostics/*
stage2:
if: github.repository_owner == 'llvm'
runs-on: libcxx-self-hosted-linux
container: ghcr.io/llvm/libcxx-linux-builder:2b57ebb50b6d418e70382e655feaa619b558e254
runs-on: llvm-premerge-libcxx-runners
needs: [ stage1 ]
continue-on-error: false
strategy:
@@ -149,21 +147,20 @@ jobs:
'generic-static',
'bootstrapping-build'
]
machine: [ 'libcxx-self-hosted-linux' ]
machine: [ 'llvm-premerge-libcxx-runners' ]
include:
- config: 'generic-cxx26'
machine: libcxx-self-hosted-linux
machine: llvm-premerge-libcxx-runners
- config: 'generic-asan'
machine: libcxx-self-hosted-linux
machine: llvm-premerge-libcxx-runners
- config: 'generic-tsan'
machine: libcxx-self-hosted-linux
machine: llvm-premerge-libcxx-runners
- config: 'generic-ubsan'
machine: libcxx-self-hosted-linux
machine: llvm-premerge-libcxx-runners
# Use a larger machine for MSAN to avoid timeout and memory allocation issues.
- config: 'generic-msan'
machine: libcxx-self-hosted-linux
machine: llvm-premerge-libcxx-runners
runs-on: ${{ matrix.machine }}
container: ghcr.io/llvm/libcxx-linux-builder:2b57ebb50b6d418e70382e655feaa619b558e254
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ${{ matrix.config }}

View File

@@ -1,158 +0,0 @@
name: Restart Preempted Libc++ Workflow
# The libc++ builders run on preemptable VMs, which can be shutdown at any time.
# This workflow identifies when a workflow run was canceled due to the VM being preempted,
# and restarts the workflow run.
# We identify a canceled workflow run by checking the annotations of the check runs in the check suite,
# which should contain the message "The runner has received a shutdown signal."
# Note: If a job is both preempted and also contains a non-preemption failure, we do not restart the workflow.
on:
workflow_run:
workflows: [Build and Test libc\+\+]
types:
- completed
permissions:
contents: read
jobs:
restart:
if: github.repository_owner == 'llvm' && (github.event.workflow_run.conclusion == 'failure')
name: "Restart Job"
permissions:
statuses: read
checks: write
actions: write
runs-on: ubuntu-24.04
steps:
- name: "Restart Job"
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea #v7.0.1
with:
script: |
// The "The run was canceled by" message comes from a user manually canceling a workflow
// the "higher priority" message comes from github canceling a workflow because the user updated the change.
// And the "exit code 1" message indicates a genuine failure.
const failure_regex = /(Process completed with exit code 1.)/
const preemption_regex = /(The runner has received a shutdown signal)|(The operation was canceled)/
const wf_run = context.payload.workflow_run
core.notice(`Running on "${wf_run.display_title}" by @${wf_run.actor.login} (event: ${wf_run.event})\nWorkflow run URL: ${wf_run.html_url}`)
async function create_check_run(conclusion, message) {
// Create a check run on the given workflow run to indicate if
// we are restarting the workflow or not.
if (conclusion != 'success' && conclusion != 'skipped' && conclusion != 'neutral') {
core.setFailed('Invalid conclusion: ' + conclusion)
}
await github.rest.checks.create({
owner: context.repo.owner,
repo: context.repo.repo,
name: 'Restart Preempted Job',
head_sha: wf_run.head_sha,
status: 'completed',
conclusion: conclusion,
output: {
title: 'Restarted Preempted Job',
summary: message
}
})
}
console.log('Listing check runs for suite')
const check_suites = await github.rest.checks.listForSuite({
owner: context.repo.owner,
repo: context.repo.repo,
check_suite_id: context.payload.workflow_run.check_suite_id,
per_page: 100 // FIXME: We don't have 100 check runs yet, but we should handle this better.
})
check_run_ids = [];
for (check_run of check_suites.data.check_runs) {
console.log('Checking check run: ' + check_run.id);
if (check_run.status != 'completed') {
console.log('Check run was not completed. Skipping.');
continue;
}
if (check_run.conclusion != 'failure') {
console.log('Check run had conclusion: ' + check_run.conclusion + '. Skipping.');
continue;
}
check_run_ids.push(check_run.id);
}
has_preempted_job = false;
for (check_run_id of check_run_ids) {
console.log('Listing annotations for check run: ' + check_run_id);
annotations = await github.rest.checks.listAnnotations({
owner: context.repo.owner,
repo: context.repo.repo,
check_run_id: check_run_id
})
// For temporary debugging purposes to see the structure of the annotations.
console.log(annotations);
has_failed_job = false;
saved_failure_message = null;
for (annotation of annotations.data) {
if (annotation.annotation_level != 'failure') {
continue;
}
const preemption_match = annotation.message.match(preemption_regex);
if (preemption_match != null) {
console.log('Found preemption message: ' + annotation.message);
has_preempted_job = true;
}
const failure_match = annotation.message.match(failure_regex);
if (failure_match != null) {
has_failed_job = true;
saved_failure_message = annotation.message;
}
}
if (has_failed_job && (! has_preempted_job)) {
// We only want to restart the workflow if all of the failures were due to preemption.
// We don't want to restart the workflow if there were other failures.
//
// However, libcxx runners running inside docker containers produce both a preemption message and failure message.
//
// The desired approach is to ignore failure messages which appear on the same job as a preemption message
// (An job is a single run with a specific configuration, ex generic-gcc, gcc-14).
//
// However, it's unclear that this code achieves the desired approach, and it may ignore all failures
// if a preemption message is found at all on any run.
//
// For now, it's more important to restart preempted workflows than to avoid restarting workflows with
// non-preemption failures.
//
// TODO Figure this out.
core.notice('Choosing not to rerun workflow because we found a non-preemption failure' +
'Failure message: "' + saved_failure_message + '"');
await create_check_run('skipped', 'Choosing not to rerun workflow because we found a non-preemption failure\n'
+ 'Failure message: ' + saved_failure_message)
return;
}
}
if (!has_preempted_job) {
core.notice('No preempted jobs found. Not restarting workflow.');
await create_check_run('neutral', 'No preempted jobs found. Not restarting workflow.')
return;
}
core.notice("Restarted workflow: " + context.payload.workflow_run.id);
await github.rest.actions.reRunWorkflowFailedJobs({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id
})
await create_check_run('success', 'Restarted workflow run due to preempted job')