Configure Docker build with SSH authentication for private repos
Browse files- Update Dockerfile to use SSH forwarding for private dependencies (paladin, Mussel)
- Add build.sh script to handle SSH agent setup for local builds
- Update pyproject.toml to use SSH URLs for private repos
- Configure GitHub Actions workflow for SSH-based Docker builds
- Add SSH agent setup with webfactory/ssh-agent action
- Configure dual registry support (GHCR + Docker Hub)
- Push to GHCR on all branches, Docker Hub only on main
- Update Makefile to use mskmind/mosaic as default image name
- Add CI/CD documentation to CONTRIBUTING.md
- Add github_token to .gitignore
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- .github/workflows/docker.yml +58 -15
- .gitignore +4 -0
- CONTRIBUTING.md +50 -0
- Dockerfile +17 -17
- Makefile +11 -5
- build.sh +15 -0
- pyproject.toml +1 -1
- uv.lock +8 -8
.github/workflows/docker.yml
CHANGED
|
@@ -10,8 +10,10 @@ on:
|
|
| 10 |
workflow_dispatch:
|
| 11 |
|
| 12 |
env:
|
| 13 |
-
|
|
|
|
| 14 |
IMAGE_NAME: ${{ github.repository }}
|
|
|
|
| 15 |
|
| 16 |
jobs:
|
| 17 |
build:
|
|
@@ -33,19 +35,27 @@ jobs:
|
|
| 33 |
- name: Set up Docker Buildx
|
| 34 |
uses: docker/setup-buildx-action@v3
|
| 35 |
|
| 36 |
-
- name: Log in to Container Registry
|
| 37 |
if: github.event_name != 'pull_request'
|
| 38 |
uses: docker/login-action@v3
|
| 39 |
with:
|
| 40 |
-
registry: ${{ env.
|
| 41 |
username: ${{ github.actor }}
|
| 42 |
password: ${{ secrets.GITHUB_TOKEN }}
|
| 43 |
|
| 44 |
-
- name:
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
uses: docker/metadata-action@v5
|
| 47 |
with:
|
| 48 |
-
images: ${{ env.
|
| 49 |
tags: |
|
| 50 |
type=ref,event=branch
|
| 51 |
type=ref,event=pr
|
|
@@ -53,27 +63,60 @@ jobs:
|
|
| 53 |
type=semver,pattern={{major}}.{{minor}}
|
| 54 |
type=sha,prefix={{branch}}-
|
| 55 |
|
| 56 |
-
- name:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
uses: docker/build-push-action@v5
|
| 58 |
with:
|
| 59 |
context: .
|
| 60 |
push: ${{ github.event_name != 'pull_request' }}
|
| 61 |
-
tags: ${{ steps.meta.outputs.tags }}
|
| 62 |
-
labels: ${{ steps.meta.outputs.labels }}
|
| 63 |
-
ssh: default
|
| 64 |
cache-from: type=gha
|
| 65 |
cache-to: type=gha,mode=max
|
| 66 |
-
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
- name: Docker Summary
|
| 70 |
run: |
|
| 71 |
echo "## Docker Build :whale:" >> $GITHUB_STEP_SUMMARY
|
| 72 |
echo "" >> $GITHUB_STEP_SUMMARY
|
| 73 |
-
echo "
|
|
|
|
| 74 |
echo "Image: ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
|
| 75 |
echo "" >> $GITHUB_STEP_SUMMARY
|
| 76 |
-
echo "
|
| 77 |
echo '```' >> $GITHUB_STEP_SUMMARY
|
| 78 |
-
echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
| 79 |
echo '```' >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
workflow_dispatch:
|
| 11 |
|
| 12 |
env:
|
| 13 |
+
GHCR_REGISTRY: ghcr.io
|
| 14 |
+
DOCKER_REGISTRY: docker.io
|
| 15 |
IMAGE_NAME: ${{ github.repository }}
|
| 16 |
+
DOCKER_HUB_IMAGE: mskmind/mosaic
|
| 17 |
|
| 18 |
jobs:
|
| 19 |
build:
|
|
|
|
| 35 |
- name: Set up Docker Buildx
|
| 36 |
uses: docker/setup-buildx-action@v3
|
| 37 |
|
| 38 |
+
- name: Log in to GitHub Container Registry
|
| 39 |
if: github.event_name != 'pull_request'
|
| 40 |
uses: docker/login-action@v3
|
| 41 |
with:
|
| 42 |
+
registry: ${{ env.GHCR_REGISTRY }}
|
| 43 |
username: ${{ github.actor }}
|
| 44 |
password: ${{ secrets.GITHUB_TOKEN }}
|
| 45 |
|
| 46 |
+
- name: Log in to Docker Hub
|
| 47 |
+
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
|
| 48 |
+
uses: docker/login-action@v3
|
| 49 |
+
with:
|
| 50 |
+
registry: ${{ env.DOCKER_REGISTRY }}
|
| 51 |
+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
| 52 |
+
password: ${{ secrets.DOCKER_HUB_TOKEN }}
|
| 53 |
+
|
| 54 |
+
- name: Extract metadata for GHCR
|
| 55 |
+
id: meta-ghcr
|
| 56 |
uses: docker/metadata-action@v5
|
| 57 |
with:
|
| 58 |
+
images: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
|
| 59 |
tags: |
|
| 60 |
type=ref,event=branch
|
| 61 |
type=ref,event=pr
|
|
|
|
| 63 |
type=semver,pattern={{major}}.{{minor}}
|
| 64 |
type=sha,prefix={{branch}}-
|
| 65 |
|
| 66 |
+
- name: Extract metadata for Docker Hub
|
| 67 |
+
id: meta-dockerhub
|
| 68 |
+
if: github.ref == 'refs/heads/main'
|
| 69 |
+
uses: docker/metadata-action@v5
|
| 70 |
+
with:
|
| 71 |
+
images: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_HUB_IMAGE }}
|
| 72 |
+
tags: |
|
| 73 |
+
type=raw,value=latest
|
| 74 |
+
type=semver,pattern={{version}}
|
| 75 |
+
type=semver,pattern={{major}}.{{minor}}
|
| 76 |
+
type=sha
|
| 77 |
+
|
| 78 |
+
- name: Build and push to GHCR
|
| 79 |
uses: docker/build-push-action@v5
|
| 80 |
with:
|
| 81 |
context: .
|
| 82 |
push: ${{ github.event_name != 'pull_request' }}
|
| 83 |
+
tags: ${{ steps.meta-ghcr.outputs.tags }}
|
| 84 |
+
labels: ${{ steps.meta-ghcr.outputs.labels }}
|
| 85 |
+
ssh: default=${{ env.SSH_AUTH_SOCK }}
|
| 86 |
cache-from: type=gha
|
| 87 |
cache-to: type=gha,mode=max
|
| 88 |
+
|
| 89 |
+
- name: Build and push to Docker Hub
|
| 90 |
+
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
|
| 91 |
+
uses: docker/build-push-action@v5
|
| 92 |
+
with:
|
| 93 |
+
context: .
|
| 94 |
+
push: true
|
| 95 |
+
tags: ${{ steps.meta-dockerhub.outputs.tags }}
|
| 96 |
+
labels: ${{ steps.meta-dockerhub.outputs.labels }}
|
| 97 |
+
ssh: default=${{ env.SSH_AUTH_SOCK }}
|
| 98 |
+
cache-from: type=gha
|
| 99 |
|
| 100 |
- name: Docker Summary
|
| 101 |
run: |
|
| 102 |
echo "## Docker Build :whale:" >> $GITHUB_STEP_SUMMARY
|
| 103 |
echo "" >> $GITHUB_STEP_SUMMARY
|
| 104 |
+
echo "### GitHub Container Registry" >> $GITHUB_STEP_SUMMARY
|
| 105 |
+
echo "Registry: ${{ env.GHCR_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
| 106 |
echo "Image: ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
|
| 107 |
echo "" >> $GITHUB_STEP_SUMMARY
|
| 108 |
+
echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
|
| 109 |
echo '```' >> $GITHUB_STEP_SUMMARY
|
| 110 |
+
echo "${{ steps.meta-ghcr.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
| 111 |
echo '```' >> $GITHUB_STEP_SUMMARY
|
| 112 |
+
if [ "${{ github.ref }}" == "refs/heads/main" ]; then
|
| 113 |
+
echo "" >> $GITHUB_STEP_SUMMARY
|
| 114 |
+
echo "### Docker Hub" >> $GITHUB_STEP_SUMMARY
|
| 115 |
+
echo "Registry: ${{ env.DOCKER_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
| 116 |
+
echo "Image: ${{ env.DOCKER_HUB_IMAGE }}" >> $GITHUB_STEP_SUMMARY
|
| 117 |
+
echo "" >> $GITHUB_STEP_SUMMARY
|
| 118 |
+
echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
|
| 119 |
+
echo '```' >> $GITHUB_STEP_SUMMARY
|
| 120 |
+
echo "${{ steps.meta-dockerhub.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
| 121 |
+
echo '```' >> $GITHUB_STEP_SUMMARY
|
| 122 |
+
fi
|
.gitignore
CHANGED
|
@@ -19,3 +19,7 @@ flagged/
|
|
| 19 |
gradio_cached_examples/
|
| 20 |
*.svs
|
| 21 |
*.png
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
gradio_cached_examples/
|
| 20 |
*.svs
|
| 21 |
*.png
|
| 22 |
+
|
| 23 |
+
# GitHub tokens and secrets
|
| 24 |
+
github_token
|
| 25 |
+
*_token
|
CONTRIBUTING.md
CHANGED
|
@@ -256,6 +256,56 @@ When adding new features:
|
|
| 256 |
- Ensure dependencies are compatible with the project's license
|
| 257 |
- Pin dependency versions in `pyproject.toml`
|
| 258 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
## Questions?
|
| 260 |
|
| 261 |
If you have questions about contributing, please:
|
|
|
|
| 256 |
- Ensure dependencies are compatible with the project's license
|
| 257 |
- Pin dependency versions in `pyproject.toml`
|
| 258 |
|
| 259 |
+
## GitHub Actions CI/CD
|
| 260 |
+
|
| 261 |
+
### Required Repository Secrets
|
| 262 |
+
|
| 263 |
+
For the Docker build workflow to work properly in GitHub Actions, the following secrets must be configured in your repository settings (Settings → Secrets and variables → Actions):
|
| 264 |
+
|
| 265 |
+
1. **`SSH_PRIVATE_KEY`** (Required)
|
| 266 |
+
- Your SSH private key that has access to the private repositories (paladin and Mussel)
|
| 267 |
+
- Generate with: `ssh-keygen -t ed25519 -C "github-actions@mosaic"`
|
| 268 |
+
- Add the public key to your GitHub account with repo access
|
| 269 |
+
- Add the private key to GitHub secrets
|
| 270 |
+
|
| 271 |
+
2. **`DOCKER_HUB_USERNAME`** (Optional - only needed for Docker Hub pushes)
|
| 272 |
+
- Your Docker Hub username
|
| 273 |
+
- Required only if you want to push images to Docker Hub (on main branch)
|
| 274 |
+
|
| 275 |
+
3. **`DOCKER_HUB_TOKEN`** (Optional - only needed for Docker Hub pushes)
|
| 276 |
+
- Your Docker Hub access token
|
| 277 |
+
- Generate at: https://hub.docker.com/settings/security
|
| 278 |
+
- Required only if you want to push images to Docker Hub (on main branch)
|
| 279 |
+
|
| 280 |
+
### CI/CD Workflows
|
| 281 |
+
|
| 282 |
+
The project includes several GitHub Actions workflows:
|
| 283 |
+
|
| 284 |
+
- **`tests.yml`** - Runs pytest test suite on every push/PR
|
| 285 |
+
- **`code-quality.yml`** - Runs black and pylint checks
|
| 286 |
+
- **`docker.yml`** - Builds and pushes Docker images:
|
| 287 |
+
- Builds on every push to main/dev branches and PRs
|
| 288 |
+
- Pushes to GitHub Container Registry (ghcr.io) for all branches
|
| 289 |
+
- Pushes to Docker Hub (docker.io/mskmind/mosaic) only on main branch
|
| 290 |
+
|
| 291 |
+
### Docker Build Process
|
| 292 |
+
|
| 293 |
+
The Docker build uses SSH forwarding to access private dependencies:
|
| 294 |
+
|
| 295 |
+
```bash
|
| 296 |
+
# Local build (using build.sh)
|
| 297 |
+
./build.sh
|
| 298 |
+
|
| 299 |
+
# Or using Make
|
| 300 |
+
make docker-build
|
| 301 |
+
```
|
| 302 |
+
|
| 303 |
+
The GitHub Actions workflow automatically:
|
| 304 |
+
1. Sets up SSH agent with the private key
|
| 305 |
+
2. Configures Docker Buildx with SSH forwarding
|
| 306 |
+
3. Builds the image with access to private repositories
|
| 307 |
+
4. Pushes to GHCR and optionally Docker Hub
|
| 308 |
+
|
| 309 |
## Questions?
|
| 310 |
|
| 311 |
If you have questions about contributing, please:
|
Dockerfile
CHANGED
|
@@ -4,35 +4,35 @@ FROM python:3.10-slim AS env-builder
|
|
| 4 |
RUN apt-get update && apt-get install -y \
|
| 5 |
build-essential \
|
| 6 |
curl \
|
| 7 |
-
git
|
| 8 |
-
|
| 9 |
&& rm -rf /var/lib/apt/lists/*
|
| 10 |
|
| 11 |
# Install uv
|
| 12 |
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
| 13 |
|
| 14 |
-
#
|
| 15 |
-
|
| 16 |
-
RUN --mount=type=secret,id=github_token \
|
| 17 |
-
export GITHUB_TOKEN=$(cat /run/secrets/github_token) && \
|
| 18 |
-
git clone --branch dev https://oauth2:$GITHUB_TOKEN@github.com/pathology-data-mining/paladin.git
|
| 19 |
-
|
| 20 |
-
# Create non-root user for runtime
|
| 21 |
-
RUN useradd -m -u 1000 user
|
| 22 |
-
RUN chown -R user:user /deps
|
| 23 |
|
| 24 |
WORKDIR /app
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
USER user
|
| 28 |
-
COPY --chown=user pyproject.toml README.md ./
|
| 29 |
-
COPY --chown=user src/ ./src/
|
| 30 |
|
| 31 |
-
RUN uv sync
|
| 32 |
ENV PATH="/app/.venv/bin:$PATH"
|
| 33 |
|
| 34 |
EXPOSE 7877
|
| 35 |
|
| 36 |
-
# HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
|
| 37 |
-
|
| 38 |
ENTRYPOINT ["gradio_app"]
|
|
|
|
| 4 |
RUN apt-get update && apt-get install -y \
|
| 5 |
build-essential \
|
| 6 |
curl \
|
| 7 |
+
git \
|
| 8 |
+
openssh-client \
|
| 9 |
&& rm -rf /var/lib/apt/lists/*
|
| 10 |
|
| 11 |
# Install uv
|
| 12 |
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
| 13 |
|
| 14 |
+
# Setup SSH for git (as root)
|
| 15 |
+
RUN mkdir -p /root/.ssh && ssh-keyscan github.com >> /root/.ssh/known_hosts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
WORKDIR /app
|
| 18 |
+
|
| 19 |
+
# Copy project files
|
| 20 |
+
COPY pyproject.toml README.md ./
|
| 21 |
+
COPY src/ ./src/
|
| 22 |
+
|
| 23 |
+
# Create venv and install with dependencies (as root, before switching users)
|
| 24 |
+
RUN --mount=type=ssh \
|
| 25 |
+
uv venv && \
|
| 26 |
+
uv pip install -e .
|
| 27 |
+
|
| 28 |
+
# Create non-root user for runtime
|
| 29 |
+
RUN useradd -m -u 1000 user && \
|
| 30 |
+
chown -R user:user /app
|
| 31 |
|
| 32 |
USER user
|
|
|
|
|
|
|
| 33 |
|
|
|
|
| 34 |
ENV PATH="/app/.venv/bin:$PATH"
|
| 35 |
|
| 36 |
EXPOSE 7877
|
| 37 |
|
|
|
|
|
|
|
| 38 |
ENTRYPOINT ["gradio_app"]
|
Makefile
CHANGED
|
@@ -4,9 +4,9 @@
|
|
| 4 |
.DEFAULT_GOAL := help
|
| 5 |
|
| 6 |
# Variables
|
| 7 |
-
DOCKER_IMAGE_NAME := mosaic
|
| 8 |
DOCKER_TAG := latest
|
| 9 |
-
DOCKER_REGISTRY :=
|
| 10 |
PYTHON := uv run python
|
| 11 |
PYTEST := uv run pytest
|
| 12 |
BLACK := uv run black
|
|
@@ -83,11 +83,17 @@ run-batch: ## Run batch analysis from CSV (usage: make run-batch CSV=settings.cs
|
|
| 83 |
|
| 84 |
##@ Docker
|
| 85 |
|
| 86 |
-
docker-build: ## Build Docker image
|
| 87 |
-
|
|
|
|
| 88 |
|
| 89 |
docker-build-no-cache: ## Build Docker image without cache
|
| 90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
docker-run: ## Run Docker container (web UI mode)
|
| 93 |
docker run -it --rm \
|
|
|
|
| 4 |
.DEFAULT_GOAL := help
|
| 5 |
|
| 6 |
# Variables
|
| 7 |
+
DOCKER_IMAGE_NAME := mskmind/mosaic
|
| 8 |
DOCKER_TAG := latest
|
| 9 |
+
DOCKER_REGISTRY := docker.io
|
| 10 |
PYTHON := uv run python
|
| 11 |
PYTEST := uv run pytest
|
| 12 |
BLACK := uv run black
|
|
|
|
| 83 |
|
| 84 |
##@ Docker
|
| 85 |
|
| 86 |
+
docker-build: ## Build Docker image with SSH forwarding
|
| 87 |
+
@echo "Building Docker image with SSH authentication..."
|
| 88 |
+
@./build.sh
|
| 89 |
|
| 90 |
docker-build-no-cache: ## Build Docker image without cache
|
| 91 |
+
@echo "Building Docker image with SSH authentication (no cache)..."
|
| 92 |
+
@eval "$$(ssh-agent -s)" && \
|
| 93 |
+
ssh-add ~/.ssh/id_ed25519 && \
|
| 94 |
+
export DOCKER_BUILDKIT=1 && \
|
| 95 |
+
docker build --no-cache --ssh default=$$SSH_AUTH_SOCK -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) . && \
|
| 96 |
+
eval "$$(ssh-agent -k)"
|
| 97 |
|
| 98 |
docker-run: ## Run Docker container (web UI mode)
|
| 99 |
docker run -it --rm \
|
build.sh
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
set -e
|
| 3 |
+
|
| 4 |
+
# Start SSH agent and add key
|
| 5 |
+
eval "$(ssh-agent -s)"
|
| 6 |
+
ssh-add ~/.ssh/id_ed25519
|
| 7 |
+
|
| 8 |
+
# Enable BuildKit
|
| 9 |
+
export DOCKER_BUILDKIT=1
|
| 10 |
+
|
| 11 |
+
# Build with SSH forwarding
|
| 12 |
+
docker build --ssh default=$SSH_AUTH_SOCK -t mskmind/mosaic:latest .
|
| 13 |
+
|
| 14 |
+
# Kill SSH agent
|
| 15 |
+
eval "$(ssh-agent -k)"
|
pyproject.toml
CHANGED
|
@@ -43,7 +43,7 @@ disable = [
|
|
| 43 |
|
| 44 |
[tool.uv.sources]
|
| 45 |
paladin = { git = "ssh://git@github.com/pathology-data-mining/paladin.git", rev = "dev" }
|
| 46 |
-
mussel = { git = "
|
| 47 |
|
| 48 |
[tool.pytest.ini_options]
|
| 49 |
testpaths = ["tests"]
|
|
|
|
| 43 |
|
| 44 |
[tool.uv.sources]
|
| 45 |
paladin = { git = "ssh://git@github.com/pathology-data-mining/paladin.git", rev = "dev" }
|
| 46 |
+
mussel = { git = "ssh://git@github.com/pathology-data-mining/Mussel.git", rev = "mosaic-dev" }
|
| 47 |
|
| 48 |
[tool.pytest.ini_options]
|
| 49 |
testpaths = ["tests"]
|
uv.lock
CHANGED
|
@@ -1803,7 +1803,7 @@ requires-dist = [
|
|
| 1803 |
{ name = "lightning", specifier = ">=2.6.0" },
|
| 1804 |
{ name = "loguru", specifier = ">=0.7.3" },
|
| 1805 |
{ name = "memory-profiler", specifier = ">=0.61.0" },
|
| 1806 |
-
{ name = "mussel", extras = ["torch-gpu"], git = "
|
| 1807 |
{ name = "paladin", git = "ssh://git@github.com/pathology-data-mining/paladin.git?rev=dev" },
|
| 1808 |
{ name = "seaborn", specifier = ">=0.13.2" },
|
| 1809 |
{ name = "spaces", specifier = ">=0.30.0" },
|
|
@@ -1879,7 +1879,7 @@ wheels = [
|
|
| 1879 |
[[package]]
|
| 1880 |
name = "mussel"
|
| 1881 |
version = "1.1.1"
|
| 1882 |
-
source = { git = "
|
| 1883 |
dependencies = [
|
| 1884 |
{ name = "configargparse" },
|
| 1885 |
{ name = "einops" },
|
|
@@ -2082,7 +2082,7 @@ name = "nvidia-cudnn-cu12"
|
|
| 2082 |
version = "9.1.0.70"
|
| 2083 |
source = { registry = "https://pypi.org/simple" }
|
| 2084 |
dependencies = [
|
| 2085 |
-
{ name = "nvidia-cublas-cu12", marker = "
|
| 2086 |
]
|
| 2087 |
wheels = [
|
| 2088 |
{ url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
|
|
@@ -2109,9 +2109,9 @@ name = "nvidia-cusolver-cu12"
|
|
| 2109 |
version = "11.4.5.107"
|
| 2110 |
source = { registry = "https://pypi.org/simple" }
|
| 2111 |
dependencies = [
|
| 2112 |
-
{ name = "nvidia-cublas-cu12", marker = "
|
| 2113 |
-
{ name = "nvidia-cusparse-cu12", marker = "
|
| 2114 |
-
{ name = "nvidia-nvjitlink-cu12", marker = "
|
| 2115 |
]
|
| 2116 |
wheels = [
|
| 2117 |
{ url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928, upload-time = "2023-04-19T15:51:25.781Z" },
|
|
@@ -2122,7 +2122,7 @@ name = "nvidia-cusparse-cu12"
|
|
| 2122 |
version = "12.1.0.106"
|
| 2123 |
source = { registry = "https://pypi.org/simple" }
|
| 2124 |
dependencies = [
|
| 2125 |
-
{ name = "nvidia-nvjitlink-cu12", marker = "
|
| 2126 |
]
|
| 2127 |
wheels = [
|
| 2128 |
{ url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278, upload-time = "2023-04-19T15:51:49.939Z" },
|
|
@@ -3833,7 +3833,7 @@ name = "triton"
|
|
| 3833 |
version = "3.1.0"
|
| 3834 |
source = { registry = "https://pypi.org/simple" }
|
| 3835 |
dependencies = [
|
| 3836 |
-
{ name = "filelock", marker = "
|
| 3837 |
]
|
| 3838 |
wheels = [
|
| 3839 |
{ url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },
|
|
|
|
| 1803 |
{ name = "lightning", specifier = ">=2.6.0" },
|
| 1804 |
{ name = "loguru", specifier = ">=0.7.3" },
|
| 1805 |
{ name = "memory-profiler", specifier = ">=0.61.0" },
|
| 1806 |
+
{ name = "mussel", extras = ["torch-gpu"], git = "ssh://git@github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev" },
|
| 1807 |
{ name = "paladin", git = "ssh://git@github.com/pathology-data-mining/paladin.git?rev=dev" },
|
| 1808 |
{ name = "seaborn", specifier = ">=0.13.2" },
|
| 1809 |
{ name = "spaces", specifier = ">=0.30.0" },
|
|
|
|
| 1879 |
[[package]]
|
| 1880 |
name = "mussel"
|
| 1881 |
version = "1.1.1"
|
| 1882 |
+
source = { git = "ssh://git@github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev#c848d4dc07845198cff79e9ddc0b261976846095" }
|
| 1883 |
dependencies = [
|
| 1884 |
{ name = "configargparse" },
|
| 1885 |
{ name = "einops" },
|
|
|
|
| 2082 |
version = "9.1.0.70"
|
| 2083 |
source = { registry = "https://pypi.org/simple" }
|
| 2084 |
dependencies = [
|
| 2085 |
+
{ name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 2086 |
]
|
| 2087 |
wheels = [
|
| 2088 |
{ url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
|
|
|
|
| 2109 |
version = "11.4.5.107"
|
| 2110 |
source = { registry = "https://pypi.org/simple" }
|
| 2111 |
dependencies = [
|
| 2112 |
+
{ name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 2113 |
+
{ name = "nvidia-cusparse-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 2114 |
+
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 2115 |
]
|
| 2116 |
wheels = [
|
| 2117 |
{ url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928, upload-time = "2023-04-19T15:51:25.781Z" },
|
|
|
|
| 2122 |
version = "12.1.0.106"
|
| 2123 |
source = { registry = "https://pypi.org/simple" }
|
| 2124 |
dependencies = [
|
| 2125 |
+
{ name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 2126 |
]
|
| 2127 |
wheels = [
|
| 2128 |
{ url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278, upload-time = "2023-04-19T15:51:49.939Z" },
|
|
|
|
| 3833 |
version = "3.1.0"
|
| 3834 |
source = { registry = "https://pypi.org/simple" }
|
| 3835 |
dependencies = [
|
| 3836 |
+
{ name = "filelock", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
|
| 3837 |
]
|
| 3838 |
wheels = [
|
| 3839 |
{ url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },
|