package-lock.json не кешируется, хэш от содержимого файла используется как ключ для кэша `.npm`. Если добавить `before_script`, но не указать правило кэширования, каждый раз будет качать пакеты из сети.
Если имеется в виду Kubernetes executor, то артефакты после выполнения джобы ровно таким же образом будут выгружены на gitlab сервер. У меня опыта конкретно с k8s gitlab runner нет, но подозреваю, что локальный кэш на раннере не будет иметь смысла. Стоит позаботиться о настройке распределённого кэша через S3. Тогда динамически создаваемые под каждую джобу поды смогут обращаться как к кэшу, так и к артифактам.
+