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>
78 lines
2.5 KiB
Groovy
78 lines
2.5 KiB
Groovy
// Test gate for the Hermes code-repair demo.
|
|
//
|
|
// 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
|
|
kind: Pod
|
|
spec:
|
|
serviceAccountName: jenkins
|
|
securityContext:
|
|
runAsUser: 1000
|
|
runAsGroup: 1000
|
|
fsGroup: 1000
|
|
fsGroupChangePolicy: "OnRootMismatch"
|
|
nodeSelector:
|
|
kubernetes.io/arch: arm64
|
|
node-role.kubernetes.io/worker: "true"
|
|
containers:
|
|
- name: python
|
|
image: python:3.12-slim
|
|
command: ["sleep"]
|
|
args: ["3600"]
|
|
env:
|
|
- name: HOME
|
|
value: /home/jenkins/agent
|
|
- name: PIP_CACHE_DIR
|
|
value: /home/jenkins/agent/.pip-cache
|
|
resources:
|
|
requests:
|
|
cpu: 100m
|
|
memory: 128Mi
|
|
limits:
|
|
cpu: 1000m
|
|
memory: 512Mi
|
|
""") {
|
|
node('hermes-code-demo-agent') {
|
|
container('python') {
|
|
stage('Checkout') {
|
|
// 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') {
|
|
// 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'
|
|
}
|
|
}
|
|
}
|
|
}
|