Skip to content

Commit

Permalink
Update Fedora and Ubuntu CIs and their rpm and deb packaging scripts
Browse files Browse the repository at this point in the history
Update all tesseract text backends to latest versions as these are
needed in order to build on most recent Fedora and Ubuntu distros.
Also update all pyautogui dependencies to now simpler and finally
fixed installation that requires only a GNOME screenshot binary.

The newer Ubuntu Noble is more enforcing regarding PEP 668 so change
the Ubuntu python packages to a venv to abide by these rules.

Note: Tesseract now requires us to set a tesssdata path which is
suspected to be caused by the newer tesseract binaries.
Note: A test had to be skipped for newer OpenCV versions regarding
"unknown CPP error" when combined with tesseract.

Thanks to Minh Quang <[email protected]> for his contributions
here regarding this commit.
  • Loading branch information
pevogam authored and gbladislau committed Oct 15, 2024
1 parent fed13d2 commit 5d27f79
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 63 deletions.
19 changes: 10 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
python-version: [3.10.8, 3.11, 3.12]
install_variant: ["pip"]
include:
- python-version: 3.10.8
install_variant: "rpm.fedora.34"
- python-version: 3.7
install_variant: "deb.ubuntu.focal"
- python-version: 3.12
install_variant: "rpm.fedora.40"
- python-version: 3.12
install_variant: "deb.ubuntu.noble"
fail-fast: false

steps:
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:
# vncdotool
sudo apt-get -y install xfonts-base x11vnc
# pyautogui
sudo apt-get -y install scrot
sudo apt-get -y install gnome-screenshot
if: matrix.install_variant == 'pip'
- name: Install any dependencies and build the package
run: pip --default-timeout=60 install -r packaging/pip_requirements.txt
Expand All @@ -74,13 +74,14 @@ jobs:
sleep 3
- name: Run current semi-isolation semi-integration tests (to be separated in the future)
run: |
if [[ ${{ matrix.python-version }} == '3.10.8' ]]; then export DISABLE_AUTOPY=1; fi
if [[ ${{ matrix.python-version }} == '3.11' ]]; then export DISABLE_AUTOPY=1; fi
if [[ ${{ matrix.python-version }} == '3.12' ]]; then export DISABLE_AUTOPY=1; fi
if [[ ${{ matrix.install_variant }} != "pip" ]]; then cd packaging && bash packager_docker.sh;
if [[ "${{ matrix.python-version }}" == "3.10.8" ]]; then export DISABLE_AUTOPY=1; fi
if [[ "${{ matrix.python-version }}" == "3.11" ]]; then export DISABLE_AUTOPY=1; fi
if [[ "${{ matrix.python-version }}" == "3.12" ]]; then export DISABLE_AUTOPY=1; fi
if [[ "${{ matrix.install_variant }}" != "pip" ]]; then cd packaging && bash packager_docker.sh;
else cd tests && bash coverage_analysis.sh; fi
env:
INSTALL_VARIANT: ${{ matrix.install_variant }}
TESSDATA_PREFIX: /usr/share/tesseract-ocr/4.00/tessdata/
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
Expand Down
66 changes: 43 additions & 23 deletions packaging/packager_deb.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,58 @@ readonly distro="${DISTRO:-ubuntu}"
readonly distro_version="${VERSION:-xenial}"
readonly distro_root="${ROOT:-$HOME}"

# deb dependencies
export DEBIAN_FRONTEND=noninteractive
apt-get update
# python3
apt-get -y install python3 python3-coverage
# python-imaging
apt-get -y install python3-pil
# pip dependencies (for dependencies not available as DEB)
echo "------------- python3 -------------"
apt-get -y install python3 python3-venv
echo "----- pip dependencies (for dependencies not available as DEB) -----"
apt-get -y install gcc libx11-dev libxtst-dev python3-dev libpng-dev python3-pip
echo "----- create a venv to use that as the python env (needed for python 3.12 compatibility specific to Ubuntu) -----"
python3 -m venv docker_venv --system-site-packages
source docker_venv/bin/activate
echo "------------- upgrade pip -------------"
pip3 install --upgrade pip
# contour, template, feature, cascade, text matching
echo "------------ install coverage ------------"
pip3 install coverage

