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) {
|
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("&", "&").replace("<", "<").replace(">", ">")
|
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>"""
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user