LINUX.ORG.RU

Странный глюк с кэшем докера

 ,


0

1

Имею такой вот .gitlab-ci.yml:

stages:
  - dependencies
  - build

dependencies:
  stage: dependencies
  image: node:20.11-alpine
  tags:
    - mydocker
  only:
    changes:
      - yarn.lock
  script:
    - yarn
    - yarn global add nx
  cache:
    key: "$CI_COMMIT_REF_NAME"
    paths:
      - node_modules

build:
  stage: build
  tags:
    - mydocker
  only:
    - dev
  image: node:20.11-alpine
  script:
    - yarn build:all
  cache:
    key: "$CI_COMMIT_REF_NAME"
    paths:
      - node_modules
    policy: pull

Иногда по непонятному закону, но в основном при мержреквестах, докер начинает считать, что у него есть кэш от первого задания. Докер делает вид, что находит этот кэш и даже разархивирует его, но т.к. кэша в реальности нет, то дальше задание вываливается с ошибкой:

Restoring cache 00:00
Checking cache for dev-10-non_protected...
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
Successfully extracted cache
Executing "step_script" stage of the job script 00:01
Using docker image sha256:xxxxxxxx for node:20.11-alpine with digest node@sha256:yyyyyyyy ...
$ yarn build:all
yarn run v1.22.19
$ node feature-flags/feature-flags-process.js && nx run shell:build:production && nx run-many --parallel --target build --all --exclude shell
/bin/sh: nx: not found
error Command failed with exit code 127.

Никакого кэша dev-10-non_protected в /var/lib/docker/volumes/ нет и из-за этого происходит /bin/sh: nx: not found

Подскажите, как заставить докера перестать видеть миражи?



Последнее исправление: krot_v_lodke (всего исправлений: 1)

думаю, всё работает, как планировалось )

only:
    changes:
      - yarn.lock

а если нет изменений в yarn.lock, первая джоба не выполняется, вторая падает по причине отсутствия nx

почему это потребовалось разносить в две разных - вопрос риторический.

теги поменяй в топике - это не к докеру вопрос, а к тому, как у тебя сиай построен. сиайный кэш гитлаба к докеру не имеет никакого отношения и уж, тем более, не располагается в /var/lib/docker/volumes/

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

сиайный кэш гитлаба к докеру не имеет никакого отношения

Да, ещё раз спасибо за пояснения.

и уж, тем более, не располагается в /var/lib/docker/volumes/

Он там располагается, когда раннер работает в докере (как в моём случае), т.е. когда кэш монтируется к нужному контейнеру, насколько я понимаю.

krot_v_lodke
() автор топика
Последнее исправление: krot_v_lodke (всего исправлений: 1)
21 июня 2024 г.
Ответ на: комментарий от aol

А можно ли сделать так, чтобы если кэш существует и файл yarn.lock не изменился, то script из первого задания не выполнялся бы?

krot_v_lodke
() автор топика
Последнее исправление: krot_v_lodke (всего исправлений: 1)
Ответ на: комментарий от aol

Я правильно понимаю, что вы предлагаете объединить задачи?

Задачи были разделены на две для того, чтобы первая игнорировалась, если не изменился yarn.lock.

Если задачи объединить, то yarn и yarn global add nx будут выполняться всегда.

krot_v_lodke
() автор топика
Последнее исправление: krot_v_lodke (всего исправлений: 1)
Ответ на: комментарий от krot_v_lodke

вам виднее, как организовать процесс. за решением разделить задачи ведь стояла какая-то мыслительная работа, учитывались какие-то (неназванные) ограничения и т.д.

если нет, то любой поверхностный гуглинг выдаст 100500 примеров построения сиая для сборки сферического приложения на жс в вакууме.

aol ★★★★★
()
Ответ на: комментарий от aol

вам виднее, как организовать процесс. за решением разделить задачи ведь стояла какая-то мыслительная работа, учитывались какие-то (неназванные) ограничения и т.д.

Я объяснил, что хотел сделать так, чтобы первая задача закешировалась и её скрипт не выполнялся, если есть кеш.

любой поверхностный гуглинг выдаст 100500 примеров построения сиая

Поверхностный гуглинг ничего не выдаёт.

krot_v_lodke
() автор топика