lesavka/Jenkinsfile

156 lines
3.6 KiB
Plaintext
Raw Normal View History

pipeline {
agent {
kubernetes {
label 'lesavka-tests'
defaultContainer 'rust-ci'
yaml """
apiVersion: v1
kind: Pod
spec:
nodeSelector:
kubernetes.io/arch: arm64
node-role.kubernetes.io/worker: "true"
containers:
- name: rust-ci
image: rust:1.87-bookworm
command: ["cat"]
tty: true
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
volumes:
- name: workspace-volume
emptyDir: {}
"""
}
}
options {
disableConcurrentBuilds()
disableResume()
}
parameters {
booleanParam(name: 'PUSH_IMAGES', defaultValue: false, description: 'Push images to registry (enable for release runs)')
string(name: 'QUALITY_GATE_PUSHGATEWAY_URL', defaultValue: 'http://platform-quality-gateway.monitoring.svc.cluster.local:9091', description: 'Pushgateway base URL for quality gate metrics')
string(name: 'REGISTRY_CREDENTIALS_ID', defaultValue: 'registry-bstein-dev', description: 'Jenkins credentials id for registry.bstein.dev')
}
environment {
REGISTRY = 'registry.bstein.dev'
IMAGE_PREFIX = "${REGISTRY}/lesavka"
CARGO_TERM_COLOR = 'always'
DOCKER_BUILDKIT = '1'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Bootstrap CI Toolchain') {
steps {
container('rust-ci') {
sh '''
set -eu
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
python3 \
curl \
clang \
llvm \
pkg-config \
libssl-dev \
ca-certificates
rm -rf /var/lib/apt/lists/*
rustup component add rustfmt llvm-tools-preview clippy
if ! cargo llvm-cov --version >/dev/null 2>&1; then
cargo install --locked cargo-llvm-cov
fi
'''
}
}
}
stage('Format') {
steps {
container('rust-ci') {
sh 'cargo fmt --all -- --check'
}
}
}
stage('Hygiene') {
steps {
container('rust-ci') {
sh 'scripts/ci/hygiene_gate.sh'
}
}
}
stage('Testing') {
steps {
container('rust-ci') {
sh 'cargo test -p lesavka_testing'
}
}
}
stage('Quality Gate') {
steps {
container('rust-ci') {
sh 'QUALITY_GATE_PUSHGATEWAY_URL="${QUALITY_GATE_PUSHGATEWAY_URL}" scripts/ci/quality_gate.sh'
}
}
}
stage('Build Dist') {
steps {
container('rust-ci') {
sh 'scripts/ci/build-dist.sh'
}
}
}
stage('Docker Login') {
when {
expression { return params.PUSH_IMAGES }
}
steps {
withCredentials([
usernamePassword(
credentialsId: params.REGISTRY_CREDENTIALS_ID,
usernameVariable: 'REGISTRY_USER',
passwordVariable: 'REGISTRY_PASS'
)
]) {
sh 'echo "$REGISTRY_PASS" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin'
}
}
}
stage('Build Images') {
when {
expression { return params.PUSH_IMAGES }
}
steps {
sh 'PUSH_IMAGES=${PUSH_IMAGES} scripts/ci/build-images.sh'
}
}
}
post {
always {
script {
try {
archiveArtifacts artifacts: 'dist/*.tar.gz', fingerprint: true, allowEmptyArchive: true
} catch (Throwable err) {
echo "archive step unavailable: ${err.class.simpleName}"
}
}
}
}
}