echo "------------- python-imaging -------------"
apt-get -y install python3-pil

echo "------------- contour, template, feature, and cascade matching -------------"
apt-get -y install python3-numpy
if [[ $distro_version == "xenial" ]]; then
export DISABLE_OPENCV=1
else
apt-get -y install python3-opencv
fi
# text matching

echo "------------- text matching -------------"
if [[ $distro_version == "xenial" ]]; then
export DISABLE_OCR=1
else
apt-get -y install tesseract-ocr libtesseract-dev
apt-get -y install g++ pkg-config
pip3 install pytesseract==0.3.4 tesserocr==2.5.1
pip3 install pytesseract==0.3.13 tesserocr==2.7.1
fi

echo "------------- deep learning -------------"
pip3 install torch==2.2.0 torchvision==0.17.0

echo "------------- display controlling -------------"
if [[ -n "$DISABLE_AUTOPY" && "$DISABLE_AUTOPY" == "1" ]]; then
export DISABLE_AUTOPY=1
else
pip3 install autopy
fi
# deep learning
pip3 install torch==1.8.1 torchvision==0.9.1
# screen controlling
pip3 install autopy==4.0.0
# TODO: vncdotool doesn't control its Twisted which doesn't control its "incremental" dependency
pip3 install incremental==22.10.0
pip3 install vncdotool==0.12.0
apt-get -y install xdotool x11-apps imagemagick
apt-get -y install python3-tk scrot
# TODO: install PyScreeze separately to replace the one PyAutoGUI will install which is incompatible with the current Pillow version
pip3 install pyscreeze==0.1.28
pip3 install pyautogui==0.9.53
# NOTE: Must install tkinter here to use MouseInfo
apt-get -y install python3-tk
apt-get -y install gnome-screenshot
pip3 install pyautogui==0.9.54
apt-get -y install x11vnc

# deb packaging and installing of current guibot source
echo "------------- deb packaging and installing of current guibot source -------------"
apt-get -y install dh-make dh-python debhelper python3-all devscripts
NAME=$(sed -n 's/^Package:[ \t]*//p' "$distro_root/guibot/packaging/debian/control")
CHANGELOG_REVS=($(sed -n -e 's/^guibot[ \t]*(\([0-9]*.[0-9]*\)-[0-9]*).*/\1/p' "$distro_root/guibot/packaging/debian/changelog"))
Expand All @@ -56,20 +68,28 @@ cp ../${NAME}_${VERSION}*.deb "$distro_root/guibot"
apt-get -y install "$distro_root/guibot/"${NAME}_${VERSION}*.deb
rm -fr "$distro_root/$NAME-$VERSION"

# virtual display
echo "------------- virtual display -------------"
apt-get -y install xvfb vim-common
export DISPLAY=:99.0
Xvfb :99 -screen 0 1024x768x24 &> /tmp/xvfb.log &
touch /root/.Xauthority
xauth add ${HOST}:99 . $(xxd -l 16 -p /dev/urandom)
sleep 3 # give xvfb some time to start

# unit tests
echo " -------- set tesseract data environment -------- "
export TESSDATA_PREFIX="/usr/share/tesseract-ocr/5/tessdata"
echo "Tesseract data prefix: $TESSDATA_PREFIX"

echo "------------ dump for environment variables and python path ------------"
printenv
python3 -c "import sys; print(sys.prefix)"

echo "------------- unit tests -------------"
apt-get install -y python3-pyqt5
export XDG_RUNTIME_DIR="/tmp/runtime-root"
mkdir /tmp/runtime-root
chmod 0700 /tmp/runtime-root
cd /usr/lib/python3/dist-packages/guibot/tests
LIBPATH=".." COVERAGE="python3-coverage" sh coverage_analysis.sh
LIBPATH=".." COVERAGE="coverage" sh coverage_analysis.sh

