ci: reuse the agent and shallow-clone so the gate is not all overhead
The tests run in 0.62 seconds; the build took 191. Agent scheduling and image pull were ~54s, a full clone of a five-commit repo ~25s, and pip install pytest ~55s. None of that is the thing being demonstrated. A fixed label plus idleMinutes keeps the pod alive between builds. The default inline template mints a random POD_LABEL per build, so a fresh pod was guaranteed every time and the pip cache in the workspace volume was always cold. With reuse, a second run skips scheduling, skips the image pull, and finds pytest already cached. The first run after an idle period still pays full price, so a throwaway run before a demo is worth doing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
6c4428c893
commit
92fae0a1c4
43
Jenkinsfile
vendored
43
Jenkinsfile
vendored
@ -1,5 +1,26 @@
|
|||||||
// Test gate for the Hermes code-repair demo.
|
// Test gate for the Hermes code-repair demo.
|
||||||
podTemplate(cloud: 'kubernetes', yaml: """
|
//
|
||||||
|
// Tuned for a demo, where the wait between pushing a defect and seeing the
|
||||||
|
// build go red is watched by people. The tests themselves run in under a
|
||||||
|
// second; everything else was overhead:
|
||||||
|
//
|
||||||
|
// agent pod scheduling + image pull ~54s
|
||||||
|
// full clone of a five-commit repo ~25s
|
||||||
|
// pip install pytest ~55s
|
||||||
|
// the actual tests ~0.6s
|
||||||
|
//
|
||||||
|
// A named template with idleMinutes keeps the pod alive between builds, so a
|
||||||
|
// second run reuses it: no scheduling, no image pull, and the pip cache in the
|
||||||
|
// workspace volume is already warm. The first run after an idle period still
|
||||||
|
// pays the full cost, which is why a throwaway run before a demo is worth it.
|
||||||
|
podTemplate(
|
||||||
|
cloud: 'kubernetes',
|
||||||
|
// A fixed label is what makes reuse possible at all. The default inline
|
||||||
|
// template mints a random POD_LABEL per build, so every build necessarily
|
||||||
|
// got a fresh pod.
|
||||||
|
label: 'hermes-code-demo-agent',
|
||||||
|
idleMinutes: 60,
|
||||||
|
yaml: """
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
spec:
|
spec:
|
||||||
@ -27,16 +48,28 @@ spec:
|
|||||||
cpu: 100m
|
cpu: 100m
|
||||||
memory: 128Mi
|
memory: 128Mi
|
||||||
limits:
|
limits:
|
||||||
cpu: 500m
|
cpu: 1000m
|
||||||
memory: 512Mi
|
memory: 512Mi
|
||||||
""") {
|
""") {
|
||||||
node(POD_LABEL) {
|
node('hermes-code-demo-agent') {
|
||||||
container('python') {
|
container('python') {
|
||||||
stage('Checkout') {
|
stage('Checkout') {
|
||||||
checkout scm
|
// Depth 1 and no tags: the build only ever needs the commit under
|
||||||
|
// test, and fetching five commits of history to run one test file is
|
||||||
|
// time spent on nothing anyone will look at.
|
||||||
|
checkout([
|
||||||
|
$class: 'GitSCM',
|
||||||
|
branches: scm.branches,
|
||||||
|
userRemoteConfigs: scm.userRemoteConfigs,
|
||||||
|
extensions: [
|
||||||
|
[$class: 'CloneOption', shallow: true, depth: 1, noTags: true, timeout: 5],
|
||||||
|
],
|
||||||
|
])
|
||||||
}
|
}
|
||||||
stage('tests') {
|
stage('tests') {
|
||||||
sh 'pip install --quiet pytest'
|
// Idempotent and near-instant once the pod's pip cache is warm; the
|
||||||
|
// cost is only paid on a cold agent.
|
||||||
|
sh 'pip install --quiet --disable-pip-version-check pytest'
|
||||||
sh 'python -m pytest -v --junitxml=build/junit.xml'
|
sh 'python -m pytest -v --junitxml=build/junit.xml'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user