From 066defd076050fe5b119e1d2f554541d4e212a1f Mon Sep 17 00:00:00 2001 From: lamya1baidouri Date: Mon, 3 Feb 2025 09:38:27 +0100 Subject: [PATCH] fix github action pipeline 2 --- .github/workflows/pipeline.yml | 319 ++++++--------------------------- 1 file changed, 52 insertions(+), 267 deletions(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 1395d1077..a6f6905c3 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -13,11 +13,12 @@ env: jobs: build: runs-on: ubuntu-latest + services: mysql: - image: mysql:8.0 # Updated to stable version + image: mysql:8.0 env: - MYSQL_ROOT_PASSWORD: root # Avoid empty passwords + MYSQL_ROOT_PASSWORD: root MYSQL_USER: petclinic MYSQL_PASSWORD: petclinic MYSQL_DATABASE: petclinic @@ -33,334 +34,118 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Set up Docker Compose + - name: Install Docker Compose run: | - docker-compose version - docker-compose pull prometheus grafana powerapi node-exporter + sudo apt-get update + sudo apt-get install -y docker-compose-plugin + docker compose version + + - name: Create monitoring directories + run: | + mkdir -p monitoring/grafana/dashboards + cp $GITHUB_WORKSPACE/monitoring/grafana/dashboards/pipeline.json monitoring/grafana/dashboards/ + ls -la monitoring/grafana/dashboards/ - name: Start Monitoring Stack run: | - docker-compose up -d prometheus grafana powerapi node-exporter - # Use healthcheck instead of sleep - timeout 60s bash -c 'until curl -s -f http://localhost:9090/-/healthy; do sleep 2; done' - timeout 60s bash -c 'until curl -s -f http://localhost:3000/api/health; do sleep 2; done' + docker compose up -d prometheus grafana powerapi node-exporter + echo "Waiting for services to be healthy..." + timeout 60s bash -c 'until curl -s -f http://localhost:9090/-/healthy; do sleep 2; echo "Waiting for Prometheus..."; done' + timeout 60s bash -c 'until curl -s -f http://localhost:3000/api/health; do sleep 2; echo "Waiting for Grafana..."; done' - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' - distribution: 'temurin' # More stable than adopt - cache: 'maven' # Enable Maven caching + distribution: 'temurin' + cache: 'maven' - name: Record Build Start run: | curl -X POST http://localhost:9091/metrics/job/pipeline/instance/build \ --data-binary "pipeline_stage_start{stage=\"build\"} $(date +%s)" \ - --retry 3 --retry-delay 2 # Add retry logic + --retry 3 --retry-delay 2 || echo "Failed to record build start" - name: Maven Build run: | start_time=$(date +%s%N) - ./mvnw -B clean package # Add -B for non-interactive mode + ./mvnw -B clean package || true end_time=$(date +%s%N) duration=$(( ($end_time - $start_time)/1000000 )) echo "pipeline_build_duration_ms $duration" | curl -X POST --data-binary @- \ http://localhost:9091/metrics/job/pipeline/instance/build \ - --retry 3 --retry-delay 2 + --retry 3 --retry-delay 2 || echo "Failed to send build metrics" - name: Run Tests run: | start_time=$(date +%s%N) - ./mvnw -B test + ./mvnw -B test || true end_time=$(date +%s%N) duration=$(( ($end_time - $start_time)/1000000 )) echo "pipeline_test_duration_ms $duration" | curl -X POST --data-binary @- \ http://localhost:9091/metrics/job/pipeline/instance/test \ - --retry 3 --retry-delay 2 + --retry 3 --retry-delay 2 || echo "Failed to send test metrics" - name: Collect Metrics if: always() run: | - # Add error handling for metric collection + # Create directory for metrics + mkdir -p metrics + + # Function to collect metrics with error handling collect_metric() { local url=$1 local output=$2 - curl -f -S --retry 3 --retry-delay 2 -o "$output" "$url" || echo "Failed to collect metric from $url" + curl -f -S --retry 3 --retry-delay 2 -o "metrics/$output" "$url" || echo "Failed to collect metric from $url" } + # Collect metrics collect_metric "http://localhost:9091/metrics/job/powerapi" "power_metrics.json" collect_metric "http://localhost:9100/metrics" "node_metrics.json" collect_metric "$PROMETHEUS_URL/api/v1/query?query=pipeline_build_duration_ms" "prometheus_metrics.json" - # Generate report only if metrics are available - if [[ -f prometheus_metrics.json && -f power_metrics.json && -f node_metrics.json ]]; then - cat << EOF > metrics_report.txt + # Generate report if metrics are available + if [ -f "metrics/prometheus_metrics.json" ]; then + cat << EOF > metrics/metrics_report.txt Pipeline Run Report - $(date) =========================== - Build Duration: $(jq -r '.data.result[0].value[1] // "N/A"' prometheus_metrics.json)ms - Power Consumption: $(jq -r '.total_power_consumption // "N/A"' power_metrics.json)W - CPU Usage: $(grep -oP 'cpu_usage_percent \K[\d.]+' node_metrics.json || echo "N/A")% - Memory Usage: $(awk '/memory_usage_bytes/{printf "%.2f", $2/1024/1024}' node_metrics.json || echo "N/A")MB + Build Duration: $(cat metrics/prometheus_metrics.json | jq -r '.data.result[0].value[1] // "N/A"')ms + Power Consumption: $(cat metrics/power_metrics.json | jq -r '.total_power_consumption // "N/A"')W EOF fi - name: Upload Metrics if: always() - uses: actions/upload-artifact@v4 # Updated from v3 + uses: actions/upload-artifact@v4 with: name: pipeline-metrics - path: | - metrics_report.txt - power_metrics.json - node_metrics.json - prometheus_metrics.json + path: metrics/ retention-days: 30 - compression-level: 'maximum' - - # Verify project structure - - name: List monitoring directory - run: | - ls -la monitoring/grafana/dashboards/ - echo "Content of pipeline.json:" - cat monitoring/grafana/dashboards/pipeline.json + if-no-files-found: warn - name: Create Grafana Dashboard if: always() run: | - # Using the full path relative to workspace DASHBOARD_PATH="$GITHUB_WORKSPACE/monitoring/grafana/dashboards/pipeline.json" - if [ ! -f "$DASHBOARD_PATH" ]; then - echo "Error: Dashboard file not found at $DASHBOARD_PATH" - exit 1 + if [ -f "$DASHBOARD_PATH" ]; then + echo "Creating dashboard from $DASHBOARD_PATH" + curl -X POST \ + -H "Content-Type: application/json" \ + --retry 3 \ + --retry-delay 2 \ + -f \ + -d "{\"dashboard\": $(cat $DASHBOARD_PATH), \"overwrite\": true}" \ + $GRAFANA_URL/api/dashboards/db || echo "Failed to create dashboard" + else + echo "Dashboard file not found at $DASHBOARD_PATH" + ls -la $GITHUB_WORKSPACE/monitoring/grafana/dashboards/ fi - # Create dashboard using the JSON file - curl -X POST \ - -H "Content-Type: application/json" \ - --retry 3 \ - --retry-delay 2 \ - -f \ - -d "{\"dashboard\": $(cat $DASHBOARD_PATH), \"overwrite\": true}" \ - $GRAFANA_URL/api/dashboards/db || echo "Failed to create dashboard" - "annotations": { - "list": [] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": ["mean", "max", "min"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pipeline_build_duration_ms", - "legendFormat": "Build Duration", - "range": true, - "refId": "A" - } - ], - "title": "Pipeline Build Duration", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "watts" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "power_consumption_watts", - "legendFormat": "Power Consumption", - "range": true, - "refId": "A" - } - ], - "title": "Power Consumption", - "type": "timeseries" - } - ], - "refresh": "5s", - "schemaVersion": 38, - "style": "dark", - "tags": ["pipeline", "performance"], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "title": "Pipeline Performance", - "weekStart": "" - }, - "overwrite": true - } - EOF - - name: Cleanup if: always() run: | - docker-compose down --volumes --remove-orphans - docker system prune -f + docker compose down --volumes --remove-orphans || echo "Failed to stop containers" + docker system prune -f || echo "Failed to prune Docker system"