name: GitHub CI on: push: paths: - ".github/workflows/build.yml" - "build/**" - "src/**" - "!**/*.md" branches: - master pull_request: paths: - "build/**" - "src/**" - "!**/*.md" branches: - master release: types: [released] env: CI_REQ_DOTNET_SDK_VER: 5.0.100 COVERAGE_FILENAME: coverage.net5.0.info CI_NODE_MIN_VER: 10.0.0 RUSTFLAGS: -D warnings MACOSX_DEPLOYMENT_TARGET: 10.12 jobs: ############################################################################# ############################################################################# ############################################################################# build-dotnet: name: C# (${{matrix.os}}) runs-on: ${{matrix.os}} strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@v1 with: dotnet-version: ${{env.CI_REQ_DOTNET_SDK_VER}} - name: Build and test shell: bash run: | extra_args= if [[ "$OSTYPE" != "linux-gnu"* ]]; then extra_args=--quick-check fi ./build/build-dotnet $extra_args - uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'ubuntu-') with: name: nupkg path: src/csharp/Intel/Iced/bin/Release/*.*nupkg if-no-files-found: error - uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'ubuntu-') with: name: coverage.info path: src/csharp/Intel/Iced.UnitTests/${{env.COVERAGE_FILENAME}} if-no-files-found: error ############################################################################# ############################################################################# ############################################################################# build-rust: name: Rust (${{matrix.os}}) runs-on: ${{matrix.os}} strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 - name: Install Rust shell: bash run: bash build/ci-install-rust.sh - uses: actions/setup-dotnet@v1 with: dotnet-version: ${{env.CI_REQ_DOTNET_SDK_VER}} - name: Build and test shell: bash run: | extra_args= if [[ "$OSTYPE" != "linux-gnu"* ]]; then extra_args=--quick-check fi ./build/build-rust --no-set-rustflags $extra_args ############################################################################# ############################################################################# ############################################################################# build-rust-js-wasm: name: JavaScript (${{matrix.os}}) runs-on: ${{matrix.os}} strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 - name: Install Rust shell: bash run: bash build/ci-install-rust.sh - uses: actions/setup-node@v1 with: node-version: ${{env.CI_NODE_MIN_VER}} - name: Install wasm-pack shell: bash run: npm install -g wasm-pack - name: Build and test shell: bash run: | extra_args= if [[ "$OSTYPE" != "linux-gnu"* ]]; then extra_args=--quick-check fi ./build/build-js --no-set-rustflags $extra_args ############################################################################# ############################################################################# ############################################################################# build-rust-python: name: Python (${{matrix.os}}) runs-on: ${{matrix.os}} strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 - name: Verify that py/LICENSE.txt matches root/LICENSE.txt shell: bash run: | pydir=src/rust/iced-x86-py if [ ! -f "$pydir/LICENSE.txt" ]; then echo "Missing license file" exit 1 fi cp LICENSE.txt "$pydir/" git diff --exit-code - name: Install Rust shell: bash run: bash build/ci-install-rust.sh - name: Use repo source code shell: bash run: | # Make sure crates.io isn't used if [ "$OSTYPE" = "msys" ]; then iced_x86_dir="$(pwd -W)/src/rust/iced-x86" else iced_x86_dir="$(pwd)/src/rust/iced-x86" fi if [ ! -d "$iced_x86_dir" ]; then echo "Dir does not exist: $iced_x86_dir" exit 1 fi echo "paths = [\"$iced_x86_dir\"]" > "$HOME/.cargo/config.toml" # If the supported Python versions get updated (added/removed), do: # - Update .github/workflows/build.yml (this file) # - Search for eg. 3.6, 36 and 3\.6 # - Update file count in `Verify downloads` # - Update min ver in build/README.md and src/rust/iced-x86-py/README.md and any 36/3.6/etc refs # - Update src/rust/iced-x86-py/build-wheels.sh (search for eg. 36) # - Update src/rust/iced-x86-py/Cargo.toml (update "abi3-py36" to min supported version) # - Update Python versions in src/rust/iced-x86-py/setup.py # - `python_requires` line # - `classifiers` array # - src/rust/iced-x86-py/tox.ini # # NOTE: We use setup-miniconda and not setup-python because setup-python's # binaries target a later macos version and will produce warnings # when building wheels on macos. # https://github.com/actions/setup-python/issues/26 # This also means that all bash shells (that use Python) must # use the -le options: # shell: bash -le {0} # setup-python is faster to install than setup-miniconda so we only # use setup-miniconda if this is a macos image. - uses: actions/setup-python@v2 if: "!startsWith(matrix.os, 'macos-')" with: python-version: 3.6 - uses: conda-incubator/setup-miniconda@v2 if: startsWith(matrix.os, 'macos-') with: python-version: 3.6 - name: Install Python tools shell: bash -le {0} run: | python --version 2>&1 | grep "Python 3\.6" python -m pip install -r src/rust/iced-x86-py/requirements-dev.txt - name: Build and test shell: bash -le {0} run: | extra_args= if [[ "$OSTYPE" != "linux-gnu"* ]]; then extra_args=--quick-check fi ./build/build-python --no-set-rustflags --python python $extra_args git clean -xdf - name: Create the sdist if: startsWith(matrix.os, 'ubuntu-') shell: bash -le {0} run: | git clean -xdf ./build/build-python --sdist-only mkdir -p /tmp/py-dist cp src/rust/iced-x86-py/dist/* /tmp/py-dist git clean -xdf ####################### BEGIN Python Wheel: Linux, manylinux docker image ####################### # https://github.com/pypa/manylinux - name: Build manylinux i686 if: startsWith(matrix.os, 'ubuntu-') shell: bash run: | git clean -xdf ./build/py-build-wheels-linux.sh "quay.io/pypa/manylinux2010_i686" - name: Build manylinux x86_64 if: startsWith(matrix.os, 'ubuntu-') shell: bash run: | git clean -xdf ./build/py-build-wheels-linux.sh "quay.io/pypa/manylinux2010_x86_64" ####################### END Python Wheel: Linux, manylinux docker image ####################### ####################### BEGIN Python Wheel: !Linux ####################### ######################################################################### # NOTE: See the comment above before adding/removing new Python versions ######################################################################### - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.6 - uses: conda-incubator/setup-miniconda@v2 if: startsWith(matrix.os, 'macos-') with: python-version: 3.6 - name: Build and test the wheel if: "!startsWith(matrix.os, 'ubuntu-')" shell: bash -le {0} run: | python --version 2>&1 | grep "Python 3\.6" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.7 - uses: conda-incubator/setup-miniconda@v2 if: startsWith(matrix.os, 'macos-') with: python-version: 3.7 - name: Build and test the wheel if: "!startsWith(matrix.os, 'ubuntu-')" shell: bash -le {0} run: | python --version 2>&1 | grep "Python 3\.7" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.8 - uses: conda-incubator/setup-miniconda@v2 if: startsWith(matrix.os, 'macos-') with: python-version: 3.8 - name: Build and test the wheel if: "!startsWith(matrix.os, 'ubuntu-')" shell: bash -le {0} run: | python --version 2>&1 | grep "Python 3\.8" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.9 - uses: conda-incubator/setup-miniconda@v2 if: startsWith(matrix.os, 'macos-') with: python-version: 3.9 - name: Build and test the wheel if: "!startsWith(matrix.os, 'ubuntu-')" shell: bash -le {0} run: | python --version 2>&1 | grep "Python 3\.9" bash build/ci-py-build-wheels.sh ######################################################################### # The rest of the code needs 32-bit Rust/Python ######################################################################### - name: Install 32-bit Rust if: startsWith(matrix.os, 'windows-') shell: bash run: | rustup install stable-i686-pc-windows-msvc --no-self-update rustup default stable-i686-pc-windows-msvc rustup show - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.6 architecture: x86 - name: Build and test the wheel if: startsWith(matrix.os, 'windows-') shell: bash run: | python --version 2>&1 | grep "Python 3\.6" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.7 architecture: x86 - name: Build and test the wheel if: startsWith(matrix.os, 'windows-') shell: bash run: | python --version 2>&1 | grep "Python 3\.7" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.8 architecture: x86 - name: Build and test the wheel if: startsWith(matrix.os, 'windows-') shell: bash run: | python --version 2>&1 | grep "Python 3\.8" bash build/ci-py-build-wheels.sh - uses: actions/setup-python@v2 if: startsWith(matrix.os, 'windows-') with: python-version: 3.9 architecture: x86 - name: Build and test the wheel if: startsWith(matrix.os, 'windows-') shell: bash run: | python --version 2>&1 | grep "Python 3\.9" bash build/ci-py-build-wheels.sh ####################### END Python Wheel: !Linux ####################### - name: Fix upload path shell: bash run: | git clean -xdf cp -r /tmp/py-dist . - uses: actions/upload-artifact@v2 with: name: py-dist-${{matrix.os}} path: py-dist if-no-files-found: error ############################################################################# ############################################################################# ############################################################################# upload-files: runs-on: ubuntu-latest name: Upload files needs: - build-dotnet - build-rust - build-rust-js-wasm - build-rust-python steps: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@v1 with: dotnet-version: ${{env.CI_REQ_DOTNET_SDK_VER}} - uses: actions/setup-python@v2 with: python-version: 3.x - uses: actions/download-artifact@v2 with: path: /tmp/artifacts - name: Verify downloads shell: bash run: | if [ ! -f "/tmp/artifacts/coverage.info/$COVERAGE_FILENAME" ]; then echo "Missing coverage" exit 1 fi if [ -z "$(ls -A /tmp/artifacts/nupkg/Iced.*.nupkg)" ]; then echo "Missing nupkg files" exit 1 fi mkdir /tmp/py-dist-tmp mkdir /tmp/py-dist for path in /tmp/artifacts/py-dist-*; do cp "$path/"* /tmp/py-dist-tmp done mv /tmp/py-dist-tmp/iced_x86-*-cp36-abi3*.whl /tmp/py-dist mv /tmp/py-dist-tmp/iced-x86-*.tar.gz /tmp/py-dist for file in /tmp/py-dist-tmp/*; do if [ -f "$file" ]; then ls -l /tmp/py-dist-tmp echo "Unknown files found (see above)" echo "If it's a new Python version, see Python version comment above (`build-rust-python`)" exit 1 fi done rmdir /tmp/py-dist-tmp # Windows x86 + x64, macOS x64, Linux (x86 + x64) * (manylinux1 + manylinux2010) # 7 (wheels) + 1 (source code tar.gz file) if [ $(ls -A /tmp/py-dist | wc -l) -ne 8 ]; then ls -l /tmp/py-dist echo "Found too many/few Python whl files (see above)" exit 1 fi - name: Upload checks shell: bash run: | python -m pip install -U twine python -m twine check /tmp/py-dist/* dotnet nuget push --help cargo publish --help - name: Upload coverage report if: github.ref == 'refs/heads/master' shell: bash continue-on-error: true run: | curl --proto '=https' --tlsv1.2 -sSf https://codecov.io/bash | bash -s -- -f "/tmp/artifacts/coverage.info/$COVERAGE_FILENAME" env: CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} - name: Upload to nuget.org if: startsWith(github.ref, 'refs/tags/') shell: bash run: | for file in /tmp/artifacts/nupkg/Iced.*.nupkg; do dotnet nuget push "$file" --api-key "${{secrets.NUGET_APIKEY}}" --source https://api.nuget.org/v3/index.json done # - name: Upload to crates.io # if: startsWith(github.ref, 'refs/tags/') # shell: bash # run: | # git clean -xdf # git checkout . # cd src/rust/iced-x86 # cargo login --color always -- "${{secrets.CRATES_IO_TOKEN}}" # # --no-verify: we've tested building everything already # cargo publish --color always --no-verify - name: Upload to pypi.org if: startsWith(github.ref, 'refs/tags/') shell: bash run: | python -m twine upload --non-interactive -u __token__ -p "${{secrets.PYPI_TOKEN}}" /tmp/py-dist/*