Как я могу запустить задание установки зависимостей, только если оно не кэшировано или не упаковано. json изменено в gitlab ci? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть монорепо в gitlab с angular интерфейсом и гнездом js. У меня есть пакет. json для каждого из них и 1 в root. Мой конвейер состоит из нескольких этапов, подобных этим:

stages:
  - build
  - verify
  - test
  - deploy

И у меня есть работа на этапе .pre, которая устанавливает зависимости. Я хотел бы кэшировать их между заданиями, а также между ветвями, если какой-либо из package-lock.json изменился, но также, если в настоящее время нет кэшированных node_modules. У меня есть задание, которое выглядит следующим образом:

prepare:
  stage: .pre
  script:
    - npm run ci-deps # runs npm ci in each folder
  cache:
    key: $CI_PROJECT_ID
    paths:
      - node_modules/
      - frontend/node_modules/
      - backend/node_modules/
    only:
      changes:
        - '**/package-lock.json'

Теперь проблема в том, что если кэш был каким-то образом очищен или я не внес изменения в package-lock.json с первым пу sh, я выиграл ' эта работа вообще не выполняется и, следовательно, все остальное не будет выполнено, потому что для этого требуется node_modules. Если я удалю changes: оттуда, то он запускает работу для каждого конвейера. Конечно, тогда я все еще могу поделиться им между заданиями, но если я сделаю еще один коммит и pu sh, то для установки всех зависимостей потребуется почти 2 минуты, даже если я ничего не изменил в отношении того, что должно быть там ... что-то упустил? Как я могу кэшировать его таким образом, чтобы он только переустанавливал зависимости, если кеш устарел или не существует?

1 Ответ

1 голос
/ 07 февраля 2020

В конце концов, я решил, что могу сделать это, не полагаясь на функции gitlab ci, но проведу свои собственные проверки следующим образом:

prepare:
  stage: .pre
  image: node:12
  script:
    - if [[ ! -d node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\package.json\b"` ]];
      then
      npm ci;
      fi
    - if [[ ! -d frontend/node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\frontend/package.json\b"` ]];
      then
      npm run ci-deps:frontend;
      fi
    - if [[ ! -d backend/node_modules ]] || [[ -n `git diff --name-only HEAD~1 HEAD | grep "\backend/package.json\b"` ]];
      then
      npm run ci-deps:backend;
      fi
  cache:
    key: '$CI_COMMIT_REF_SLUG-$CI_PROJECT_DIR'
    paths:
      - node_modules/
      - frontend/node_modules
      - backend/node_modules

Хорошая вещь в этом состоит в том, что он устанавливает только зависимости для укажите c часть проекта, если в нем еще нет node_modules или когда пакет. json был изменен. Однако это, вероятно, будет неправильно, если я наберу sh несколько коммитов и пакет. json изменится не в последнем. В этом случае я все еще могу очистить кэш и повторно запустить конвейер вручную, но я постараюсь еще больше улучшить свой сценарий и обновить свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...