diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index fec6a66f10..2cfa51db22 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -4,7 +4,7 @@ on: [pull_request] jobs: - buildtest-linux: + buildtest-linux-x86: container: image: racket/racket-ci:latest options: --init diff --git a/.github/workflows/ci-push-arm_linux.yml b/.github/workflows/ci-push-arm_linux.yml new file mode 100644 index 0000000000..8a881cbe03 --- /dev/null +++ b/.github/workflows/ci-push-arm_linux.yml @@ -0,0 +1,419 @@ +name: CI Linux ARM + +on: [push, pull_request] + +jobs: + +# Build jobs +# These jobs build each Racket component separately and tests on the component start as soon as each +# component finishes building. + + build-racketcgc: + strategy: + fail-fast: false + matrix: + cify: [cify, nocify] + arch: [ARM64] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + container: + image: racket/racket-ci:latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 100 + - name: Setup jit if ARM + if: matrix.arch == 'ARM' + run: echo "::set-env name=JIT_OPTION::--enable-jit --enable-futures" + - name: Setup jit if ARM64 + if: matrix.arch == 'ARM64' + run: echo "::set-env name=JIT_OPTION::--disable-jit --disable-futures" + - name: Setup cify if enabled + if: matrix.cify == 'cify' + run: echo "::set-env name=CIFY_OPTION::--enable-cify" + - name: Setup cify if disabled + if: matrix.cify == 'nocify' + run: echo "::set-env name=CIFY_OPTION::--disable-cify" + - name: Configuring Racket CGC + working-directory: ./racket/src + run: > + ./configure + --prefix=/usr/local/racketcgc + --enable-werror + --enable-cgcdefault + --enable-foreign + --enable-places + --enable-float + $JIT_OPTION + $CIFY_OPTION + --enable-pthread + --disable-docs + - name: Building + working-directory: ./racket/src + run: | + export cpus=$(nproc) + make -l $cpus -j $((cpus+1)) + - name: Installing + working-directory: ./racket/src + run: make -j $((cpus+1)) install + - name: Tarballing + working-directory: /usr/local + run: tar -cvjf /tmp/racketcgc-debian10-${{ matrix.cify }}-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 racketcgc + - uses: actions/upload-artifact@v2 + with: + name: racketcgc-debian10-${{ matrix.cify }}-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp/racketcgc-debian10-${{ matrix.cify }}-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + + build-racket3m: + container: + image: racket/racket-ci:latest + + needs: build-racketcgc + + strategy: + fail-fast: false + matrix: + arch: [ARM64] + cify: [cify, nocify] + cc: [gcc, clang] + ep: [ep, noep] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 100 + - name: Setup cify if enabled + if: matrix.cify == 'cify' + run: echo "::set-env name=CIFY_OPTION::--enable-cify" + - name: Setup cify if disabled + if: matrix.cify == 'nocify' + run: echo "::set-env name=CIFY_OPTION::--disable-cify" + - name: Setup ep if enabled + if: matrix.ep == 'ep' + run: echo "::set-env name=EP_OPTIONS::--enable-extflonums --enable-places" + - name: Setup efp if disabled + if: matrix.efp == 'noep' + run: echo "::set-env name=EP_OPTIONS::--disable-extflonums --disable-places" + - uses: actions/download-artifact@v2 + with: + name: racketcgc-debian10-nocify-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp + - name: Untar + working-directory: /usr/local + run: tar -xvjf /tmp/racketcgc-debian10-nocify-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + - name: Configuring Racket 3m + working-directory: ./racket/src + env: + CC: ${{ matrix.cc }} + run: > + ./configure + --prefix=/usr/local/racket3m + --enable-bcdefault + --enable-bconly + --enable-werror + --enable-racket=/usr/local/racketcgc/bin/racket + --enable-foreign + --enable-float + --disable-docs + $CIFY_OPTION + $EP_OPTIONS + --enable-pthread + - name: Building + working-directory: ./racket/src + run: | + export cpus=$(nproc) + make -l $cpus -j $((cpus+1)) + - name: Installing + working-directory: ./racket/src + run: make -j $((cpus+1)) install + # We build on Linux with clang and gcc and on MacOS with clang only. + # However, it makes little sense to test both builds on Linux so we tarball the + # gcc build only. Therefore this condition ensure we only perform the tarball + # and artifact upload on MacOS or (on Linux) if we are building with gcc. + - name: Tarballing + working-directory: /usr/local + run: tar -cvjf /tmp/racket3m-debian10-${{ matrix.cify }}-${{ matrix.ep }}-${{ matrix.arch }}_git${{ github.sha}}.tar.bz2 racket3m + - uses: actions/upload-artifact@v2 + if: matrix.cc == 'gcc' + with: + name: racket3m-debian10-${{ matrix.cify }}-${{ matrix.ep }}-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp/racket3m-debian10-${{ matrix.cify }}-${{ matrix.ep }}-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + + build-racketcs: + container: + image: racket/racket-ci:latest + + needs: build-racketcgc + + strategy: + fail-fast: false + matrix: + cc: [gcc, clang] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 100 + - uses: actions/download-artifact@v2 + with: + name: racketcgc-debian10-nocify-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp + - name: Untar + working-directory: /usr/local + run: tar -xvjf /tmp/racketcgc-debian10-nocify-${{ matrix.arch }}_git${{ github.sha}}.tar.bz2 + - name: Checking out ChezScheme + working-directory: ./racket/src + run: git clone --depth=1 --recurse-submodules -j3 https://github.com/racket/ChezScheme + - name: Configuring Racket CS + working-directory: ./racket/src + env: + CC: ${{ matrix.cc }} + run: > + ./configure + --prefix=/usr/local/racketcs + $RACKET_EXTRA_CONFIGURE_ARGS + --enable-racket=/usr/local/racketcgc/bin/racket + --enable-compress + --disable-docs + --enable-pthread + --enable-csdefault + --enable-csonly + - name: Building + working-directory: ./racket/src + run: | + export cpus=$(nproc) + make -l $cpus -j $((cpus+1)) + - name: Installing + working-directory: ./racket/src + run: make -j $((cpus+1)) install + - name: Tarballing + working-directory: /usr/local + run: tar -cvjf /tmp/racketcs-debian10-${{ matrix.arch }}_git${{ github.sha}}.tar.bz2 racketcs + - uses: actions/upload-artifact@v2 + with: + name: racketcs-debian10-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp/racketcs-debian10-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + + # Tests + # Unfortunately Actions does not support atm yaml anchors + # otherwise all the following jobs could be simplified + # Note: the reason we cannot transform this into a matrix + # build is because we cannot use variables in the needs keyword. + test-cgc: + container: + image: racket/racket-ci:latest + options: --init + + needs: build-racketcgc + + strategy: + fail-fast: false + matrix: + arch: [ARM64] + cify: [cify, nocify] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + + steps: + - run: find ${HOME}/.racket -type f + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: racketcgc-debian10-${{ matrix.cify }}-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp + - name: Untar + working-directory: /usr/local + run: tar -xvjf /tmp/racketcgc-debian10-${{ matrix.cify }}-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + - name: Extend PATH with Racket executable + run: echo "::set-env name=PATH::/usr/local/racketcgc/bin:$PATH" + - name: Check for Racket + run: racket --version + - name: Install catalog + run: | + racket -l- pkg/dirs-catalog --immediate $PWD/rktcat $PWD/pkgs/ + raco pkg config --set catalogs $PWD/rktcat/ https://pkgs.racket-lang.org https://planet-compats.racket-lang.org + - name: Install racket-test dependency + run: raco pkg install --auto racket-test + - name: Run tests/racket/test + run: raco test -l tests/racket/test + - name: Run tests/racket/contract/all + run: racket -l tests/racket/contract/all + - name: Run tests/json/json + run: raco test -l tests/json/json + - name: Run tests/file/main + run: raco test -l tests/file/main + - name: Run tests/net/head + run: raco test -l tests/net/head + - name: Run tests/net/uri-codec + run: raco test -l tests/net/uri-codec + - name: Run tests/net/url + run: raco test -l tests/net/url + - name: Run tests/net/url-port + run: raco test -l tests/net/url-port + - name: Run tests/net/encoders + run: raco test -l tests/net/encoders + - name: Run tests/openssl/basic + run: raco test -l tests/openssl/basic + - name: Run tests/openssl/https + run: raco test -l tests/openssl/https + - name: Run tests/match/main + run: raco test -l tests/match/main + - name: Run tests/zo-path + run: raco test -l tests/zo-path + - name: Run tests/xml + run: raco test -c tests/xml + - name: Run tests/future + run: raco test -c tests/future + - name: Run tests/stxparse + run: raco test -c tests/stxparse + - name: Install db tests dependency + run: raco pkg install --auto db-test + - name: Run db tests + run: raco test -l tests/db/all-tests + - name: Run syntax tests + run: raco test -c tests/syntax + + test-3m: + container: + image: racket/racket-ci:latest + options: --init + + needs: build-racket3m + + strategy: + fail-fast: false + matrix: + cify: [cify, nocify] + ep: [ep, noep] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: racket3m-debian10-${{ matrix.cify }}-${{ matrix.ep }}-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp + - name: Untar + working-directory: /usr/local + run: tar -xvjf /tmp/racket3m-debian10-${{ matrix.cify }}-${{ matrix.ep }}-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + - name: Extend PATH with Racket executable + run: echo "::set-env name=PATH::/usr/local/racket3m/bin:$PATH" + - name: Check for Racket + run: racket --version + - name: Install catalog and required packages + run: | + racket -l- pkg/dirs-catalog --immediate $PWD/rktcat $PWD/pkgs/ + raco pkg config --set catalogs $PWD/rktcat/ https://pkgs.racket-lang.org https://planet-compats.racket-lang.org + - name: Install racket-test dependency + run: raco pkg install --auto racket-test + - name: Run tests/racket/test + run: raco test -l tests/racket/test + - name: Run tests/racket/contract/all + run: racket -l tests/racket/contract/all + - name: Run tests/json/json + run: raco test -l tests/json/json + - name: Run tests/file/main + run: raco test -l tests/file/main + - name: Run tests/net/head + run: raco test -l tests/net/head + - name: Run tests/net/uri-codec + run: raco test -l tests/net/uri-codec + - name: Run tests/net/url + run: raco test -l tests/net/url + - name: Run tests/net/url-port + run: raco test -l tests/net/url-port + - name: Run tests/net/encoders + run: raco test -l tests/net/encoders + - name: Run tests/openssl/basic + run: raco test -l tests/openssl/basic + - name: Run tests/openssl/https + run: raco test -l tests/openssl/https + - name: Run tests/match/main + run: raco test -l tests/match/main + - name: Run tests/zo-path + run: raco test -l tests/zo-path + - name: Run tests/xml + run: raco test -c tests/xml + - name: Run tests/future + run: raco test -c tests/future + - name: Run tests/stxparse + run: raco test -c tests/stxparse + - name: Install db tests dependency + run: raco pkg install --auto db-test + - name: Run db tests + run: raco test -l tests/db/all-tests + + test-cs: + container: + image: racket/racket-ci:latest + options: --init + + strategy: + matrix: + arch: [ARM64] + + needs: build-racketcs + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: racketcs-debian10-${{ matrix.arch }}_git${{ github.sha }} + path: /tmp + - name: Untar + working-directory: /usr/local + run: tar -xvjf /tmp/racketcs-debian10-${{ matrix.arch }}_git${{ github.sha }}.tar.bz2 + - name: Extend PATH with Racket executable + run: echo "::set-env name=PATH::/usr/local/racketcs/bin:$PATH" + - name: Check for Racket + run: racket --version + - name: Install catalog and required packages + run: | + racket -l- pkg/dirs-catalog --immediate $PWD/rktcat $PWD/pkgs/ + raco pkg config --set catalogs $PWD/rktcat/ https://pkgs.racket-lang.org https://planet-compats.racket-lang.org + - name: Install racket-test dependency + run: raco pkg install --auto racket-test + - name: Run tests/racket/test + run: raco test -l tests/racket/test + - name: Run tests/racket/contract/all + run: racket -l tests/racket/contract/all + - name: Run tests/json/json + run: raco test -l tests/json/json + - name: Run tests/file/main + run: raco test -l tests/file/main + - name: Run tests/net/head + run: raco test -l tests/net/head + - name: Run tests/net/uri-codec + run: raco test -l tests/net/uri-codec + - name: Run tests/net/url + run: raco test -l tests/net/url + - name: Run tests/net/url-port + run: raco test -l tests/net/url-port + - name: Run tests/net/encoders + run: raco test -l tests/net/encoders + - name: Run tests/openssl/basic + run: raco test -l tests/openssl/basic + - name: Run tests/openssl/https + run: raco test -l tests/openssl/https + - name: Run tests/match/main + run: raco test -l tests/match/main + - name: Run tests/zo-path + run: raco test -l tests/zo-path + - name: Run tests/xml + run: raco test -c tests/xml + - name: Run tests/future + run: raco test -c tests/future + - name: Run tests/stxparse + run: raco test -c tests/stxparse + - name: Install db tests dependency + run: raco pkg install --auto db-test + - name: Run db tests + run: raco test -l tests/db/all-tests diff --git a/.github/workflows/ci-push_linux.yml b/.github/workflows/ci-push-x86_linux.yml similarity index 99% rename from .github/workflows/ci-push_linux.yml rename to .github/workflows/ci-push-x86_linux.yml index 443d4e9c23..ffb6a73e76 100644 --- a/.github/workflows/ci-push_linux.yml +++ b/.github/workflows/ci-push-x86_linux.yml @@ -1,4 +1,4 @@ -name: CI Linux +name: CI Linux x86 on: [push] diff --git a/.github/workflows/ubsan-arm.yml b/.github/workflows/ubsan-arm.yml new file mode 100644 index 0000000000..4e28863a42 --- /dev/null +++ b/.github/workflows/ubsan-arm.yml @@ -0,0 +1,183 @@ +name: Test with UBSan on ARM + +on: [push, pull_request] + +jobs: + +# Build jobs +# These jobs build Racket using undefined behaviour sanitizers and gathers the results into a final log + racket3m-ubsan: + strategy: + fail-fast: false + matrix: + arch: [ARM64] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + container: racket/racket-ci:latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 100 + - name: Create logs directory + run: mkdir $PWD/logs + - name: Build + run: | + export cpus=$(grep -c ^processor /proc/cpuinfo) + make CPUS="${cpus}" PKGS="racket-test db-test unstable-flonum-lib net-test" CONFIGURE_ARGS_qq='CFLAGS="-fno-var-tracking-assignments" --enable-ubsan' RACKETBC_SUFFIX="" bc-in-place 2>&1 | tee logs/build.log + - name: Add new racket to PATH + run: | + echo "${GITHUB_WORKSPACE}/racket/bin" >> $GITHUB_PATH + find /__w/racket/racket/racket/bin -type f + - name: Racket version + run: | + which racket + racket --version + - name: Run tests/racket/test + continue-on-error: true + run: raco test -l tests/racket/test 2>&1 | tee logs/racket-test.log + - name: Run tests/racket/contract/all + continue-on-error: true + run: racket -l tests/racket/contract/all | tee logs/contract-all.log + - name: Run tests/json/json + continue-on-error: true + run: raco test -l tests/json/json | tee logs/json-json.log + - name: Run tests/file/main + continue-on-error: true + run: raco test -l tests/file/main | tee logs/file-main.log + - name: Run tests/net/head + continue-on-error: true + run: raco test -l tests/net/head | tee logs/net-head.log + - name: Run tests/net/uri-codec + continue-on-error: true + run: raco test -l tests/net/uri-codec | tee logs/uri-codec.log + - name: Run tests/net/url + continue-on-error: true + run: raco test -l tests/net/url | tee logs/net-url.log + - name: Run tests/net/url-port + continue-on-error: true + run: raco test -l tests/net/url-port | tee logs/url-port.log + - name: Run tests/net/encoders + continue-on-error: true + run: raco test -l tests/net/encoders | tee logs/net-encoders.log + - name: Run tests/openssl/basic + continue-on-error: true + run: raco test -l tests/openssl/basic | tee logs/openssl-basic.log + - name: Run tests/openssl/https + continue-on-error: true + run: raco test -l tests/openssl/https | tee logs/openssl-https.log + - name: Run tests/match/main + continue-on-error: true + run: raco test -l tests/match/main | tee logs/match-main.log + - name: Run tests/zo-path + continue-on-error: true + run: raco test -l tests/zo-path | tee logs/zo-path.log + - name: Run tests/xml + continue-on-error: true + run: raco test -c tests/xml | tee logs/xml.log + - name: Run tests/future + continue-on-error: true + run: raco test -c tests/future | tee logs/future.log + - name: Run tests/stxparse + continue-on-error: true + run: raco test -c tests/stxparse | tee logs/stxparse.log + - name: Run db tests + continue-on-error: true + run: raco test -l tests/db/all-tests | tee logs/db-all-tests.log + - name: Gather runtime errors + run: | + grep 'runtime error' logs/*.log > runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log || true + test ! -s runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log + - uses: actions/upload-artifact@v2 + with: + name: runtime-errors-${{ matrix.arch }}_git${{ github.sha }} + path: runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log + + racketcs-ubsan: + strategy: + fail-fast: false + matrix: + arch: [ARM64] + + runs-on: [self-hosted, Linux, '${{ matrix.arch }}'] + container: racket/racket-ci:latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 100 + - name: Create logs directory + run: mkdir $PWD/logs + - name: Build + run: | + export cpus=$(grep -c ^processor /proc/cpuinfo) + make CPUS="${cpus}" PKGS="racket-test db-test unstable-flonum-lib net-test" CONFIGURE_ARGS_qq='CFLAGS="-fno-var-tracking-assignments" --enable-ubsan' cs-in-place 2>&1 | tee logs/build.log + - name: Add new racket to PATH + run: | + echo "${GITHUB_WORKSPACE}/racket/bin" >> $GITHUB_PATH + find /__w/racket/racket/racket/bin -type f + - name: Racket version + run: | + which racket + racket --version + - name: Run tests/racket/test + continue-on-error: true + run: raco test -l tests/racket/test 2>&1 | tee logs/racket-test.log + - name: Run tests/racket/contract/all + continue-on-error: true + run: racket -l tests/racket/contract/all | tee logs/contract-all.log + - name: Run tests/json/json + continue-on-error: true + run: raco test -l tests/json/json | tee logs/json-json.log + - name: Run tests/file/main + continue-on-error: true + run: raco test -l tests/file/main | tee logs/file-main.log + - name: Run tests/net/head + continue-on-error: true + run: raco test -l tests/net/head | tee logs/net-head.log + - name: Run tests/net/uri-codec + continue-on-error: true + run: raco test -l tests/net/uri-codec | tee logs/uri-codec.log + - name: Run tests/net/url + continue-on-error: true + run: raco test -l tests/net/url | tee logs/net-url.log + - name: Run tests/net/url-port + continue-on-error: true + run: raco test -l tests/net/url-port | tee logs/url-port.log + - name: Run tests/net/encoders + continue-on-error: true + run: raco test -l tests/net/encoders | tee logs/net-encoders.log + - name: Run tests/openssl/basic + continue-on-error: true + run: raco test -l tests/openssl/basic | tee logs/openssl-basic.log + - name: Run tests/openssl/https + continue-on-error: true + run: raco test -l tests/openssl/https | tee logs/openssl-https.log + - name: Run tests/match/main + continue-on-error: true + run: raco test -l tests/match/main | tee logs/match-main.log + - name: Run tests/zo-path + continue-on-error: true + run: raco test -l tests/zo-path | tee logs/zo-path.log + - name: Run tests/xml + continue-on-error: true + run: raco test -c tests/xml | tee logs/xml.log + - name: Run tests/future + continue-on-error: true + run: raco test -c tests/future | tee logs/future.log + - name: Run tests/stxparse + continue-on-error: true + run: raco test -c tests/stxparse | tee logs/stxparse.log + - name: Run db tests + continue-on-error: true + run: raco test -l tests/db/all-tests | tee logs/db-all-tests.log + - name: Gather runtime errors + run: | + grep 'runtime error' logs/*.log > runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log || true + test ! -s runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: runtime-errors-${{ matrix.arch }}-cs_git${{ github.sha }} + path: runtime-errors-${{ matrix.arch }}_git${{ github.sha }}.log + diff --git a/.github/workflows/ci-ubsan.yml b/.github/workflows/ubsan-x86.yml similarity index 99% rename from .github/workflows/ci-ubsan.yml rename to .github/workflows/ubsan-x86.yml index 7944e831a8..977c962e93 100644 --- a/.github/workflows/ci-ubsan.yml +++ b/.github/workflows/ubsan-x86.yml @@ -1,4 +1,4 @@ -name: Test with UBSan +name: Test with UBSan on X86 on: [push, pull_request]