Как использовать GitLab CI для шифрования переменных?

«Как использовать GitLab CI для шифрования переменных?» — вопрос из категории CI/CD, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В GitLab CI/CD защищённые переменные настраиваются через интерфейс проекта или API. Вот как я это делаю:

1. Настройка через веб-интерфейс: Перехожу в Settings > CI/CD проекта и раскрываю секцию Variables.

  • Добавление: Нажимаю Add variable, ввожу Key (например, PROD_DB_PASSWORD) и Value.
  • Защита (Protect variable): Включаю эту опцию, если переменная должна быть доступна только для защищённых веток (например, main, production).
  • Маскирование (Mask variable): Включаю, чтобы значение не отображалось в логах заданий. GitLab требует, чтобы значение было в одной строке и не содержало специальных символов, которые могут раскрыться в логах.
  • Тип File: Использую, когда нужно передать целый файл (например, JSON-ключ сервисного аккаунта). GitLab сохранит значение во временный файл, путь к которому будет храниться в переменной.

2. Использование в .gitlab-ci.yml: Переменные доступны как environment-переменные.

deploy_to_prod:
  stage: deploy
  script:
    # Использование обычной переменной
    - echo "Deploying with secret key"
    # Использование переменной типа File
    - cat $SERVICE_ACCOUNT_KEY_FILE | jq .
  only:
    - main  # Protected variable будет доступна здесь

3. Добавление через API (для автоматизации):

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" 
     --header "Content-Type: application/json" 
     --data '{"key": "NEW_SECRET", "value": "secret_value", "protected": true, "masked": true}' 
     "https://gitlab.example.com/api/v4/projects/123/variables"

Практический пример из опыта: На одном из проектов мы хранили таким образом токены для доступа к облачным хранилищам S3 и регистрам контейнеров. Ключевой момент — настройка Environments и Deployments, чтобы привязать переменные к конкретному окружению (staging/prod), а не ко всему проекту.