Оболочка не распознает оболочку graddle

У меня есть сценарий оболочки следующим образом:

Поскольку gradlew находится в корне проекта, он вызывается как ../gradlew clean, который находится на один уровень выше файла backend_test.sh

Однако задание Gitlab ci завершается со следующей ошибкой:

./test-runners/backend_test.sh: line 21: ../gradlew: No such file or directory

Если я перенесу backend_test.sh также на корневой уровень и обновлю файл оболочки, чтобы вызывать gradlew как ./gradlew clean, тогда ошибки не будет. Что я делаю неправильно, когда backend_test.sh не на корневом уровне?

Обновлять:

Запуск оболочки локально, т.е. ./backend_test.sh, приводит к следующей ошибке:

Configure project : 
Evaluating root project 'test-runners' using build file 
'/Users/tarunkumar/dev/git/system-test/test-runners/build.gradle'.
All  projects evaluated.

FAILURE: Build failed with an exception.

* What went wrong:
Task 'clean' not found in root project 'test-runners'.

Почему build.gradle ищется в папке test-runner, хотя она находится на том же уровне, что и test-runner?

Глядя на дерево каталогов, я не понимаю, почему вы думаете, что gradlew is one level above the test-runner folder - он в той же папке.

Arkadiusz Drabczyk 24.12.2020 15:04

Я считаю, что ошибка ясна, не может найти gradlew в 21-й строке вашего скрипта. Может быть, попробуйте указать абсолютный путь во время его запуска, и тогда он должен летать, ИМХО.

RavinderSingh13 24.12.2020 15:05

Неправильные формулировки @ArkadiuszDrabczyk, оболочка gradle находится на один уровень выше сценария оболочки. Обновил qs.

Tarun 24.12.2020 15:09

Проект @RavinderSingh13 не должен запускаться только на моей машине, поэтому абсолютный путь не помогает. ../gradlew должен смотреть на родительскую папку, где доступна оболочка gradle.

Tarun 24.12.2020 15:11

@Tarun, хорошо, значит, ты имеешь в виду, что путь к этому файлу не исправлен? Если да, то мы могли бы запустить команду find в оболочке, получить ее путь, а затем выполнить вашу операцию с полным путем, пожалуйста, дайте мне знать, что вы думаете об этом, приветствия.

RavinderSingh13 24.12.2020 15:13

путь оболочки gradle исправлен от корня проекта, и поэтому я использовал ../gradlew , чтобы добраться до корня проекта, что, очевидно, не работает, и я хочу знать, почему?

Tarun 24.12.2020 15:17

@Tarun, пожалуйста, потерпите меня, я не эксперт в вашем инструменте/языке. но как насчет cd .. && ./gradlew clean.....your command from here, что означает перейти на один уровень выше, а затем запустить скрипт, пожалуйста, дайте мне знать, если это вам поможет.

RavinderSingh13 24.12.2020 15:20

Та же ошибка с cd .. && ./gradlew

Tarun 24.12.2020 15:29

@Tarun, тогда давайте проверим, каков текущий путь вашего скрипта, прежде чем запускать это, сделайте так, как cd .. && pwd && ./gradlew, который также должен печатать текущий путь, дайте мне знать, что он печатает.

RavinderSingh13 24.12.2020 15:31

Вот что я получаю - + cd .. + pwd + ./gradlew clean backendTestByGroup ./test-runners/backend_test.sh: line 22: ./gradlew: No such file or directory

Tarun 24.12.2020 15:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все относительные пути оцениваются относительно текущего рабочего каталога. Если вы используете оболочку, рабочий каталог часто отображается в приглашении оболочки. Между вашим рабочим каталогом и каталогом обрабатываемого файла нет никакой связи. Это поведение объясняет все ваши проблемы:


Поскольку gradlew находится в корне проекта, он вызывается как ../gradlew clean, который находится на один уровень выше файла backend_test.sh -

На серверах CI все процессы обычно вызываются с использованием корневого каталога в качестве рабочего (я не уверен насчет GitLab CI, но думаю, что он ведет себя так же). Теперь ../gradlew будет оцениваться относительно вашего корневого каталога, что не сработает, поскольку он ищет gradlew в родительском каталоге того, что GitLab CI использует в качестве временной папки. Вы можете проверить это поведение, локально перейдя оболочку в каталог вашего проекта, а затем вызвав test-runners/backend_test.sh, это должно привести к той же ошибке.

Если я перенесу backend_test.sh также на корневой уровень и обновлю файл оболочки, чтобы вызывать gradlew как ./gradlew clean, тогда ошибки не будет.

Ну, конечно, это работает до тех пор, пока скрипт будет вызываться из каталога вашего проекта, который по умолчанию используется на серверах CI, как мы уже заметили. Локально вы можете просто перейти в каталог вашего проекта и просто вызвать backend_test.sh.

Запуск оболочки локально, т.е. ./backend_test.sh, приводит к следующей ошибке

Ну, теперь у нас есть та же проблема наоборот. Ваш скрипт может найти ../gradlew и вызвать Gradle, но, к сожалению, Gradle будет оценивать рабочий каталог, чтобы найти соответствующий файл build.gradle. Но теперь рабочий каталог находится внутри вашей папки test-runners, и Gradle будет искать в этой папке файл build.gradle. Если в этой папке нет файла build.gradle, Gradle вообще не заботится, вместо этого он просто предполагает, что есть пустой файл build.gradle. Теперь Gradle использует этот (пустой) проект для запуска сборки, но поскольку в (пустом) проекте нет задачи clean, Gradle не работает.

Нет ли способа хранить файлы в папке тестовых бегунов и не иметь их в корне, где доступны файлы gradle? У меня есть несколько файлов sh на тест-раннерах, и их наличие на корневом уровне делает проект немного раздутым и плохо организованным. Спасибо, что нашли время ответить в дни отпуска.

Tarun 25.12.2020 12:11

Вы можете сохранить файл в папке test-runners и изменить ../gradlew на ./gradlew в своих файлах скриптов. Таким образом, он должен работать на CI. Локально вам нужно будет вызывать сценарии из каталога проекта (перейдите туда и вызовите test-runners/backend_test.sh).

Lukas Körfer 25.12.2020 12:19

В качестве альтернативы вы можете отредактировать файлы сценария, чтобы автоматически изменить рабочий каталог на каталог файла сценария.

Lukas Körfer 25.12.2020 12:24
./gradlew справился. Забавный факт: IDEA изменился с ./gradlew на ../gradlew, когда я переместил файлы sh в папку test-runners.
Tarun 25.12.2020 13:28

Да, иногда эти автоматические рефакторинги немного выходят из-под контроля.

Lukas Körfer 25.12.2020 13:30

Другие вопросы по теме