name: CI on: push: branches: - master tags: - '*' pull_request: branches: - master schedule: - cron: '0 0 * * *' jobs: Build: # don't schedule nightlies on forks if: github.event_name != 'schedule' || github.repository == 'leanprover/lean4' runs-on: ${{ matrix.os }} defaults: run: shell: ${{ matrix.shell || 'nix-shell --run "bash -euxo pipefail {0}"' }} strategy: matrix: include: # portable release build: link most libraries statically and use channel with older glibc (2.27; LLVM 7) - name: Linux release os: ubuntu-latest release: true CMAKE_OPTIONS: -DSTATIC=ON shell: nix-shell --arg pkgs "import (fetchTarball \"channel:nixos-19.03\") {{}}" --argstr llvmPackages latest --run "bash -euxo pipefail {0}" - name: Linux os: ubuntu-latest check-stage3: true test-speedcenter: true - name: Linux Debug os: ubuntu-latest CMAKE_OPTIONS: -DCMAKE_BUILD_TYPE=Debug - name: Linux fsanitize os: ubuntu-latest # turn off custom allocator to make LSAN do its magic CMAKE_OPTIONS: -DLEAN_EXTRA_CXX_FLAGS=-fsanitize=address,undefined -DLEANC_EXTRA_FLAGS=-fsanitize=address,undefined -DSMALL_ALLOCATOR=OFF - name: macOS os: macos-latest release: true CMAKE_OPTIONS: -DSTATIC=ON - name: Windows os: windows-latest release: true shell: msys2 {0} CMAKE_OPTIONS: -G "Unix Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSTATIC=ON # complete all jobs fail-fast: false name: ${{ matrix.name }} env: # must be inside workspace CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPRESS: true # current cache limit CCACHE_MAXSIZE: 200M steps: - name: Checkout uses: actions/checkout@v2 with: # interferes with lean4-nightly authentication persist-credentials: false - name: Install Nix uses: cachix/install-nix-action@v12 with: # used only for providing a more recent `bash` on macOS nix_path: nixpkgs=channel:nixos-unstable if: matrix.os != 'windows-latest' - name: Install MSYS2 uses: msys2/setup-msys2@v2 with: install: make python mingw-w64-x86_64-cmake mingw-w64-x86_64-clang mingw-w64-x86_64-ccache git diffutils if: matrix.os == 'windows-latest' - name: Cache uses: actions/cache@v2 with: path: .ccache key: ${{ matrix.name }}-build-${{ github.sha }} # fall back to (latest) previous cache restore-keys: | ${{ matrix.name }}-build - name: Setup run: | # open nix-shell once for initial setup true if: matrix.os != 'windows-latest' # remove problematic tests for sanitized build - name: Pre build run: rm tests/compiler/StackOverflow.lean tests/compiler/StackOverflowTask.lean if: matrix.name == 'Linux fsanitize' - name: Build run: | mkdir build cd build OPTIONS= if [[ $GITHUB_EVENT_NAME == 'schedule' && -n '${{ matrix.release }}' && -n '${{ secrets.PUSH_NIGHTLY_TOKEN }}' ]]; then git remote add nightly https://foo:'${{ secrets.PUSH_NIGHTLY_TOKEN }}'@github.com/${{ github.repository_owner }}/lean4-nightly.git git fetch nightly --tags LEAN_VERSION_STRING="nightly-$(date -u +%F)" # do nothing if commit already has a different tag if [[ $(git name-rev --name-only --tags --no-undefined HEAD 2> /dev/null || echo $LEAN_VERSION_STRING) == $LEAN_VERSION_STRING ]]; then OPTIONS=-DLEAN_SPECIAL_VERSION_DESC=$LEAN_VERSION_STRING echo "LEAN_VERSION_STRING=$LEAN_VERSION_STRING" >> $GITHUB_ENV fi fi cmake .. ${{ matrix.CMAKE_OPTIONS }} $OPTIONS make -j4 # de-Nix-ify binaries - name: Patch run: | for f in lean leanpkg; do patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 --remove-rpath build/stage1/bin/$f done if: matrix.name == 'Linux release' - name: Patch run: | for f in lean leanpkg; do for lib in $(otool -L build/stage1/bin/$f | tail -n +2 | cut -d' ' -f1); do install_name_tool -change "$lib" "/usr/lib/$(basename $lib | sed 's/libc++\.1\.0/libc++.1/')" build/stage1/bin/$f done done if: matrix.name == 'macOS' - name: Pack run: cd build/stage1; cpack - uses: actions/upload-artifact@v2 with: name: build-${{ matrix.name }} path: build/stage1/lean-* - name: Test run: | cd build/stage1 ctest -j4 --output-on-failure < /dev/null - name: Build Stage 2 run: | cd build make -j4 stage2 if: matrix.build-stage2 || matrix.check-stage3 - name: Check Stage 3 run: | cd build make -j4 check-stage3 if: matrix.check-stage3 - name: Test Speedcenter Benchmarks run: | echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid export BUILD=$PWD/build PATH=$PWD/build/stage1/bin:$PATH cd tests/bench; temci exec --config speedcenter.yaml --included_blocks fast --runs 1 if: matrix.test-speedcenter - name: Check rebootstrap run: | cd build make update-stage0 && make -j4 if: matrix.name == 'Linux' - name: CCache stats run: ccache -s - name: Release uses: softprops/action-gh-release@v1 if: ${{ startsWith(github.ref, 'refs/tags/v') && matrix.release }} with: files: build/stage1/lean-* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Prepare Nightly Release if: env.LEAN_VERSION_STRING run: | # can't push shallow checkout git fetch --unshallow git fetch nightly --tags if git tag $LEAN_VERSION_STRING && git push nightly $LEAN_VERSION_STRING; then last_tag=$(git describe HEAD^ --abbrev=0 --tags) echo -e "Changes since ${last_tag}:\n\n" > diff.md #git show $last_tag:doc/changes.md > old.md #./script/diff_changelogs.py old.md doc/changes.md >> diff.md echo -e "*Full commit log*\n" >> diff.md git log --oneline $last_tag..HEAD | sed 's/^/* /' >> diff.md else # make sure every runner is building the same commit [ $(git rev-parse HEAD) == $(git rev-parse $LEAN_VERSION_STRING) ] || exit 11 echo -n > diff.md fi - name: Release Nightly # need unreleased version for fixed `repository` uses: Kha/action-gh-release@master if: env.LEAN_VERSION_STRING with: body_path: diff.md prerelease: true files: build/stage1/lean-* tag_name: ${{ env.LEAN_VERSION_STRING }} repository: ${{ github.repository_owner }}/lean4-nightly env: GITHUB_TOKEN: ${{ secrets.PUSH_NIGHTLY_TOKEN }}