У меня есть сценарий оболочки следующим образом:
Поскольку 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
в 21-й строке вашего скрипта. Может быть, попробуйте указать абсолютный путь во время его запуска, и тогда он должен летать, ИМХО.
Неправильные формулировки @ArkadiuszDrabczyk, оболочка gradle находится на один уровень выше сценария оболочки. Обновил qs.
Проект @RavinderSingh13 не должен запускаться только на моей машине, поэтому абсолютный путь не помогает. ../gradlew
должен смотреть на родительскую папку, где доступна оболочка gradle.
@Tarun, хорошо, значит, ты имеешь в виду, что путь к этому файлу не исправлен? Если да, то мы могли бы запустить команду find в оболочке, получить ее путь, а затем выполнить вашу операцию с полным путем, пожалуйста, дайте мне знать, что вы думаете об этом, приветствия.
путь оболочки gradle исправлен от корня проекта, и поэтому я использовал ../gradlew
, чтобы добраться до корня проекта, что, очевидно, не работает, и я хочу знать, почему?
@Tarun, пожалуйста, потерпите меня, я не эксперт в вашем инструменте/языке. но как насчет cd .. && ./gradlew clean.....your command from here
, что означает перейти на один уровень выше, а затем запустить скрипт, пожалуйста, дайте мне знать, если это вам поможет.
Та же ошибка с cd .. && ./gradlew
@Tarun, тогда давайте проверим, каков текущий путь вашего скрипта, прежде чем запускать это, сделайте так, как cd .. && pwd && ./gradlew
, который также должен печатать текущий путь, дайте мне знать, что он печатает.
Вот что я получаю - + cd .. + pwd + ./gradlew clean backendTestByGroup ./test-runners/backend_test.sh: line 22: ./gradlew: No such file or directory
Все относительные пути оцениваются относительно текущего рабочего каталога. Если вы используете оболочку, рабочий каталог часто отображается в приглашении оболочки. Между вашим рабочим каталогом и каталогом обрабатываемого файла нет никакой связи. Это поведение объясняет все ваши проблемы:
Поскольку
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 на тест-раннерах, и их наличие на корневом уровне делает проект немного раздутым и плохо организованным. Спасибо, что нашли время ответить в дни отпуска.
Вы можете сохранить файл в папке test-runners
и изменить ../gradlew
на ./gradlew
в своих файлах скриптов. Таким образом, он должен работать на CI. Локально вам нужно будет вызывать сценарии из каталога проекта (перейдите туда и вызовите test-runners/backend_test.sh
).
В качестве альтернативы вы можете отредактировать файлы сценария, чтобы автоматически изменить рабочий каталог на каталог файла сценария.
./gradlew
справился. Забавный факт: IDEA изменился с ./gradlew
на ../gradlew
, когда я переместил файлы sh в папку test-runners
.
Да, иногда эти автоматические рефакторинги немного выходят из-под контроля.
Глядя на дерево каталогов, я не понимаю, почему вы думаете, что gradlew
is one level above the test-runner folder
- он в той же папке.