exit 0
4 changes: 2 additions & 2 deletions packaging/packager_docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ readonly version=$(echo $install_variant | cut -d '.' -f 3)

if [ "$packager" == "rpm" ]; then
sudo docker run \
-e DISTRO="$distro" -e VERSION="$version" -e ROOT="/" \
-e DISTRO="$distro" -e VERSION="$version" -e ROOT="/" -e DISABLE_AUTOPY="1" \
-v $(pwd)/..:/guibot:rw $distro:$version \
/bin/bash /guibot/packaging/packager_rpm.sh
elif [ "$packager" == "deb" ]; then
sudo docker run \
-e DISTRO="$distro" -e VERSION="$version" -e ROOT="/" \
-e DISTRO="$distro" -e VERSION="$version" -e ROOT="/" -e DISABLE_AUTOPY="1" \
-v $(pwd)/..:/guibot:rw $distro:$version \
/bin/bash /guibot/packaging/packager_deb.sh
fi
59 changes: 35 additions & 24 deletions packaging/packager_rpm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,40 +5,43 @@ readonly distro="${DISTRO:-fedora}"
readonly distro_version="${VERSION:-30}"
readonly distro_root="${ROOT:-$HOME}"

# rpm dependencies
# python3
dnf -y install python3 python3-coverage
# python-imaging
dnf -y update
echo "------------- python3 -------------"
dnf -y install python3 python3-coverage python3-devel
echo "------------- python-imaging -------------"
dnf -y install python3-pillow
# pip dependencies (for dependencies not available as RPM)
echo "------------- pip dependencies (for dependencies not available as RPM) -------------"
dnf -y install gcc libX11-devel libXtst-devel python3-devel libpng-devel python3-pip redhat-rpm-config
echo "------------- upgrade pip -------------"
pip3 install --upgrade pip
# contour, template, feature, cascade, text matching

echo "------------- contour, template, feature, and cascade matching -------------"
dnf -y install python3-numpy python3-opencv
# text matching

echo "------------- text matching -------------"
dnf -y install tesseract tesseract-devel
dnf -y install gcc-c++
pip3 install pytesseract==0.3.4 tesserocr==2.5.1
# deep learning
pip3 install torch==1.8.1 torchvision==0.9.1
# screen controlling
if (( distro_version <= 32 )); then
pip3 install autopy==4.0.0
else
pip3 install pytesseract==0.3.13 tesserocr==2.7.1

echo "------------- deep learning -------------"
dnf -y install python3-torch python3-torch-devel
# TODO: python3-torchvision version available is broken (no module found)
pip3 install torchvision==0.17.0

echo "------------- display controlling -------------"
if [[ -n "$DISABLE_AUTOPY" && "$DISABLE_AUTOPY" == "1" && $distro_version -gt 32 ]]; then
export DISABLE_AUTOPY=1
else
pip3 install autopy
fi
# TODO: vncdotool doesn't control its Twisted which doesn't control its "incremental" dependency
pip3 install incremental==22.10.0
pip3 install vncdotool==0.12.0
dnf -y install xdotool xwd ImageMagick
# NOTE: PyAutoGUI's scrot dependencies are broken on Fedora 33- so we don't support these
dnf -y install python3-tkinter scrot
# TODO: install PyScreeze separately to replace the one PyAutoGUI will install which is incompatible with the current Pillow version
pip3 install pyscreeze==0.1.28
pip3 install pyautogui==0.9.53
# NOTE: No need for installing tkinter here because it's a dependency from torch (it is installed with it)
dnf -y install gnome-screenshot
pip3 install pyautogui==0.9.54
dnf -y install x11vnc

