149 lines
4.2 KiB
Groovy
149 lines
4.2 KiB
Groovy
def vaultConfig() {
|
|
return [
|
|
vaultUrl: '172.17.0.3:8200',
|
|
credentialsId: 'vault-approle',
|
|
engineVersion: 2
|
|
]
|
|
}
|
|
|
|
def vaultSecrets() {
|
|
return [[
|
|
path: 'secret/data/companyTransferMoneyService',
|
|
secretValues: [
|
|
[envVar: 'API_KEY', vaultKey: 'api_key'],
|
|
[envVar: 'SELENIUM_GRID', vaultKey: 'selenium_grid_url']
|
|
]
|
|
]]
|
|
}
|
|
|
|
|
|
pipeline {
|
|
agent {
|
|
docker {
|
|
image 'python:3.12-slim'
|
|
label 'python3.12'
|
|
args '-v /tmp:/tmp' // Optional: Mount /tmp for caching, etc.
|
|
}
|
|
}
|
|
|
|
environment {
|
|
PYTHON_VERSION = "3.12"
|
|
AWS_REGION = "eu-central-1"
|
|
S3_BUCKET = "Company-ci-executions"
|
|
SERVICE_NAME = "companyTransferMoneyService"
|
|
}
|
|
|
|
options {
|
|
timestamps()
|
|
buildDiscarder(logRotator(numToKeepStr: '20'))
|
|
}
|
|
|
|
stages {
|
|
|
|
stage('Checkout') {
|
|
agent { label 'ubuntu' }
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
|
|
stage('Setup Environment') {
|
|
steps {
|
|
sh '''
|
|
python3.12 -m venv venv
|
|
. venv/bin/activate
|
|
pip install --upgrade pip
|
|
pip install -r requirements.txt
|
|
mkdir -p reports
|
|
'''
|
|
}
|
|
}
|
|
|
|
stage('Unit Tests (Parallel)') {
|
|
parallel {
|
|
stage('Unit Batch 1') {
|
|
steps {
|
|
sh '''
|
|
. venv/bin/activate
|
|
pytest tests/unit -n auto \
|
|
--junitxml=reports/unit1.xml \
|
|
--cov=app --cov-report=xml:reports/coverage1.xml
|
|
'''
|
|
}
|
|
}
|
|
stage('Unit Batch 2') {
|
|
steps {
|
|
sh '''
|
|
. venv/bin/activate
|
|
pytest tests/unit -n auto \
|
|
--junitxml=reports/unit2.xml \
|
|
--cov=app --cov-report=xml:reports/coverage2.xml
|
|
'''
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
junit 'reports/unit*.xml'
|
|
publishCoverage adapters: [coberturaAdapter('reports/coverage*.xml')]
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Integration Tests') {
|
|
steps {
|
|
withVault(configuration: vaultConfig(), vaultSecrets: vaultSecrets()) {
|
|
sh '''
|
|
. venv/bin/activate
|
|
export API_KEY=$API_KEY
|
|
export ENV=staging
|
|
pytest tests/integration \
|
|
--junitxml=reports/integration.xml
|
|
'''
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
junit 'reports/integration.xml'
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('E2E Tests (Selenium Grid)') {
|
|
steps {
|
|
withVault(configuration: vaultConfig(), vaultSecrets: vaultSecrets()) {
|
|
sh '''
|
|
. venv/bin/activate
|
|
export API_KEY=$API_KEY
|
|
export SELENIUM_GRID_URL=$SELENIUM_GRID
|
|
# Start Flask app in background
|
|
nohup python app.py &
|
|
FLASK_PID=$!
|
|
# Give Flask a few seconds to start
|
|
sleep 5
|
|
pytest tests/e2e/test_selenium.py \
|
|
--junitxml=reports/e2e_selenium.xml
|
|
kill $FLASK_PID
|
|
'''
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
junit 'reports/e2e_selenium.xml'
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Upload Reports to S3') {
|
|
steps {
|
|
withAWS(region: "${AWS_REGION}", credentials: 'aws-jenkins-credentials') {
|
|
sh '''
|
|
aws s3 cp reports/ \
|
|
s3://${S3_BUCKET}/${SERVICE_NAME}/${BUILD_NUMBER}/ \
|
|
--recursive
|
|
'''
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |