name: Build, lint, and test on: [push, pull_request] env: # Don't mix these up! # runner.workspace = /home/runner/work/serenity # github.workspace = /home/runner/work/serenity/serenity SERENITY_ROOT: ${{ github.workspace }} jobs: build_and_test: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 # === OS SETUP === # Do we need to update the package cache first? # sudo apt-get update -qq - name: Purge interfering packages # Remove GCC 9 (installed by default) run: sudo apt-get purge -y gcc-9 g++-9 libstdc++-9-dev - name: Install dependencies # These packages are already part of the ubuntu-20.04 image: # clang-format-10 cmake gcc-10 g++-10 shellcheck libgmp-dev # These aren't: run: sudo apt-get install libstdc++-10-dev libmpfr-dev libmpc-dev # If we ever do any qemu-emulation on Github Actions, we should re-enable this: # e2fsprogs qemu-system-i386 qemu-utils - name: Use GCC 10 instead run: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 60 --slave /usr/bin/g++ g++ /usr/bin/g++-10 - name: Check versions run: set +e; g++ --version; g++-10 --version; clang-format --version; clang-format-10 --version; python --version; python3 --version # === PREPARE FOR BUILDING === - name: Lint (Phase 1/2) run: ${{ github.workspace }}/Meta/lint-ci.sh - name: Toolchain cache uses: actions/cache@v2 with: path: ${{ github.workspace }}/Toolchain/Cache/ # This assumes that *ALL* LibC headers have an impact on the Toolchain. # This is wrong, and causes more Toolchain rebuilds than necessary. # However, we want to avoid false cache hits at all costs. key: ${{ runner.os }}-toolchain-${{ hashFiles('Libraries/LibC/**/*.h', 'Toolchain/Patches/*.patch') }} - name: Restore or regenerate Toolchain run: TRY_USE_LOCAL_TOOLCHAIN=y ${{ github.workspace }}/Toolchain/BuildIt.sh # TODO: ccache # https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/ # https://github.com/cristianadam/HelloWorld/blob/master/.github/workflows/build_cmake.yml - name: Create build environment working-directory: ${{ github.workspace }} # Note that this needs to run *even if* the Toolchain was built, # in order to set options like BUILD_LAGOM. run: | mkdir -p Build cd Build cmake .. -DBUILD_LAGOM=1 -DALL_THE_DEBUG_MACROS=1 # === ACTUALLY BUILD AND TEST === - name: Build Serenity and Tests working-directory: ${{ github.workspace }}/Build run: cmake --build . -j2 - name: Lint (Phase 2/2) working-directory: ${{ github.workspace }}/Meta run: ./check-symbols.sh - name: Run CMake tests working-directory: ${{ github.workspace }}/Build run: CTEST_OUTPUT_ON_FAILURE=1 make test - name: Run JS tests working-directory: ${{ github.workspace }}/Build/Meta/Lagom run: DISABLE_DBG_OUTPUT=1 ./test-js # === NOTIFICATIONS === - name: Dump event info if: always() # Usually unnecessary, but insanely useful if IRC notifications fail. run: | cat <<"EOF" ${{ toJSON(github.event) }} EOF - name: Generate IRC message # I really dislike putting so much logic here, but I can't come up with something better. if: github.repository == 'SerenityOS/serenity' && !cancelled() && (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/master')) run: | ${{ github.workspace }}/Meta/notify_irc.py <<"EOF" ["${{ github.actor }}", ${{ github.run_id }}, "${{ job.status }}", ${{ toJSON(github.event) }} ] EOF