# rpm packaging and installing of current guibot source
echo "------ rpm packaging and installing of current guibot source ------"
dnf -y install rpm-build
NAME=$(sed -n 's/^Name:[ \t]*//p' "$distro_root/guibot/packaging/guibot.spec")
VERSION=$(sed -n 's/^Version:[ \t]*//p' "$distro_root/guibot/packaging/guibot.spec")
Expand All @@ -50,15 +53,23 @@ cp ~/rpmbuild/RPMS/x86_64/python3-$NAME-$VERSION*.rpm "$distro_root/guibot"
dnf -y install "$distro_root/guibot/python3-"$NAME-$VERSION*.rpm
rm -fr "$distro_root/$NAME-$VERSION"

# virtual display
echo "------------- virtual display -------------"
dnf install -y xorg-x11-server-Xvfb vim-common
export DISPLAY=:99.0
Xvfb :99 -screen 0 1024x768x24 &> /tmp/xvfb.log &
touch /root/.Xauthority
xauth add ${HOST}:99 . $(xxd -l 16 -p /dev/urandom)
sleep 3 # give xvfb some time to start

# unit tests
echo " -------- set tesseract data environment variable -------- "
export TESSDATA_PREFIX="/usr/share/tesseract/tessdata/"
echo "Tesseract data prefix: $TESSDATA_PREFIX"

echo "------------ dump for environment variables and python path ------------"
printenv
python3 -c "import sys; print(sys.prefix)"

echo "------------- unit tests -------------"
dnf install -y python3-PyQt5
cd /lib/python3*/site-packages/guibot/tests
if (( distro_version <= 30 )); then
Expand Down
8 changes: 3 additions & 5 deletions packaging/pip_requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,15 @@ Pillow==10.3.0; python_version >= '3.12'
# backends
autopy==4.0.0; python_version <= '3.8' and platform_python_implementation != "PyPy"
# OCR is currently not tested on Windows due to custom Tesseract OCR installers
pytesseract==0.3.4; sys_platform != 'win32'
tesserocr==2.5.1; sys_platform != 'win32'
pytesseract==0.3.13; sys_platform != 'win32'
tesserocr==2.7.1; sys_platform != 'win32'
# TODO: OpenCV and PyTorch don't control their "numpy" dependency
numpy==1.26.4; platform_python_implementation != "PyPy"
opencv-contrib-python==4.5.5.62; platform_python_implementation != "PyPy"
torch==2.2.0; 'generic' not in platform_release and platform_python_implementation != "PyPy"
torchvision==0.17.0 ; 'generic' not in platform_release and platform_python_implementation != "PyPy"
vncdotool==0.12.0; sys_platform != 'win32' and platform_python_implementation != "PyPy"
pyautogui==0.9.53; platform_python_implementation != "PyPy"
# NOTE: These decared version of Pillow has issues with the latest Pyscreeze 0.1.30 thus there is a restrain on Pyscreeze installation
pyscreeze==0.1.28
pyautogui==0.9.54; platform_python_implementation != "PyPy"

# optional proxy guibot interface deps
serpent==1.40
Expand Down
1 change: 1 addition & 0 deletions tests/coverage_analysis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ readonly libpath="${LIBPATH:-../guibot}"
readonly coverage="${COVERAGE:-coverage3}"
readonly submit="${SUBMIT:-0}"

echo "---- running tests with $coverage ----"
$coverage run --source="$libpath" -m unittest discover -v -s ../tests/
# use -i to ignore errors from pythong cache files and other traced dependencies
$coverage report -m -i
Expand Down
5 changes: 5 additions & 0 deletions tests/test_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,11 @@ def test_text_nomatch(self) -> None:
# TODO: deprecate OpenCV 3.X versions after time
if cv2.__version__.startswith("3.") and tdetect == "east":
continue
# TODO: OpenCV version 4.6.0 and above fails here on docker CIs (C++ exception) with tesseract
if ocr == "tesseract":
cv_version = [int(v) for v in cv2.__version__.split(".")]
if cv_version[0] >= 4 and cv_version[1] >= 6:
continue

finder.configure_backend(tdetect, "tdetect")
finder.configure_backend(ocr, "ocr")
Expand Down

0 comments on commit 5d27f79

Please sign in to comment.