Note that alpine is now available for arm #529
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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.10" | |
- os: ubuntu-22.04 | |
python: "3.11" | |
- os: ubuntu-22.04 | |
python: "3.10" | |
tesseract5: true | |
- os: ubuntu-latest | |
python: "3.12" | |
tesseract5: true | |
- os: ubuntu-latest | |
python: "pypy3.10" | |
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@v5 | |
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@v4 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
files: ./coverage.xml | |
env_vars: OS,PYTHON | |
test_macos: | |
name: Test macOS | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [macos-latest, macos-13] # macos-latest is arm64, macos-13 is x86_64 | |
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@v5 | |
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@v4 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
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@v5 | |
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 --version 9.56.1 | |
- 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@v4 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
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@v5 | |
name: Setup Python | |
with: | |
python-version: "3.10" | |
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@v4 | |
with: | |
name: artifact | |
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@v4 | |
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@v4 | |
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 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,linux/arm64 \ | |
--tag "${DOCKER_REPOSITORY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}" \ | |
--file .docker/Dockerfile.alpine . |