diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..34613ac --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,67 @@ +--- +name: Build and Push Docker Image + +on: # yamllint disable-line rule:truthy + push: + branches: [master, development] + paths: + - .github/workflows/docker.yml + - version.mpralib.txt + - workflow/envs/Dockerfile_mpralib + workflow_dispatch: + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Read mpralib version from version file + id: mpralib_version + run: | + VERSION=$(tr -d '[:space:]' < version.mpralib.txt) + if [[ -z "$VERSION" ]]; then + echo "version.mpralib.txt is empty" + exit 1 + fi + if [[ ! "$VERSION" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + echo "Invalid version format in version.mpralib.txt: $VERSION" + exit 1 + fi + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + + - name: Login to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ vars.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Check if Docker tag already exists + id: tag_exists + run: | + TAG="visze/mpralib:${{ steps.mpralib_version.outputs.version }}" + if docker manifest inspect "$TAG" > /dev/null 2>&1; then + echo "exists=true" >> "$GITHUB_OUTPUT" + echo "Tag already exists on Docker Hub: $TAG" + else + echo "exists=false" >> "$GITHUB_OUTPUT" + echo "Tag does not exist yet: $TAG" + fi + + - name: Set up QEMU + uses: docker/setup-qemu-action@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Build and push Docker image + if: steps.tag_exists.outputs.exists == 'false' + uses: docker/build-push-action@v6 + with: + context: . + file: workflow/envs/Dockerfile_mpralib + push: true + tags: visze/mpralib:${{ steps.mpralib_version.outputs.version }} + build-args: | + MPRALIB_VERSION=${{ steps.mpralib_version.outputs.version }} diff --git a/version.mpralib.txt b/version.mpralib.txt new file mode 100644 index 0000000..9028ec6 --- /dev/null +++ b/version.mpralib.txt @@ -0,0 +1 @@ +0.10.5 diff --git a/workflow/envs/Dockerfile_mpralib b/workflow/envs/Dockerfile_mpralib index cd38080..2ce29b5 100644 --- a/workflow/envs/Dockerfile_mpralib +++ b/workflow/envs/Dockerfile_mpralib @@ -1,3 +1,5 @@ FROM ghcr.io/prefix-dev/pixi:latest -RUN pixi global install "python>=3.10" "mpralib==0.10.4" "htslib" conda -c conda-forge -c bioconda +ARG MPRALIB_VERSION + +RUN pixi global install "python>=3.10" "mpralib==${MPRALIB_VERSION}" "htslib" conda -c conda-forge -c bioconda diff --git a/workflow/envs/mpralib.yaml b/workflow/envs/mpralib.yaml index 93fea37..2f01379 100644 --- a/workflow/envs/mpralib.yaml +++ b/workflow/envs/mpralib.yaml @@ -4,5 +4,5 @@ channels: - bioconda dependencies: - python>=3.10 - - mpralib==0.10.4 + - mpralib==0.10.5 - htslib diff --git a/workflow/rules/common.smk b/workflow/rules/common.smk index 06af92e..61935cf 100644 --- a/workflow/rules/common.smk +++ b/workflow/rules/common.smk @@ -4,6 +4,7 @@ from snakemake.utils import validate SCRIPTS_DIR = "../scripts" ENVS_DIR = "../envs" +MPRALIB_VERSION_FILE = "../../version.mpralib.txt" def getWorkflowFile(dir_name, name): @@ -18,6 +19,19 @@ def getCondaEnv(name): return getWorkflowFile(ENVS_DIR, name) +def getMpralibVersion(): + with open(workflow.source_path(MPRALIB_VERSION_FILE)) as f: + mpralib_version = f.read().strip() + if not mpralib_version: + raise WorkflowError("version.mpralib.txt is empty.") + return mpralib_version + + +MPRALIB_VERSION = getMpralibVersion() +VISZE_MPRALIB_CONTAINER = f"docker://visze/mpralib:{MPRALIB_VERSION}" +QUAY_MPRALIB_CONTAINER = f"docker://quay.io/biocontainers/mpralib:{MPRALIB_VERSION}--pyhdfd78af_0" + + def getLabelFile(): if "label_file" in config: return config["label_file"] diff --git a/workflow/rules/elements.smk b/workflow/rules/elements.smk index f9d9a2c..64a3ff1 100644 --- a/workflow/rules/elements.smk +++ b/workflow/rules/elements.smk @@ -11,7 +11,7 @@ rule get_element_counts: conda: getCondaEnv("mpralib.yaml") container: - "docker://quay.io/biocontainers/mpralib:0.10.4--pyhdfd78af_0" + QUAY_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[0], 75) * 1024, # Adjust memory based on input size @@ -85,7 +85,7 @@ rule get_reporter_elements: conda: getCondaEnv("mpralib.yaml") container: - "docker://quay.io/biocontainers/mpralib:0.10.4--pyhdfd78af_0" + QUAY_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[0], 50) * 1024, # Adjust memory based on input size @@ -116,7 +116,7 @@ rule get_reporter_genomic_elements: conda: getCondaEnv("mpralib.yaml") container: - "docker://visze/mpralib:0.10.4" + VISZE_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[0], 50) * 1024, # Adjust memory based on input size diff --git a/workflow/rules/variants.smk b/workflow/rules/variants.smk index 0dc73f2..54013cb 100644 --- a/workflow/rules/variants.smk +++ b/workflow/rules/variants.smk @@ -11,7 +11,7 @@ rule get_variant_counts: conda: getCondaEnv("mpralib.yaml") container: - "docker://quay.io/biocontainers/mpralib:0.10.4--pyhdfd78af_0" + QUAY_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[0], 75) * 1024, # Adjust memory based on input size @@ -44,7 +44,7 @@ rule get_variant_map: conda: getCondaEnv("mpralib.yaml") container: - "docker://quay.io/biocontainers/mpralib:0.10.4--pyhdfd78af_0" + QUAY_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[0], 10) * 1024, # Adjust memory based on input size @@ -135,7 +135,7 @@ rule get_reporter_variants: conda: getCondaEnv("mpralib.yaml") container: - "docker://quay.io/biocontainers/mpralib:0.10.4--pyhdfd78af_0" + QUAY_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[1], 75) * 1024, # Adjust memory based on input size @@ -168,7 +168,7 @@ rule get_reporter_genomic_variants: conda: getCondaEnv("mpralib.yaml") container: - "docker://visze/mpralib:0.10.4" + VISZE_MPRALIB_CONTAINER threads: 1 resources: mem_mb=lambda wc, input: calc_mem_gb(input[1], 75) * 1024, # Adjust memory based on input size