fix(hermes-triage-demo): JCasC substitutes ${} at load; use concatenation-only pipeline

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jenkins 2026-08-05 16:56:06 -03:00
parent 363adedd75
commit 3833e89545

View File

@ -489,93 +489,94 @@ data:
node(POD_LABEL) {
container('kubectl') {
stage('Fixture check') {
def buildNum = env.BUILD_NUMBER
def incidentId = "hermes-triage-demo/${buildNum}"
def jobName = "hermes-demo-test-${buildNum}"
def seed = params.SEED_FAILURE ? "true" : "false"
writeFile file: 'test-runner-job.yaml', text: """
apiVersion: batch/v1
kind: Job
metadata:
name: ${jobName}
namespace: hermes-triage-demo
labels:
app.kubernetes.io/part-of: hermes-triage-demo
atlas.bstein.dev/role: demo-test-runner
spec:
backoffLimit: 0
ttlSecondsAfterFinished: 3600
template:
metadata:
labels:
app.kubernetes.io/part-of: hermes-triage-demo
atlas.bstein.dev/role: demo-test-runner
spec:
restartPolicy: Never
containers:
- name: test-runner
image: busybox:1.37
env:
- name: INCIDENT_ID
value: "${incidentId}"
- name: SEED_FAILURE
value: "${seed}"
command:
- sh
- -c
- |
STATE_FILE=/fixture/state
if [ "\\$SEED_FAILURE" = "true" ]; then
echo unhealthy > "\\$STATE_FILE"
fi
if [ ! -f "\\$STATE_FILE" ]; then
echo healthy > "\\$STATE_FILE"
fi
STATE=\\$(cat "\\$STATE_FILE")
if [ "\\$STATE" = "healthy" ]; then
echo "{\\\\"event\\\\":\\\\"hermes_demo_test_pass\\\\",\\\\"incident_id\\\\":\\\\"\\$INCIDENT_ID\\\\",\\\\"message\\\\":\\\\"fixture state healthy\\\\"}"
exit 0
fi
echo "{\\\\"event\\\\":\\\\"hermes_demo_test_failure\\\\",\\\\"incident_id\\\\":\\\\"\\$INCIDENT_ID\\\\",\\\\"classification_hint\\\\":\\\\"demo_fixture_unhealthy\\\\",\\\\"message\\\\":\\\\"expected fixture state healthy; found \\$STATE\\\\"}"
exit 1
volumeMounts:
- name: fixture
mountPath: /fixture
resources:
requests:
cpu: 25m
memory: 16Mi
limits:
cpu: 100m
memory: 32Mi
volumes:
- name: fixture
persistentVolumeClaim:
claimName: hermes-triage-demo-fixture
"""
sh "kubectl -n hermes-triage-demo create -f test-runner-job.yaml"
def verdict = "unknown"
def buildNum = '' + env.BUILD_NUMBER
def incidentId = 'hermes-triage-demo/' + buildNum
def jobName = 'hermes-demo-test-' + buildNum
def seed = params.SEED_FAILURE ? 'true' : 'false'
def manifest = [
'apiVersion: batch/v1',
'kind: Job',
'metadata:',
' name: ' + jobName,
' namespace: hermes-triage-demo',
' labels:',
' app.kubernetes.io/part-of: hermes-triage-demo',
' atlas.bstein.dev/role: demo-test-runner',
'spec:',
' backoffLimit: 0',
' ttlSecondsAfterFinished: 3600',
' template:',
' metadata:',
' labels:',
' app.kubernetes.io/part-of: hermes-triage-demo',
' atlas.bstein.dev/role: demo-test-runner',
' spec:',
' restartPolicy: Never',
' containers:',
' - name: test-runner',
' image: busybox:1.37',
' env:',
' - name: INCIDENT_ID',
' value: "' + incidentId + '"',
' - name: SEED_FAILURE',
' value: "' + seed + '"',
' command:',
' - sh',
' - -c',
' - |',
' STATE_FILE=/fixture/state',
' if [ "$SEED_FAILURE" = "true" ]; then',
' echo unhealthy > "$STATE_FILE"',
' fi',
' if [ ! -f "$STATE_FILE" ]; then',
' echo healthy > "$STATE_FILE"',
' fi',
' STATE=$(cat "$STATE_FILE")',
' if [ "$STATE" = "healthy" ]; then',
' echo "{\\"event\\":\\"hermes_demo_test_pass\\",\\"incident_id\\":\\"$INCIDENT_ID\\",\\"message\\":\\"fixture state healthy\\"}"',
' exit 0',
' fi',
' echo "{\\"event\\":\\"hermes_demo_test_failure\\",\\"incident_id\\":\\"$INCIDENT_ID\\",\\"classification_hint\\":\\"demo_fixture_unhealthy\\",\\"message\\":\\"expected fixture state healthy; found $STATE\\"}"',
' exit 1',
' volumeMounts:',
' - name: fixture',
' mountPath: /fixture',
' resources:',
' requests:',
' cpu: 25m',
' memory: 16Mi',
' limits:',
' cpu: 100m',
' memory: 32Mi',
' volumes:',
' - name: fixture',
' persistentVolumeClaim:',
' claimName: hermes-triage-demo-fixture'
]
writeFile file: 'test-runner-job.yaml', text: manifest.join('\n') + '\n'
sh 'kubectl -n hermes-triage-demo create -f test-runner-job.yaml'
def verdict = 'unknown'
timeout(time: 3, unit: 'MINUTES') {
waitUntil(initialRecurrencePeriod: 5000) {
def st = sh(script: "kubectl -n hermes-triage-demo get job ${jobName} -o jsonpath='{.status.succeeded}:{.status.failed}'", returnStdout: true).trim()
if (st.startsWith("1")) { verdict = "pass"; return true }
if (st.endsWith(":1")) { verdict = "fail"; return true }
waitUntil {
def st = sh(script: 'kubectl -n hermes-triage-demo get job ' + jobName + ' -o jsonpath={.status.succeeded}:{.status.failed}', returnStdout: true).trim()
if (st.startsWith('1')) { verdict = 'pass'; return true }
if (st.endsWith(':1')) { verdict = 'fail'; return true }
return false
}
}
def runnerLog = sh(script: "kubectl -n hermes-triage-demo logs job/${jobName} --tail=20 || true", returnStdout: true).trim()
echo "test-runner output:\\n${runnerLog}"
def runnerLog = sh(script: 'kubectl -n hermes-triage-demo logs job/' + jobName + ' --tail=20 || true', returnStdout: true).trim()
echo 'test-runner output: ' + runnerLog
def junitBody
if (verdict == "pass") {
junitBody = """<testsuite name="hermes-triage-demo" tests="1" failures="0"><testcase classname="hermes-triage-demo" name="fixture-state-check"/></testsuite>"""
if (verdict == 'pass') {
junitBody = '<testsuite name="hermes-triage-demo" tests="1" failures="0"><testcase classname="hermes-triage-demo" name="fixture-state-check"/></testsuite>'
} else {
def safeLog = runnerLog.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
junitBody = """<testsuite name="hermes-triage-demo" tests="1" failures="1"><testcase classname="hermes-triage-demo" name="fixture-state-check"><failure message="demo fixture unhealthy">${safeLog}</failure></testcase></testsuite>"""
def safeLog = runnerLog.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
junitBody = '<testsuite name="hermes-triage-demo" tests="1" failures="1"><testcase classname="hermes-triage-demo" name="fixture-state-check"><failure message="demo fixture unhealthy">' + safeLog + '</failure></testcase></testsuite>'
}
writeFile file: 'demo-junit.xml', text: junitBody
junit 'demo-junit.xml'
if (verdict != "pass") {
error("Demo fixture check failed for incident ${incidentId}")
if (verdict != 'pass') {
error('Demo fixture check failed for incident ' + incidentId)
}
}
}