hermes-code-demo/Jenkinsfile

84 lines
2.8 KiB
Plaintext
Raw Normal View History

// 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',
// Short, and capped at one. An earlier hour of idle time meant two warm
// agents sat holding slots in a pool of five, which starves real CI and
// would eventually starve this demo too. Fifteen minutes covers a demo
// session - warm-up run, then the real one - without parking capacity
// overnight for nobody.
idleMinutes: 15,
instanceCap: 1,
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'
}
}
}
}