File: benchmark.yml

package info (click to toggle)
libgit2 1.9.2%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 60,816 kB
  • sloc: ansic: 203,740; javascript: 2,458; sh: 1,763; python: 384; perl: 99; php: 65; makefile: 33
file content (167 lines) | stat: -rw-r--r-- 5,727 bytes parent folder | download | duplicates (3)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# Benchmark libgit2 against the git reference implementation.
name: Benchmark

on:
  workflow_dispatch:
    inputs:
      suite:
        description: Benchmark suite to run
      debug:
        type: boolean
        description: Debugging output
  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)"
          id: linux
          os: ubuntu-latest
          setup-script: ubuntu
          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
        - name: "macOS"
          id: macos
          os: macos-latest
          setup-script: osx
          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
        - name: "Windows (amd64, Visual Studio)"
          id: windows
          os: windows-2022
          setup-script: win32
          env:
            ARCH: amd64
            CMAKE_GENERATOR: Visual Studio 17 2022
            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
      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: Clone resource repositories
      run: |
        mkdir resources
        git clone --bare https://github.com/git/git resources/git
        git clone --bare https://github.com/torvalds/linux resources/linux
    - name: Build
      run: |
        mkdir build && cd build
        ../source/ci/build.sh
      shell: bash
    - name: Benchmark
      run: |
        export BENCHMARK_GIT_REPOSITORY="$(pwd)/resources/git"
        # avoid linux temporarily; the linux blame benchmarks are simply
        # too slow to use
        # export BENCHMARK_LINUX_REPOSITORY="$(pwd)/resources/linux"

        if [[ "$(uname -s)" == MINGW* ]]; then
          GIT2_CLI="$(cygpath -w $(pwd))\\build\\Release\\git2"
        else
          GIT2_CLI="$(pwd)/build/git2"
        fi

        if [ "${{ github.event.inputs.suite }}" != "" ]; then
          SUITE_FLAG="--suite ${{ github.event.inputs.suite }}"
        fi

        if [ "${{ github.event.inputs.debug }}" = "true" ]; then
          DEBUG_FLAG="--debug"
        fi

        mkdir benchmark && cd benchmark
        ../source/tests/benchmarks/benchmark.sh \
            ${SUITE_FLAG} ${DEBUG_FLAG} \
            --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' && github.event_name == 'schedule'
    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