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