Commit 4f4e0fee authored by Adrian DC's avatar Adrian DC
Browse files

fix: resolve #105: support mounting a path twice without overlaps

 * The new 'Volumes' wrapper class prepends a seamless '/.' path
   indirection to input absolute paths to duplicated dict sources
parent 46fa725e
Loading
Loading
Loading
Loading
Loading
+3 −5
Changes for gitlabci_local/engines/docker.py: 3 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -103,17 +103,15 @@ class Docker:
        return self._client.containers.run(
            image, command=command, detach=True, entrypoint=entrypoint,
            environment=variables, network_mode=network, privileged=True, remove=False,
            stdout=True, stderr=True, stream=True, volumes=volumes, working_dir=directory)
            stdout=True, stderr=True, stream=True, volumes=volumes.get(),
            working_dir=directory)

    # Sockets
    def sockets(self, volumes):

        # Add socket volume
        if not Platform.IS_WINDOWS:
            volumes['/var/run/docker.sock'] = { #
                'bind': '/var/run/docker.sock',
                'mode': 'rw'
            }
            volumes.add('/var/run/docker.sock', '/var/run/docker.sock', 'rw')

    # Stop
    def stop(self, container, timeout):
+2 −2
Changes for gitlabci_local/engines/podman.py: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -141,8 +141,8 @@ class Podman:
            args_entrypoint = ['--entrypoint', entrypoint]

        # Adapt mounts
        if isinstance(volumes, dict):
            for volume in volumes.items():
        if volumes and isinstance(volumes.get(), dict):
            for volume in volumes.get().items():
                options = ''
                if volume[1]['mode'] == 'ro':
                    options += ':ro'
+4 −12
Changes for gitlabci_local/runner.py: 4 added lines, 12 removed lines.
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ import time
from .const import Platform
from .engine import Engine
from .main import NAME
from .types import Volumes
from .utils import getPath, nameCheck, resolvePath

# Constants
@@ -112,6 +113,7 @@ def runner(options, job_data, last_result, jobs_status):
    quiet = options.quiet
    result = False
    time_start = time.time()
    volumes = Volumes()

    # Filter when
    if last_result and job_data['when'] not in ['on_success', 'manual', 'always']:
@@ -296,12 +298,7 @@ def runner(options, job_data, last_result, jobs_status):
    scriptFile.file.close()

    # Mount repository folder
    volumes = { #
        pathParent: {
            'bind': pathTargetParent,
            'mode': 'rw'
        }
    }
    volumes.add(pathParent, pathTargetParent, 'rw')

    # Extend mounts
    if options.volume:
@@ -326,13 +323,8 @@ def runner(options, job_data, last_result, jobs_status):
                volume_target = resolvePath(os.path.expandvars(volume))
                volume_mode = 'rw'

            # Clear volume overrides
            for volume in list(volumes.keys()):
                if volume_target == volumes[volume]['bind']:
                    volumes.pop(volume)

            # Append volume mounts
            volumes[volume_host] = {'bind': volume_target, 'mode': volume_mode}
            volumes.add(volume_host, volume_target, volume_mode)

    # Prepare variables
    variables = dict()
+24 −0
Changes for gitlabci_local/types.py: 24 added lines, 0 removed lines.
Original line number Diff line number Diff line
#!/usr/bin/env python3

# Volumes class
class Volumes:

    # Members
    _volumes = None

    # Constructor
    def __init__(self):
        self._volumes = dict()

    # Add
    def add(self, source, target, mode):
        while source in self._volumes:
            source = '/.' + source
        self._volumes[source] = { #
            'bind': target,
            'mode': mode
        }

    # Get
    def get(self):
        return self._volumes
+3 −0
Changes for tests/local/.gitlab-ci.yml: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ stages:
    - deploy
  volumes:
    - .:/opt/src
    - .:/opt/src2
    - ./tests:/opt/src/tests
    - ../:/opt/parent:ro
  workdir: .
@@ -92,6 +93,8 @@ variables:
  script:
    - ls -la /opt/src/
    - ls -la /opt/src/tests/
    - ls -la /opt/src2/
    - ls -la /opt/src2/tests/
    - ls -la /opt/parent/
    - touch /opt/parent/test && exit 1 || true
    - cat /etc/alpine-release