name: CI on: push: pull_request: workflow_dispatch: env: DEPS: libgit2-dev libjson-c-dev libsodium-dev libsqlite3-dev python3-pytest 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: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' cache: pip cache-dependency-path: ./test/py/requirements.txt - name: Install dependencies run: | sudo apt-get update sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends $DEPS valgrind pip install -q -r ./test/py/requirements.txt - 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/report - name: Upload test report uses: actions/upload-artifact@v3 with: name: 'test-report-${{ matrix.compiler }}-${{ matrix.configuration }}' path: './build/test_report/' if-no-files-found: error if: always() - 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 $DEPS gcovr - 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 coverage 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 flame_graphs 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: Download test report uses: actions/download-artifact@v3 with: name: test-report-gcc-Release path: /tmp/out/test_report/ - 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'