summaryrefslogtreecommitdiffstats
path: root/.github/workflows/benchmark.yml
blob: 6ee492ac443018f54167e4026e100ed05e9ccab5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Benchmark libgit2 against the git reference implementation.
name: Benchmark

on:
  workflow_dispatch:
  schedule:
  - cron: '15 4 * * *'

permissions:
  contents: read

jobs:
  # Run our benchmarks. We build a matrix with the various build
  # targets and their details. Unlike our CI builds, we run these
  # directly on the VM instead of in containers since we do not
  # need the breadth of platform diversity.
  build:
    # Only run scheduled workflows on the main repository; prevents people
    # from using build minutes on their forks.
    if: github.repository == 'libgit2/libgit2'

    strategy:
      matrix:
        platform:
        - name: "Linux (clang, OpenSSL)"
          env:
            CC: clang
            CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_GSSAPI=ON -DBUILD_TESTS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_CLI=ON -DCMAKE_BUILD_TYPE=Release
            CMAKE_BUILD_OPTIONS: --config Release
          id: linux
          os: ubuntu-latest
          setup-script: ubuntu
        - name: "macOS"
          os: macos-12
          env:
            CC: clang
            CMAKE_OPTIONS: -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_GSSAPI=ON -DBUILD_TESTS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_CLI=ON -DCMAKE_BUILD_TYPE=Release
            CMAKE_BUILD_OPTIONS: --config Release
            PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
          id: macos
          setup-script: osx
        - name: "Windows (amd64, Visual Studio)"
          os: windows-2019
          env:
            ARCH: amd64
            CMAKE_GENERATOR: Visual Studio 16 2019
            CMAKE_OPTIONS: -A x64 -DDEPRECATE_HARD=ON -DBUILD_TESTS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_CLI=ON -DCMAKE_BUILD_TYPE=Release
            CMAKE_BUILD_OPTIONS: --config Release
          id: windows
          setup-script: win32
      fail-fast: false
    name: "Benchmark ${{ matrix.platform.name }}"
    env: ${{ matrix.platform.env }}
    runs-on: ${{ matrix.platform.os }}
    steps:
    - name: Check out repository
      uses: actions/checkout@v4
      with:
        path: source
        fetch-depth: 0
    - name: Set up benchmark environment
      run: source/ci/setup-${{ matrix.platform.setup-script }}-benchmark.sh
      shell: bash
      if: matrix.platform.setup-script != ''
    - name: Build
      run: |
        mkdir build && cd build
        ../source/ci/build.sh
      shell: bash
    - name: Benchmark
      run: |
        if [[ "$(uname -s)" == MINGW* ]]; then
          GIT2_CLI="$(cygpath -w $(pwd))\\build\\Release\\git2"
        else
          GIT2_CLI="$(pwd)/build/git2"
        fi

        mkdir benchmark && cd benchmark
        ../source/tests/benchmarks/benchmark.sh --baseline-cli "git" --cli "${GIT2_CLI}" --name libgit2 --json benchmarks.json --zip benchmarks.zip
      shell: bash
    - name: Upload results
      uses: actions/upload-artifact@v4
      with:
        name: benchmark-${{ matrix.platform.id }}
        path: benchmark
      if: always()

  # Publish the results
  publish:
    name: Publish results
    needs: [ build ]
    if: ${{ always() && github.repository == 'libgit2/libgit2' }}
    runs-on: ubuntu-latest
    steps:
    - name: Check out benchmark repository
      uses: actions/checkout@v4
      with:
        repository: libgit2/benchmarks
        path: site
        fetch-depth: 0
        ssh-key: ${{ secrets.BENCHMARKS_PUBLISH_KEY }}
    - name: Download test results
      uses: actions/download-artifact@v4
    - name: Publish API
      run: |
       # Move today's benchmark run into the right place
       for platform in linux macos windows; do
         TIMESTAMP=$(jq .time.start < "benchmark-${platform}/benchmarks.json")
         TIMESTAMP_LEN=$(echo -n ${TIMESTAMP} | wc -c | xargs)
         DENOMINATOR=1
         if [ "${TIMESTAMP_LEN}" = "19" ]; then
           DENOMINATOR="1000000000"
         elif [ "${TIMESTAMP_LEN}" = "13" ]; then
           DENOMINATOR="1000"
         else
           echo "unknown timestamp"
           exit 1
         fi

         if [[ "$(uname -s)" == "Darwin" ]]; then
           DATE=$(date -R -r $(("${TIMESTAMP}/${DENOMINATOR}")) +"%Y-%m-%d")
         else
           DATE=$(date -d @$(("${TIMESTAMP}/${DENOMINATOR}")) +"%Y-%m-%d")
         fi

         mkdir -p "site/public/api/runs/${DATE}"
         cp "benchmark-${platform}/benchmarks.json" "site/public/api/runs/${DATE}/${platform}.json"
       done

       (cd site && node scripts/aggregate.js)

       (
        cd site &&
        git config user.name 'Benchmark Site Generation' &&
        git config user.email 'libgit2@users.noreply.github.com' &&
        git add . &&
        git commit --allow-empty -m"benchmark update ${DATE}" &&
        git push origin main
       )
      shell: bash