# SPDX-FileCopyrightText: 2022 James R. Barlow # SPDX-License-Identifier: MPL-2.0 name: Test and deploy on: push: branches: - main - ci - release/* - feature/* tags: - v* paths-ignore: - README* pull_request: jobs: test_linux: name: Test ${{ matrix.os }} with Python ${{ matrix.python }} runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-22.04 python: "3.9" - os: ubuntu-22.04 python: "3.10" - os: ubuntu-22.04 python: "3.11" - os: ubuntu-22.04 python: "3.9" tesseract5: true - os: ubuntu-latest python: "3.12" tesseract5: true #- os: ubuntu-latest # python: "pypy3.9" env: OS: ${{ matrix.os }} PYTHON: ${{ matrix.python }} steps: - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - uses: actions/setup-python@v4 name: Setup Python with: python-version: ${{ matrix.python }} cache: "pip" - name: Install Tesseract 5 if: matrix.tesseract5 run: | sudo add-apt-repository -y ppa:alex-p/tesseract-ocr-devel - name: Install common packages run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ curl \ ghostscript \ img2pdf \ libexempi8 \ libffi-dev \ libsm6 libxext6 libxrender-dev \ pngquant \ poppler-utils \ tesseract-ocr \ tesseract-ocr-deu \ tesseract-ocr-eng \ tesseract-ocr-osd \ unpaper \ zlib1g - name: Install Ubuntu packages for PyPy if: startsWith(matrix.python, 'pypy') run: | sudo apt-get install -y --no-install-recommends \ libxml2-dev \ libxslt1-dev \ pypy3-dev - name: Install Python packages run: | python -m pip install --upgrade pip wheel python -m pip install --prefer-binary .[test] - name: Report versions run: | tesseract --version gs --version pngquant --version unpaper --version img2pdf --version - name: Test run: | python -m pytest --cov-report xml --cov=ocrmypdf --cov=tests/ -n0 tests/ - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: ./coverage.xml env_vars: OS,PYTHON test_macos: name: Test macOS runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest] python: ["3.10", "3.11", "3.12"] env: OS: ${{ matrix.os }} PYTHON: ${{ matrix.python }} steps: - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - name: Install Homebrew deps continue-on-error: true run: | brew update brew install \ exempi \ ghostscript \ jbig2enc \ openjpeg \ pngquant \ tesseract - uses: actions/setup-python@v4 name: Setup Python with: python-version: ${{ matrix.python }} cache: "pip" - name: Install Python packages run: | python -m pip install --upgrade pip wheel python -m pip install --prefer-binary .[test] - name: Report versions run: | tesseract --version gs --version pngquant --version img2pdf --version - name: Test run: | python -m pytest --cov-report xml --cov=ocrmypdf --cov=tests/ -n0 tests/ - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: ./coverage.xml env_vars: OS,PYTHON test_windows: name: Test Windows runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest] python: ["3.10", "3.11", "3.12"] env: OS: ${{ matrix.os }} PYTHON: ${{ matrix.python }} steps: - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - uses: actions/setup-python@v4 name: Setup Python with: python-version: ${{ matrix.python }} cache: "pip" - name: Install system packages run: | choco install --yes --no-progress --pre tesseract choco install --yes --no-progress --ignore-checksums ghostscript - name: Install Python packages run: | python -m pip install --upgrade pip wheel python -m pip install --prefer-binary .[test] - name: Test run: | python -m pytest --cov-report xml --cov=ocrmypdf --cov=tests/ -n0 tests/ - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: ./coverage.xml env_vars: OS,PYTHON wheel_sdist_linux: name: Build sdist and wheels runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - uses: actions/setup-python@v4 name: Setup Python with: python-version: "3.9" cache: "pip" - name: Make wheels and sdist run: | python -m pip install --upgrade pip wheel build python -m build --sdist --wheel - uses: actions/upload-artifact@v3 with: path: | ./dist/*.whl ./dist/*.tar.gz upload_pypi: name: Deploy artifacts to PyPI needs: [wheel_sdist_linux, test_linux, test_macos, test_windows] runs-on: ubuntu-latest environment: release permissions: id-token: write # mandatory for PyPI publishing if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v3 with: name: artifact path: dist - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 create_release: name: Create GitHub release needs: [wheel_sdist_linux, test_linux, test_macos, test_windows] runs-on: ubuntu-latest if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') permissions: # Required to create a release contents: write steps: - uses: actions/download-artifact@v3 with: name: artifact path: dist - name: Create Release id: create-release uses: shogo82148/actions-create-release@v1 - name: Upload Assets uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ steps.create-release.outputs.upload_url }} asset_path: | ./dist/*.whl ./dist/*.tar.gz docker_ubuntu: name: Build Ubuntu-based Docker image needs: [wheel_sdist_linux, test_linux, test_macos, test_windows] runs-on: ubuntu-latest if: github.event_name != 'pull_request' steps: - name: Set image tag to release or branch run: echo "DOCKER_IMAGE_TAG=${GITHUB_REF##*/}" >> $GITHUB_ENV - name: If main, set to latest run: echo 'DOCKER_IMAGE_TAG=latest' >> $GITHUB_ENV if: env.DOCKER_IMAGE_TAG == 'main' - name: Set Docker Hub repository to username run: echo "DOCKER_REPOSITORY=jbarlow83" >> $GITHUB_ENV - name: Set image name run: echo "DOCKER_IMAGE_NAME=ocrmypdf" >> $GITHUB_ENV - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - name: Login to Docker Hub uses: docker/login-action@v3 with: username: jbarlow83 password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3 - name: Print image tag run: echo "Building image ${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}" - name: Build run: | docker buildx build \ --push \ --platform linux/arm64/v8,linux/amd64 \ --tag "${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}" \ --tag "${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}-ubuntu:${DOCKER_IMAGE_TAG}" \ --file .docker/Dockerfile . docker_alpine: name: Build Alpine-based Docker images needs: [wheel_sdist_linux, test_linux, test_macos, test_windows] runs-on: ubuntu-latest if: github.event_name != 'pull_request' steps: - name: Set image tag to release or branch run: echo "DOCKER_IMAGE_TAG=${GITHUB_REF##*/}" >> $GITHUB_ENV - name: If main, set to latest run: echo 'DOCKER_IMAGE_TAG=latest' >> $GITHUB_ENV if: env.DOCKER_IMAGE_TAG == 'main' - name: Set Docker Hub repository to username run: echo "DOCKER_REPOSITORY=jbarlow83" >> $GITHUB_ENV - name: Set image name run: echo "DOCKER_IMAGE_NAME=ocrmypdf-alpine" >> $GITHUB_ENV - uses: actions/checkout@v4 with: fetch-depth: "0" # 0=all, needed for setuptools-scm to resolve version tags - name: Login to Docker Hub uses: docker/login-action@v3 with: username: jbarlow83 password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v3 - name: Print image tag run: echo "Building image ${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}" - name: Build run: | docker buildx build \ --push \ --platform linux/amd64 \ --tag "${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}" \ --file .docker/Dockerfile.alpine .