name: CI on: push: branches: [master] tags: - "v**" pull_request: schedule: - cron: '0 0 * * 3' # At 12:00 AM, only on Wednesday workflow_dispatch: jobs: build-test: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - { os: windows-latest, rust-version: stable, shell: 'msys2 {0}', target: 'x86_64-pc-windows-gnu'} - { os: macos-11, rust-version: stable, shell: bash, target: 'x86_64-apple-darwin' } - { os: ubuntu-22.04, rust-version: stable, shell: bash, target: 'x86_64-unknown-linux-gnu' } - { os: ubuntu-20.04, rust-version: stable, shell: bash, target: 'x86_64-unknown-linux-gnu', extra: true } - { os: ubuntu-20.04, rust-version: stable, shell: bash, target: 'i686-unknown-linux-gnu' } - { os: ubuntu-20.04, rust-version: "1.70", shell: bash, target: 'x86_64-unknown-linux-gnu'} - { os: ubuntu-20.04, rust-version: beta, shell: bash, target: 'x86_64-unknown-linux-gnu'} - { os: ubuntu-20.04, rust-version: nightly, shell: bash, target: 'x86_64-unknown-linux-gnu'} defaults: run: shell: ${{ matrix.shell }} steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@master if: "!contains(matrix.os,'windows')" id: toolchain with: toolchain: ${{ matrix.rust-version }} targets: ${{ matrix.target }} components: clippy, rustfmt - name: Install i686 dependencies if: "contains(matrix.target,'i686')" run: sudo dpkg --add-architecture i386 && sudo apt-get update && sudo apt-get install libssl-dev:i386 gcc-multilib clang -y && echo "CC=clang" >> $GITHUB_ENV && echo "PKG_CONFIG_SYSROOT_DIR=/" >> $GITHUB_ENV - uses: msys2/setup-msys2@v2 if: contains(matrix.os,'windows') with: update: true install: >- base-devel mingw-w64-x86_64-rust - uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ matrix.os }}_${{ matrix.target }}_rustc-${{ steps.toolchain.outputs.cachekey }}_cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install wasm-pack if: matrix.extra run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh # Build and test. - name: Build library run: cargo rustc --target ${{ matrix.target }} --verbose --lib -- -D warnings - name: Test if: "!matrix.extra" run: cargo test --target ${{ matrix.target }} --all --verbose # Extra steps only run once to avoid duplication, when matrix.extra is true - name: Test and report if: matrix.extra run: | cargo install cargo2junit --force RUSTC_BOOTSTRAP=1 cargo test --all -- -Z unstable-options --format json --report-time | cargo2junit > cargo_test_results.xml - name: Publish cargo test results artifact if: matrix.extra uses: actions/upload-artifact@v3 with: name: cargo-test-results path: cargo_test_results.xml - name: Publish cargo test summary if: matrix.extra uses: EnricoMi/publish-unit-test-result-action/composite@master with: check_name: Cargo test summary files: cargo_test_results.xml fail_on: nothing comment_mode: off - name: Check formatting if: matrix.extra run: cargo fmt --check || echo "::warning ::cargo fmt found some formatting changes that may improve readability" - name: Check clippy if: matrix.extra run: cargo clippy --no-deps || echo "::warning ::cargo clippy found some code style changes that may be more idiomatic" # On stable rust builds, build a binary and publish as a github actions # artifact. These binaries could be useful for testing the pipeline but # are only retained by github for 90 days. - name: Build release binary if: contains(matrix.rust-version,'stable') run: | cargo rustc --target ${{ matrix.target }} --verbose --bin scryer-prolog --release -- -D warnings echo "$PWD/target/release" >> $GITHUB_PATH - name: Build wasm if: matrix.extra run: | wasm-pack build --target web -- --no-default-features - name: Publish release binary artifact if: contains(matrix.rust-version,'stable') uses: actions/upload-artifact@v3 with: path: target/${{ matrix.target }}/release/scryer-prolog* name: scryer-prolog_${{ matrix.os }}_${{ matrix.target }} - name: Publish wasm artifact if: matrix.extra uses: actions/upload-artifact@v3 with: path: pkg/* name: scryer-prolog_unknown_wasm32 logtalk-test: runs-on: ubuntu-20.04 needs: [build-test] steps: # Download prebuilt ubuntu binary from build-test job, setup logtalk - uses: actions/download-artifact@v3 with: name: scryer-prolog_ubuntu-20.04_x86_64-unknown-linux-gnu - run: | chmod +x scryer-prolog echo "$PWD" >> "$GITHUB_PATH" - name: Install Logtalk uses: logtalk-actions/setup-logtalk@master with: logtalk-version: git logtalk-tool-dependencies: false # Run logtalk tests. - name: Run Logtalk's prolog compliance test suite working-directory: ${{ env.LOGTALKUSER }}/tests/prolog/ run: | pwd scryerlgt -g '{ack(tester)},halt.' logtalk_tester -p scryer -g "set_logtalk_flag(clean,off)" -w -t 360 \ -f xunit \ -s "$LOGTALKUSER/tests/prolog" \ || echo "::warning ::logtalk compliance suite failed" # -u "https://github.com/LogtalkDotOrg/logtalk3/tree/$LOGTALK_GIT_HASH/tests/prolog/" \ - name: Publish Logtalk test logs uses: actions/upload-artifact@v3 with: name: logtalk-test-logs path: '${{ env.LOGTALKUSER }}/tests/prolog/logtalk_tester_logs' - name: Publish Logtalk test results artifact uses: actions/upload-artifact@v3 with: name: logtalk-test-results path: '${{ env.LOGTALKUSER }}/tests/prolog/**/*.xml' - name: Publish Logtalk test summary uses: EnricoMi/publish-unit-test-result-action/composite@master with: check_name: Logtalk test summary files: '${{ env.LOGTALKUSER }}/tests/prolog/**/*.xml' fail_on: nothing comment_mode: off # Publish binaries when building for a tag release: runs-on: ubuntu-20.04 needs: [build-test] if: startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v3 - name: Zip binaries for release run: | zip scryer-prolog_macos-11.zip ./scryer-prolog_macos-11_x86_64-apple-darwin/scryer-prolog zip scryer-prolog_ubuntu-20.04.zip ./scryer-prolog_ubuntu-20.04_x86_64-unknown-linux-gnu/scryer-prolog zip scryer-prolog_ubuntu-22.04.zip ./scryer-prolog_ubuntu-22.04_x86_64-unknown-linux-gnu/scryer-prolog zip scryer-prolog_windows-latest.zip ./scryer-prolog_windows-latest_x86_64-pc-windows-gnu/scryer-prolog.exe zip -r scryer-prolog_unknown-wasm32.zip ./scryer-prolog_unknown_wasm32 - name: Release uses: softprops/action-gh-release@v1 with: files: | scryer-prolog_macos-11.zip scryer-prolog_ubuntu-20.04.zip scryer-prolog_ubuntu-22.04.zip scryer-prolog_windows-latest.zip scryer-prolog_unknown-wasm32.zip