Как устранить ошибку "mvn: команда не найдена"?

Привет! Я изучаю GitLab CI и написал файл конфигурации .gitlab-ci.yml. Вот его содержимое:

```yaml
stages:
  - build
  - test
  - publish

build_job:
  stage: build
  script:
    - export PATH="/usr/bin:/usr/local/bin:$PATH"
    - mvn --version
    - echo "Start building"
    - cd $CI_PROJECT_DIR/src
    - mvn clean package
    - ls -la $CI_PROJECT_DIR/src/target
  artifacts:
    paths:
      - $CI_PROJECT_DIR/src/target/test.jar  
    expire_in: 1 day
  tags:
    - shell

publish_to_registry:
  stage: publish
  script:
    - export PATH="/usr/bin:/usr/local/bin:$PATH"
    - echo "Publishing package to GitLab Package Registry..."
    - /usr/bin/mvn deploy -s  $CI_PROJECT_DIR/.mvn/settings.xml
  tags:
    - shell
```

У меня возникла проблема: даже когда я указываю путь к mvn (`/usr/bin/mvn`) и экспортирую переменную PATH (`export PATH="/usr/bin:/usr/local/bin:$PATH"`), GitLab Runner продолжает выдавать ошибку:

```
bash: line 136: /usr/bin/mvn: No such file or directory
```

Странно то, что иногда это работает — при различных перезапусках. То есть, оно может заработать как при коммите, так и после 20 раз нажатия "Retry". Можете подсказать, в чем может быть проблема?
  • 31 марта 2025 г. 8:55
Ответы на вопрос 2
Ошибка `bash: line 136: /usr/bin/mvn: No such file or directory` указывает на то, что скрипт не может найти или выполнить команду `mvn`. Возможно, проблема связана с тем, что Maven не установлен в указанном вами пути или он установлен в другом месте. Рассмотрим несколько шагов для устранения вашей проблемы:

1. **Проверьте наличие Maven на GitLab Runner**:
   Если у вас есть доступ к GitLab Runner, выполните следующую команду в терминале для проверки наличия Maven и его версии:
   ```bash
   which mvn
   mvn --version
   ```

2. **Установите Maven**:
   Если Maven не установлен, вам нужно его установить. Например, для Ubuntu это можно сделать с помощью:
   ```bash
   sudo apt update
   sudo apt install maven
   ```

3. **Используйте образ Docker с предустановленным Maven**:
   Если ваш GitLab Runner использует Docker, вы можете указать используемый образ с предустановленным Maven. Например, добавьте следующее в ваш `.gitlab-ci.yml`:
   ```yaml
   image: maven:3.8.5-jdk-11
   ```

   Таким образом, вам не придется беспокоиться о настройках PATH или установке Maven на хосте.

4. **Убедитесь в правильности тега**:
   Удостоверьтесь, что Runner, на который вы ссылаетесь с помощью тега `shell`, действительно установлен и настроен. Возможно, стоит попробовать использовать другой Runner или проверить, что все необходимые зависимости для этого Runner доступны.

5. **Логи и отладка**:
   Попробуйте добавить дополнительные логи в ваш скрипт, чтобы отладить проблему. Например:
   ```yaml
   - echo "Checking which mvn is being used"
   - which mvn
   - echo "Checking mvn version"
   - mvn --version
   ```

6. **Конфликтующие версии**:
   Убедитесь, что у вас нет конфликтующих установленных версий Maven (например, в `/usr/bin` и `/usr/local/bin`). Это может вызывать несоответствия при попытке запуска `mvn`.

7. **Перезапуск GitLab Runner**:
   В случае, если ошибка периодическая и появляется из-за каких-либо временных проблем, попробуйте перезапустить GitLab Runner:
   ```bash
   sudo gitlab-runner restart
   ```

Если после проверки всех этих шагов проблема не будет решена, то вероятно, стоит углубиться в логи GitLab Runner для выявления более детальных причин или обратиться к сообществу за помощью.
Вопрос решен.  Требовалось дописать раздел "before_script": 
before_script:
  - sudo apt update # для Ubuntu/Debian
  - sudo apt install -y maven


По крайней мере это решило мою проблему

UPD: если я верно понял, то это должно работать, исходя из утверждения
Каждая job в GitLab CI запускается в новой, независимой среде, обычно в новой директории.

Ключевой фразой тут является словосочетание " независимая среда ", так как для этой независимой среды мы и устанавливаем Maven . Если я все верно понял, то для gitlab runner нет разницы установлен maven в систему или нет (не могу сказать того же про Docker - не пробовал). Он требует чтобы пакет Maven был установлен в его независимой среде ! Решение, конечно, не самое очевидное, но... Что делать. Другого варианта с моим уровнем знаний (оно чуть выше дна) я пока не придумал.

Похожие вопросы