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:
parent
363adedd75
commit
3833e89545
@ -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("&", "&").replace("<", "<").replace(">", ">")
|
||||
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('&', '&').replace('<', '<').replace('>', '>')
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user