Я пытаюсь вызвать команду оболочки в .gitlab-ci.yml, соответствующие части которой:
image: docker:latest
services:
- docker:dind
stages:
- build
- deploy
...
build:
stage: build
script:
- apt-get update -y
- GIT_TAG=$(git tag | tail -1)
- GIT_TAG=$(/usr/bin/git tag | tail -1)
- docker ...
Однако все три основных вызова команд оболочки завершились неудачно, все с ошибкой «команда not found
». Ошибка команды git
действительно странная, потому что она должна сначала получить репозиторий git, прежде чем запускать раздел script
. То есть я вижу, что git
работает, но сам не могу им пользоваться.
Есть ли способ заставить его работать?
docker:latest
основан на alpine:3.9
, поэтому вам нужно apk add --no-cache git
.
Поскольку вы используете GitLab, доступны специальные переменные для получения уже доступных сведений о ветке/теге/пользователе/фиксации/и т. д. Используйте их вместо установки Git!
@rebelution, если вы имели в виду $CI_COMMIT_TAG
, пожалуйста, посмотрите мой предыдущий комментарий, который я пробовал и подтвердил, что он недоступен для моего конкретного случая в ОП.
@xpt - понял. вы создаете тег и испытываете такое поведение? Это то, что я нашел в документации GitLab. «CI_COMMIT_TAG — имя тега фиксации. Присутствует только при построении тегов» означает — когда вы отправите коммит в GitLab, тогда он запустит конвейер без переменной CI_BUILD_TAG. Когда вы создадите тег для этого коммита и отправите этот тег в GitLab, будет запущен другой конвейер (на этот раз для тега, а не для коммита). В этом случае будет присутствовать CI_BUILD_TAG.
Спасибо @rebelution, это ценный вклад. Хотели бы вы расширить его до ответа? Поскольку я не создаю теги на вышеприведенном шаге .gitlab-ci.yml, по-видимому, этап в .gitlab-ci.yml также должен включать такие изменения/требования... Я проголосую за вас.
Вы видите, что git
работает отдельными шагами, потому что GitLab, вероятно, делает это в другом контейнере. Они содержат ваш контейнер в чистоте, поэтому вам придется устанавливать зависимости самостоятельно.
Поскольку образ, который вы используете, основан на Alpine Linux, команда для установки git
:
apk add --no-cache git
Вы также можете пропустить все это и использовать предопределенные переменные среды, если все, что вам нужно, это информация git. $CI_COMMIT_TAG
будет содержать тег, а $CI_COMMIT_SHA
будет содержать хэш коммита.
Не могли бы вы уточнить $CI_COMMIT_TAG
в ответе, пожалуйста? Документ говорит, что это "имя тега фиксации. Присутствует только при построении тегов." Я строительные теги в шаге выше .gitlab-ci.yml
? Смогу ли я использовать его в моем шаге, если нет? Более того, в документе не указано, что это последняя метка, а у меня их много. Какой будет $CI_COMMIT_TAG
? Спасибо!
Я недостаточно знаком с GitLab, но обычно системы CI строятся на каждом коммите и новом теге. Когда он создает тег, эта переменная будет иметь это имя тега. Обычно это то, для чего людям нужен тег в CI, чтобы они могли пометить версию именем тега.
Спасибо за объяснение, кичик. Я пробовал и подтвердил, что для моего конкретного случая в OP $CI_COMMIT_TAG пуст.
из документация GitLab, вот определение CI_COMMIT_TAG:
CI_COMMIT_TAG — имя тега фиксации. Присутствует только при построении тегов
означает, что когда вы отправите коммит в GitLab, он запустит конвейер без переменной CI_COMMIT_TAG
. Когда вы создадите тег для этого коммита и отправите этот тег в GitLab, будет запущен другой конвейер (на этот раз для тега, а не для коммита). В этом случае CI_COMMIT_TAG
будет присутствовать.
@xpt - спасибо за доверие и просьбу написать это как ответ, надеюсь, это поможет сообществу!
спасибо, позвольте мне попробовать и вернуться к вам. Итак, вы говорите, что при использовании CI_COMMIT_REF_NAME
вышеуказанный .gitlab-ci.yml в моем OP будет работать без каких-либо изменений, верно?
Я попробовал это только что, и это не работает, если только .gitlab-ci.yml в OP не изменен - CI_COMMIT_REF_NAME
всегда дает мне имя моего проекта, а не имя тега. Пожалуйста, убедитесь, что это работает с вашей стороны, прежде чем публиковать любой ответ, а не только вы думаете, что это сработает. Спасибо.
@xpt - спасибо, отредактировал ответ, проверю и поделюсь, если найду что-нибудь вокруг него :)
Вы уверены, что
docker:latest
установилgit
? Попробуйте добавитьapt-get install -y git
.