diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..d19f7a5 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,30 @@ +name: PR + +on: + pull_request: + branches: [ "main", "master" ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + initialise: + runs-on: ubuntu-latest + + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + build_only: + needs: initialise + runs-on: ubuntu-latest + + steps: + - name: Build docker image + uses: docker/build-push-action@v6 + with: + push: false + tags: user/app:latest \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..14c2eb9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: release-CI + +on: + release: + types: [published] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build_and_publish: + runs-on: ubuntu-latest + + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Quay IO + uses: docker/login-action@v3 + with: + registry: quay.io + username: '$oauthtoken' + password: ${{ secrets.QUAY_OAUTH_TOKEN }} + + - name: Build docker image and push to quay.io + uses: docker/build-push-action@v6 + with: + push: true + tags: | + quay.io/bgruening/webatlas:${{ github.event.release.tag_name }} + quay.io/bgruening/webatlas:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dbdfee --- /dev/null +++ b/.gitignore @@ -0,0 +1,171 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# PyPI configuration file +.pypirc \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c148803 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,48 @@ +FROM python:3.10-slim-bookworm AS builder + +ARG BIOFORMATS2RAW="0.7.0" +ARG WEBATLAS_FORK_TAG="0.5.3-galaxy4" + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + wget unzip cmake g++ && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Download and stage bioformats2raw +RUN wget -q -O bioformats2raw.zip https://github.com/glencoesoftware/bioformats2raw/releases/download/v${BIOFORMATS2RAW}/bioformats2raw-${BIOFORMATS2RAW}.zip && \ + unzip bioformats2raw.zip -d /opt/ && \ + rm bioformats2raw.zip + +# Download and stage webatlas scripts +RUN wget -q -O webatlas.tar.gz https://github.com/dannyspadaro/webatlas-pipeline/archive/refs/tags/${WEBATLAS_FORK_TAG}.tar.gz && \ + tar -xf webatlas.tar.gz && \ + mkdir /opt/webatlas-bin && \ + cp -r webatlas-pipeline-${WEBATLAS_FORK_TAG}/bin/* /opt/webatlas-bin/ && \ + chmod +x /opt/webatlas-bin/* && \ + rm -rf webatlas.tar.gz webatlas-pipeline-${WEBATLAS_FORK_TAG} + +COPY requirements.txt /requirements.txt +RUN pip install --upgrade pip "setuptools<81" distlib --no-cache-dir && \ + pip install --no-cache-dir -r /requirements.txt + +# Runtime stage +FROM python:3.10-slim-bookworm + +ARG BIOFORMATS2RAW="0.7.0" + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libblosc1 libvips libtiff-tools openjdk-17-jre-headless procps && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Copy required from builder +COPY --from=builder /opt/bioformats2raw-${BIOFORMATS2RAW} /usr/local/share/bioformats2raw-${BIOFORMATS2RAW} +RUN ln -sf /usr/local/share/bioformats2raw-${BIOFORMATS2RAW}/bin/bioformats2raw /usr/local/bin/bioformats2raw + +COPY --from=builder /opt/webatlas-bin/ /usr/local/bin/ +COPY --from=builder /usr/local/lib/python3.10 /usr/local/lib/python3.10 +COPY --from=builder /usr/local/bin /usr/local/bin + +ENTRYPOINT [] \ No newline at end of file diff --git a/README.md b/README.md index d75be18..080ff20 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # docker-webatlas Docker image for Galaxy WebAtlas toolsuite + +There are some minor changes that are required for Galaxy included in @dannyspadaro's fork: https://github.com/haniffalab/webatlas-pipeline/compare/main...dannyspadaro:webatlas-pipeline:update_dependencies \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e914951 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +pillow==12.0.0 +xmlschema==4.3.1 +scipy==1.15.3 +fire==0.7.1 +regex==2026.2.28 +scikit-image==0.25.2 +tifffile==2025.5.10 +numpy==2.2.6 +pandas==2.3.3 +pyvips==3.1.1 +scanpy==1.11.5 +ome-zarr==0.10.2 +anndata==0.11.4 +zarr==2.16.1 +h5py==3.16.0 +rioxarray==0.19.0 +spatialdata==0.5.0 +vitessce==3.8.2 \ No newline at end of file