Переменная GitLab CI пустая: protected, environment scope и тип File

Job завершилась сообщением missing credentials, хотя токен есть в настройках проекта. Печатать его через echo — плохой способ выяснить причину: даже успешная диагностика оставит значение в журнале. Полезнее проверить, появилась ли переменная, какой у неё тип и соответствует ли запуск условиям доступа.

Разберём переменную APP_TOKEN для публикации и APP_CA_FILE с сертификатом. Токен должен приходить как значение, сертификат — как путь к временному файлу. У обоих могут быть ограничения по защищённым refs и окружению. Каждое ограничение проверяется независимо от правильности имени ключа.

Отсутствует, пуста или содержит путь

В тестовой job на Linux с POSIX shell можно проверить состояние без содержимого. Фрагмент ниже относится к script существующей job и ничего не отправляет во внешнюю систему.

if [ "${APP_TOKEN+x}" != x ]; then
  printf '%s\n' 'APP_TOKEN is unset' >&2
  exit 1
fi
if [ -z "$APP_TOKEN" ]; then
  printf '%s\n' 'APP_TOKEN is empty' >&2
  exit 1
fi
if [ -z "${APP_CA_FILE:-}" ] || [ ! -r "$APP_CA_FILE" ]; then
  printf '%s\n' 'APP_CA_FILE is not a readable file' >&2
  exit 1
fi
printf '%s\n' 'Required inputs are available'

Первое условие отличает отсутствующее имя от существующей пустой строки. Проверка -r подтверждает доступность файла сертификата, не выводя его. Сообщение об успехе означает только наличие входов: действительность токена и доверие сертификату проверяются уже при нужном подключении.

Для File-переменной GitLab записывает сохранённое содержимое во временный файл, а в переменную окружения помещает путь. Поэтому передавайте APP_CA_FILE параметру, который ожидает имя файла. Если инструмент ждёт текст, путь будет воспринят как текст и вызовет другую ошибку.

Защищённая переменная и обычная ветка

Сравните protected-статус переменной и ref pipeline. Токен с Protected доступен только в разрешённых защищённых контекстах. Main может проходить, а feature-ветка не получать токен — это согласованное ограничение, если публикация предназначена только для релиза.

Для merge request pipeline доступ к защищённым переменным зависит от условий GitLab и настроек проекта, включая защищённость исходной и целевой ветки. Одного имени target branch недостаточно. Посмотрите источник запуска и правила доступа к protected variables именно для вашей версии. Если job только тестирует код, разумнее дать ей отдельный тестовый вход, чем расширять область релизного токена.

Environment scope относится к job

Переменная со scope production выбирается по environment задачи. Job без environment: production не приобретает этот scope из имени stage deploy. Проверьте итоговое имя окружения, особенно если оно строится из переменных: review/branch и production — разные значения.

check_release_inputs:
  image: alpine:3.21
  environment:
    name: production
  script:
    - test -n "${APP_TOKEN:-}"
    - test -r "${APP_CA_FILE:-}"

Это минимальный пример сопоставления scope, а не разрешение выдавать production-секрет всем веткам. В рабочем файле добавьте rules, ограничивающие допустимый источник релиза, и используйте принятый порядок авторизации. Ограничения самой переменной продолжают действовать независимо от environment.

Когда значение перекрыли другим

Если переменная есть, но пуста, найдите одноимённый ключ на уровне группы, проекта, YAML и аргументов ручного или API-запуска. Приоритет источников переменных может привести к тому, что сохранённое значение перекрывается переданным пустым. Сравнивайте имена и области, не выгружая все значения в журнал.

Проверьте также раскрытие ссылок на другие переменные. Настройка expansion и допустимый формат значения влияют на то, будет ли строка с долларом раскрыта или передана буквально. Masked отвечает за сокрытие в выводе, Protected — за контекст выдачи; одно свойство не заменяет другое.

Завершайте диагностику повторным запуском в разрешённом контексте и отрицательной проверкой вне него. В первом входы должны быть доступны, во втором релизная job не должна получать секрет. Такая проверка подтверждает и работоспособность публикации, и сохранение выбранной границы доступа.

Ещё по теме

Продолжить изучение

Хотите собрать проверяемый путь от коммита до релиза? Jobs, runners, артефакты и деплой — темы программы «GitLab CI/CD: автоматизация сборки и деплоя».

Продолжить на практике

  • GitLab CI/CD: автоматизация сборки и деплоя ↗

    От первого .gitlab-ci.yml до pipeline, который тестирует код, собирает образ и выкладывает приложение. Runners, artifacts, cache, registry, окружения и безопасный откат — на одном практическом проекте.