diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..3fb4652 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,113 @@ +pipeline { + agent { + kubernetes { + label 'ananke-quality' + defaultContainer 'go-tester' + yaml """ +apiVersion: v1 +kind: Pod +spec: + nodeSelector: + kubernetes.io/arch: arm64 + node-role.kubernetes.io/worker: "true" + containers: + - name: go-tester + image: golang:1.25-bookworm + command: ["cat"] + tty: true + volumeMounts: + - name: workspace-volume + mountPath: /home/jenkins/agent + - name: publisher + image: python:3.12-slim + command: ["cat"] + tty: true + volumeMounts: + - name: workspace-volume + mountPath: /home/jenkins/agent + volumes: + - name: workspace-volume + emptyDir: {} +""" + } + } + + environment { + SUITE_NAME = 'ananke' + PUSHGATEWAY_URL = 'http://platform-quality-gateway.monitoring.svc.cluster.local:9091' + } + + options { + disableConcurrentBuilds() + } + + triggers { + pollSCM('H/5 * * * *') + } + + stages { + stage('Checkout') { + steps { + checkout scm + } + } + + stage('Run quality gate') { + steps { + container('go-tester') { + sh ''' + set -eu + mkdir -p build + set +e + ANANKE_QUALITY_METRICS_ENABLED=0 \ + ANANKE_QUALITY_PUSHGATEWAY_ENABLED=0 \ + ANANKE_QUALITY_STATE_FILE="$PWD/build/quality-gate.state" \ + ./scripts/quality_gate.sh > build/quality-gate.out 2>&1 + gate_rc=$? + set -e + cat build/quality-gate.out + printf '%s\\n' "${gate_rc}" > build/quality-gate.rc + ''' + } + } + } + + stage('Publish test metrics') { + steps { + container('publisher') { + sh ''' + set -eu + ok_runs="$(awk -F= '$1=="ok"{print $2}' build/quality-gate.state 2>/dev/null | tail -n1)" + failed_runs="$(awk -F= '$1=="failed"{print $2}' build/quality-gate.state 2>/dev/null | tail -n1)" + [ -n "${ok_runs}" ] || ok_runs=0 + [ -n "${failed_runs}" ] || failed_runs=0 + python3 scripts/publish_quality_metrics.py \ + --pushgateway-url "${PUSHGATEWAY_URL}" \ + --job-name platform-quality-ci \ + --suite "${SUITE_NAME}" \ + --trigger jenkins \ + --local-ok "${ok_runs}" \ + --local-failed "${failed_runs}" + ''' + } + } + } + + stage('Enforce quality gate') { + steps { + container('publisher') { + sh ''' + set -eu + test "$(cat build/quality-gate.rc 2>/dev/null || echo 1)" -eq 0 + ''' + } + } + } + } + + post { + always { + archiveArtifacts artifacts: 'build/**', allowEmptyArchive: true, fingerprint: true + } + } +}