diff --git a/dvc/repo/reproduce.py b/dvc/repo/reproduce.py index a96f8445e..30365f8c4 100644 --- a/dvc/repo/reproduce.py +++ b/dvc/repo/reproduce.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING, Iterator, List from dvc.exceptions import ReproductionError from dvc.repo.scm_context import scm_context +from dvc.stage.cache import RunCacheNotSupported from . import locked @@ -108,7 +109,10 @@ def reproduce( # noqa: C901, PLR0912 if kwargs.get("pull", False): logger.debug("Pulling run cache") - self.stage_cache.pull(None) + try: + self.stage_cache.pull(None) + except RunCacheNotSupported: + logger.debug("Failed to pull run cache") return _reproduce_stages(self.index.graph, list(stages), **kwargs) diff --git a/tests/func/test_repro_multistage.py b/tests/func/test_repro_multistage.py index 677096a59..9cf8856fd 100644 --- a/tests/func/test_repro_multistage.py +++ b/tests/func/test_repro_multistage.py @@ -9,6 +9,7 @@ from dvc.cli import main from dvc.dvcfile import LOCK_FILE, PROJECT_FILE from dvc.exceptions import CyclicGraphError, ReproductionError from dvc.stage import PipelineStage +from dvc.stage.cache import RunCacheNotSupported from dvc.stage.exceptions import StageNotFound from dvc.utils.fs import remove @@ -481,3 +482,17 @@ def test_repro_allow_missing_and_pull(tmp_dir, dvc, mocker, local_remote): ret = dvc.reproduce(pull=True, allow_missing=True) # create-foo is skipped ; copy-foo pulls missing dep assert len(ret) == 1 + + +def test_repro_pulls_continue_without_run_cache(tmp_dir, dvc, mocker, local_remote): + (foo,) = tmp_dir.dvc_gen("foo", "foo") + + dvc.push() + mocker.patch.object( + dvc.stage_cache, "pull", side_effect=RunCacheNotSupported("foo") + ) + dvc.stage.add(name="copy-foo", cmd="cp foo bar", deps=["foo"], outs=["bar"]) + remove("foo") + remove(foo.outs[0].cache_path) + + assert dvc.reproduce(pull=True)