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: runs-on: ubuntu-latest name: Coverage report 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: Generate report run: make coverage - name: Upload report uses: actions/upload-artifact@v3 with: name: coverage path: ./build/coverage/ if-no-files-found: error flame_graphs: runs-on: ubuntu-latest name: 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 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: Build run: make install - name: Generate flame graphs run: sudo --preserve-env=PATH make test/perf - name: Upload graphs uses: actions/upload-artifact@v3 with: name: flame_graphs path: ./build/flame_graphs/ if-no-files-found: error publish: needs: [lint, build, coverage] 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'