aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/.github/workflows/ci.yml
blob: 55490f3463886015ad1446f58b374e3d17c00a24 (plain) (blame)
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
name: CI

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  lint:
    runs-on: ubuntu-latest
    name: Linting
    continue-on-error: ${{ github.ref != 'refs/heads/master' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Run clang-format
        uses: egor-tensin/clang-format@v1

  build:
    strategy:
      matrix:
        compiler: [gcc, clang]
        configuration: [Debug, Release]
    runs-on: ubuntu-latest
    name: 'Build: ${{ matrix.compiler }} / ${{ matrix.configuration }}'
    env:
      COMPILER: '${{ matrix.compiler }}'
      CONFIGURATION: '${{ matrix.configuration }}'
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends libgit2-dev libjson-c-dev libsodium-dev libsqlite3-dev python3-pytest valgrind
      - name: Build
        run: make install
      - name: Upload binaries
        uses: actions/upload-artifact@v3
        with:
          name: 'cimple-${{ matrix.compiler }}-${{ matrix.configuration }}'
          path: './build/install/'
          if-no-files-found: error
      - name: Run tests
        run: make test
      - name: Run Valgrind tests
        run: make test/valgrind

  coverage:
    needs: [build]
    runs-on: ubuntu-latest
    name: 'Code coverage & flame graphs'
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends gcovr libgit2-dev libjson-c-dev libsodium-dev libsqlite3-dev python3-pytest
      - name: Install FlameGraph
        run: |
          git clone --depth 1 https://github.com/brendangregg/FlameGraph.git ~/FlameGraph
          echo ~/FlameGraph >> "$GITHUB_PATH"
      - name: Enable profiling
        run: |
          echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid
      - name: Generate coverage report
        run: |
          make coverage
          mkdir -p /tmp/out/
          cp -r ./build/coverage/ /tmp/out/
      - name: Upload report
        uses: actions/upload-artifact@v3
        with:
          name: coverage
          path: ./build/coverage/
          if-no-files-found: error
      - name: Clean up
        run: make clean
      - name: Build
        run: make install
      - name: Make flame graphs
        run: |
          # sudo is used to resolve kernel symbols. Plus, it would be required
          # if we didn't fix perf_event_paranoid. PATH needs to be preserved
          # for FlameGraph.
          sudo --preserve-env=PATH make test/perf
          mkdir -p /tmp/out/
          cp -r ./build/flame_graphs/ /tmp/out/
      - name: Upload flame graphs
        uses: actions/upload-artifact@v3
        with:
          name: flame_graphs
          path: ./build/flame_graphs/
          if-no-files-found: error
      - name: Publish to GitHub Pages
        uses: JamesIves/github-pages-deploy-action@v4
        with:
          folder: /tmp/out/
          single-commit: true
        if: github.ref == 'refs/heads/master'

  publish:
    needs: [lint, build]
    runs-on: ubuntu-latest
    name: 'Docker: publish'
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: '${{ secrets.DOCKERHUB_USERNAME }}'
          password: '${{ secrets.DOCKERHUB_TOKEN }}'
      - id: platforms
        name: Which platforms?
        # Building for ARM for every commit not in master is too time-consuming.
        run: |
          if [ '${{ github.ref }}' = 'refs/heads/master' ]; then
              echo 'platforms=amd64,armhf,arm64' >> "$GITHUB_OUTPUT"
          else
              echo 'platforms=amd64' >> "$GITHUB_OUTPUT"
          fi
      - name: Publish
        uses: docker/build-push-action@v3
        with:
          # Without context, .dockerignore is not respected?
          # https://stackoverflow.com/a/74552407/514684
          context: .
          platforms: '${{ steps.platforms.outputs.platforms }}'
          push: ${{ github.ref == 'refs/heads/master' }}
          tags: '${{ secrets.DOCKERHUB_USERNAME }}/cimple:latest'