From 834e67f1b5788379127ea599ff2869b83122b647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulises=20Gasc=C3=B3n?= Date: Wed, 17 Jul 2024 22:35:37 +0200 Subject: [PATCH] ci: add benchmarks pipeline --- .github/workflows/benchmarks.yml | 143 +++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 .github/workflows/benchmarks.yml diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 0000000000..7e970352d5 --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,143 @@ +name: Benchmark + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + +permissions: + contents: read + pull-requests: write + +jobs: + benchmarks: + if: contains(github.event.pull_request.labels.*.name, 'request-benchmarks') + runs-on: ubuntu-latest + + steps: + - name: Install wrk + run: | + sudo apt-get update + sudo apt-get install -y wrk + + - name: Checkout Source Branch + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + path: source + + - name: Setup Node.js for Source Branch + uses: actions/setup-node@v3 + with: + node-version: '22.x' + + - name: Install Dependencies for Source Branch + run: | + cd source + npm install + + - name: Run Benchmarks on Source Branch + run: | + cd source/benchmarks + make > source_results.log + + - name: Save Source Results + id: save-source-results + uses: actions/upload-artifact@v2 + with: + name: source-results + path: source/benchmarks/source_results.log + + - name: Checkout Target Branch + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.base.ref }} + path: target + + - name: Setup Node.js for Target Branch + uses: actions/setup-node@v3 + with: + node-version: '22.x' + + - name: Install Dependencies for Target Branch + run: | + cd target + npm install + + - name: Run Benchmarks on Target Branch + run: | + cd target/benchmarks + make > target_results.log + + - name: Save Target Results + id: save-target-results + uses: actions/upload-artifact@v2 + with: + name: target-results + path: target/benchmarks/target_results.log + + - name: Download Source Results + uses: actions/download-artifact@v2 + with: + name: source-results + path: source-results + + - name: Download Target Results + uses: actions/download-artifact@v2 + with: + name: target-results + path: target-results + + - name: Compare Results and Comment on PR + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} + PR_BASE_REF: ${{ github.event.pull_request.base.ref }} + PR_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + run: | + set -e + # Compare the benchmark results and generate a Markdown table for the comment + echo "Comparing benchmark results..." + + # Ensure both results files exist + if [ ! -f source-results/source_results.log ] || [ ! -f target-results/target_results.log ]; then + echo "Results files not found!" + exit 1 + fi + + # Read results into arrays (assuming each line is a metric in the format "MetricName: Value") + mapfile -t source_results < source-results/source_results.log + mapfile -t target_results < target-results/target_results.log + + # Start the Markdown table + COMMENT_BODY='### Benchmark Comparison \n\n' + COMMENT_BODY+='| Metric | Source Branch Value | Target Branch Value | \n' + COMMENT_BODY+='|--------|----------------------|----------------------| \n' + + # Assuming the metrics are the same and in the same order for both source and target + for i in "${!source_results[@]}"; do + if [[ "${source_results[$i]}" =~ ^[[:space:]]*$ ]]; then + # Skip empty lines + continue + fi + source_metric_name=$(echo "${source_results[$i]}" | cut -d ':' -f 1) + source_metric_value=$(echo "${source_results[$i]}" | cut -d ':' -f 2) + target_metric_value=$(echo "${target_results[$i]}" | cut -d ':' -f 2) + + COMMENT_BODY+="| ${source_metric_name} | ${source_metric_value} | ${target_metric_value} | \n" + done + + # Post the comment to the PR + PAYLOAD=$(jq -n --arg body "$COMMENT_BODY" '{body: $body}') + echo "Posting comment to PR..." + curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD" \ + "$PR_COMMENTS_URL" + continue-on-error: true + + - name: Remove request-benchmarks Label + run: | + curl -s -X DELETE -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Content-Type: application/json" \ + "${{ github.event.pull_request.issue_url }}/labels/request-benchmarks"