name: Checks on: [push, pull_request] jobs: ################################ # Contributor check ################################ contrib: name: Author in CONTRIBUTORS runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Check run: | set -x .github/scripts/contrib.sh ################################ # Matrix generation ################################ check_tag: name: Matrix Generation outputs: tagged: ${{ steps.check_tagged.outputs.tagged }} matrix: ${{ steps.check_tagged.outputs.matrix }} runs-on: ubuntu-latest steps: - name: Check the ref id: check_tagged run: | set -x printf '%s' '#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import argparse matrix = json.loads(r""" { "BUILD_TYPE": [ "check" ], "os": [ "ubuntu-latest", "macos-latest", "windows-latest" ], "python": [ 3.8 ], "include": [ { "os": "ubuntu-latest", "name": "Ubuntu", "SEP": "/", "BAZEL_ROOT": "~/.cache/bazelroot", "ANKI_PYTHON_WHEELS": "anki_linux_python" }, { "os": "macos-latest", "name": "Mac OS", "SEP": "/", "BAZEL_ROOT": "~/Library/Caches/bazelroot", "ANKI_PYTHON_WHEELS": "anki_macos_python" }, { "os": "windows-latest", "name": "Windows", "SEP": "\\", "BAZEL_ROOT": "~\\AppData\\Local\\bazelroot", "CARGO_INDEX_DIR": "C:\\Rust\\.cargo\\git", "CARGO_REGISTRY_DIR": "C:\\Rust\\.cargo\\registry", "ANKI_PYTHON_WHEELS": "anki_windows_python" } ] } """) parser = argparse.ArgumentParser(description="Dynamically creates a build matrix for the GitHub Actions.") parser.add_argument("--tagged", action="store_true", default=False, help="Skip checks on release build") args = parser.parse_args() # if args.tagged: # pass # else: # matrix["BUILD_TYPE"].append("check") print(json.dumps(matrix)) ' > buildmatrix.py; if [[ ${{ github.ref }} == refs/tags/* ]]; then printf '::set-output name=tagged::%s\n' "tagged" printf '::set-output name=matrix::%s\n' "$(python3 buildmatrix.py --tagged)" else printf '::set-output name=tagged::%s\n' "" printf '::set-output name=matrix::%s\n' "$(python3 buildmatrix.py)" fi ################################ # Tests ################################ tests: needs: - check_tag name: ${{ matrix.name }} ${{ needs.check_tag.outputs.tagged }} ${{ matrix.BUILD_TYPE }} ${{ matrix.python }} runs-on: ${{ matrix.os }} strategy: matrix: ${{ fromJson( needs.check_tag.outputs.matrix ) }} fail-fast: false steps: - uses: actions/checkout@v2 - name: Set up python uses: actions/setup-python@v2 with: python-version: ${{ matrix.python }} - name: Cache uses: actions/cache@v2 with: path: ${{ matrix.BAZEL_ROOT }} key: ${{ runner.os }}-bazout-1 ################################ # Linux ################################ - name: Linux if: matrix.os == 'ubuntu-latest' run: | set -x sudo apt update sudo apt install portaudio19-dev gettext curl -L https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-linux-amd64 -o ./bazel && \ chmod +x ./bazel # fix cache permissions # sudo chown -R $(whoami):$(id -ng) ~/.cargo/ BAZEL="./bazel --output_user_root=${{ matrix.BAZEL_ROOT }}" ARGS="--isatty=0 --color=yes" $BAZEL test ... $ARGS $BAZEL build qt:runanki $ARGS ANKI_IMPORT_ONLY=1 $BAZEL run qt:runanki ################################ # Mac ################################ - name: Mac if: matrix.os == 'macos-latest' run: | set -x brew install portaudio gettext bazelisk gnu-tar # gnu tar for cache issue echo "::add-path::/usr/local/opt/gnu-tar/libexec/gnubin" BAZEL="bazel --output_user_root=${{ matrix.BAZEL_ROOT }}" ARGS="--isatty=0 --color=yes" $BAZEL test ... $ARGS $BAZEL build qt:runanki $ARGS # the rsync workaround is not required in CI, as it's working # around a webengine issue ANKI_IMPORT_ONLY=1 $BAZEL run qt:runanki ################################ # Windows ################################ - name: Windows if: matrix.os == 'windows-latest' run: | # # https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio # if( "3.8".equals( "${{ matrix.python }}" ) ) { # $pyaudio=("PyAudio-0.2.11-cp37-cp37m-win_amd64.whl") # } # else { # $pyaudio=("PyAudio-0.2.11-cp38-cp38-win_amd64.whl") # } # $new_path=("$env:GITHUB_WORKSPACE;$env:PATH") # $new_path=("$env:GITHUB_WORKSPACE\shims;$new_path") # echo "::set-env name=rsyncbin::rsync-3.1.3-1-x86_64.pkg.tar.xz" # echo "::set-env name=pyaudio::$pyaudio" # echo "::set-env name=WINDOWS_CI_TOOLS::https://github.com/ankitects/windows-ci-tools/raw/master" # echo "::set-env name=PATH::$new_path" # echo "::set-env name=RUST_BACKTRACE::full" # echo "::set-env name=SCOOP::$env:GITHUB_WORKSPACE" # echo "::set-env name=SCOOP_GLOBAL::$env:GITHUB_WORKSPACE" # echo "::set-env name=ANKI_EXTRA_PIP::python -m pip install $pyaudio" Set-PSDebug -Trace 1 $env:PATH = "$env:PATH;c:\msys64\usr\bin" $env:ANKI_IMPORT_ONLY = "1" $PYTHON = Get-Command python | Select-Object -ExpandProperty Definition $BAZEL = ".\bazel.exe --output_user_root=..\bazout" $ARGS = "--action_env=\`"PYTHON_SYS_EXECUTABLE=$PYTHON\`"" curl --fail -L https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-windows-amd64.exe -o .\bazel.exe # try build a few times to compensate for rollup flakiness echo "Currently broken" # for ($i=1; $i -le 4; $i++) { Invoke-Expression "$BAZEL build qt:runanki -k $ARGS" -ErrorAction "continue" } # Invoke-Expression "$BAZEL build qt:runanki -k $ARGS" # Invoke-Expression "$BAZEL test ... $ARGS" # Invoke-Expression "$BAZEL run qt:runanki $ARGS" # - name: Cache pyenv # if: matrix.os != 'ubuntu-latest' && matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ github.workspace }}${{ matrix.SEP }}pyenv # key: ${{ runner.os }}-pyenv-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-25- # # Disable it in attempt to reduce the overall cache size (https://github.com/ankitects/anki/pull/528) # - name: Cache pip wheels # if: matrix.BUILD_TYPE == 'build' && matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ matrix.PIP_WHEELS_DIR }} # key: ${{ runner.os }}-pip-wheels-${{ hashFiles('**/requirements.txt') }}-${{ hashFiles('**/setup.py') }}-25- # - name: Cache cargo index # if: matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ matrix.CARGO_INDEX_DIR }} # key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-25- # - name: Cache cargo registry # if: matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ matrix.CARGO_REGISTRY_DIR }} # key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-25- # - name: Cache cargo target # if: matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ github.workspace }}${{ matrix.SEP }}target # key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-25- # - name: Cache cargo rslib # if: matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ github.workspace }}${{ matrix.SEP }}rslib${{ matrix.SEP }}target # key: ${{ runner.os }}-cargo-rslib-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-25- # - name: Cache cargo rspy # if: matrix.python == '3.8' # uses: actions/cache@v2 # with: # path: ${{ github.workspace }}${{ matrix.SEP }}rspy${{ matrix.SEP }}target # key: ${{ runner.os }}-cargo-rspy-${{ hashFiles('**/requirements.*') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/Makefile') }}-${{ hashFiles('**/Cargo.toml') }}-${{ matrix.BUILD_TYPE }}-25- # - name: Set up curl pyaudio, rsync # if: matrix.os == 'windows-latest' # shell: cmd # run: | # echo on # curl --fail -LO %WINDOWS_CI_TOOLS%/%pyaudio% # curl --fail -LO %WINDOWS_CI_TOOLS%/%rsyncbin% # :: https://stackoverflow.com/questions/1359793/programmatically-extract-tar-gz # 7z x "%rsyncbin%" -so | 7z x -aoa -si -ttar -o"%programfiles%\Git" # - name: Set up Windows scoop, gettext, ripgrep # if: matrix.os == 'windows-latest' # shell: cmd # run: | # echo on # powershell -executionpolicy bypass "& Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')" # scoop install -g gettext ripgrep # - name: Check Windows wheels # if: matrix.BUILD_TYPE == 'build' && matrix.os == 'windows-latest' # shell: cmd # run: | # echo on # copy %pyaudio% dist # cd dist # setlocal EnableDelayedExpansion # cmd /C set "wheels=" && for /f "delims=" %%i in ('dir /b *.*') DO set "wheels="%%i" !wheels!" # python -m pip install pyqtwebengine %wheels% # python -c "import aqt; # aqt.run()" # - name: Check Linux/Mac OS wheels # if: matrix.BUILD_TYPE == 'build' && ( matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' ) # run: | # set -x # cd dist # python -m pip install pyqtwebengine pyaudio *.* # python -c "import aqt; # aqt.run()" # - name: Upload python wheels # if: matrix.BUILD_TYPE == 'build' # uses: actions/upload-artifact@v2 # with: # name: ${{ matrix.ANKI_PYTHON_WHEELS }}${{ matrix.python }} # path: dist # - name: Upload to PyPi Windows # if: matrix.BUILD_TYPE == 'build' && startsWith(github.ref, 'refs/tags/') && matrix.os == 'windows-latest' # shell: cmd # env: # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} # TWINE_USERNAME: __token__ # run: | # echo on # cd dist # rm -f "%pyaudio%" # setlocal EnableDelayedExpansion # cmd /C set "wheels=" && for /f "delims=" %%i in ('dir /b *.*') DO set "wheels="%%i" !wheels!" # :: https://github.com/ankitects/anki/pull/535 # perl ../scripts/rename -f "s@\+[\w\d]+-@-@g" %wheels% # python -m pip install twine # python -m twine upload --non-interactive --skip-existing --verbose ./* # - name: Upload to PyPi Linux/Mac OS # if: matrix.BUILD_TYPE == 'build' && startsWith(github.ref, 'refs/tags/') && ( matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' ) # env: # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} # TWINE_USERNAME: __token__ # run: | # set -x # python -m pip install twine # # https://github.com/ankitects/anki/pull/535 # perl scripts/rename -f "s@\+[\w\d]+-@-@g" dist/* # python -m twine upload --non-interactive --skip-existing --verbose dist/*