Получение GitLab CI для клонирования частных репозиториев

У меня есть GitLab и GitLab CI, настроенные для размещения и тестирования некоторых моих личных репозиториев. Для моих модулей-композиторов в этой системе у меня есть Satis для решения моих личных пакетов.

Очевидно, что этим частным пакетам требуется ключ ssh для клонирования, и у меня это работает в терминале - я могу запустить установку композитора и получить эти пакеты, если у меня есть ключ, добавленный с помощью ssh-add в оболочке.

Однако при выполнении моих тестов в GitLab CI, если у проекта есть какие-либо из этих зависимостей, тесты не будут завершены, так как мой экземпляр GitLab нуждается в аутентификации, чтобы получить отпечатки (очевидно), и тест не работает, говоря Host key verification failed.

Мой вопрос в том, как мне настроить это так, чтобы, когда бегун запускает тест, он может аутентифицироваться в gitlab без пароля? Я попытался установить ssh-ключ без пароля в моей папке ~/.ssh, однако сама по себе конструкция не добавит ключ, "eval ssh-agent -s", за которым следует ssh-add, кажется, не работает, заявив, что агент не запущен...

Ответы

Ответ 1

Я отправляю это как ответ, так как другие не были полностью ясны и/или детализированы IMHO

Начиная с GitLab 8.12+, если репозиторий подмодуля находится на том же сервере, что и тот, который его запрашивает, вы можете теперь:

  • Настройте репо с подмодулями git как обычно (git submodule add [email protected]:folder/mysubmodule.git)

  • Измените файл .gitmodules следующим образом

    [submodule "mysubmodule"]
      path = mysubmodule
      url = ../../group/mysubmodule.git
    

    где `../../group/mysubmodule.git '- относительный путь из вашего репозитория к подмодульному.

  • Добавьте следующие строки в gitlab-ci.yml

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
    

    чтобы проинструктировать бегун для получения всех подмодулей до сборки.

Предостережение: если ваш бегун, похоже, игнорирует директиву GIT_SUBMODULE_STRATEGY, вам следует, вероятно, рассмотреть обновление.

(источник: https://docs.gitlab.com/ce/ci/git_submodules.html)

Ответ 2

Вот полный способ:

Общая конструкция

  • создание пары ключей SSH
  • добавление частного в качестве переменной безопасной среды вашего проекта.
  • сделать доступным доступное для ваших тестовых скриптов на GitLab-CI
  • добавление открытого в качестве ключа развертывания в каждой из ваших личных зависимостей

Создание пары открытых и закрытых SSH-ключей

Создайте пару открытых и закрытых SSH-ключей без кодовой фразы:

ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key

Добавление личного ключа SSH в ваш проект

Вам нужно добавить ключ в качестве защищенной переменной среды для вашего проекта, как следующее:

  • просмотреть https://<gitlab_host>/<group>/<project_name>/variables
  • нажмите "Добавить переменную"
  • заполните текстовое поле Key с помощью SSH_PRIVATE_KEY
  • заполните текстовое поле Value с помощью собственного SSH-ключа
  • нажмите "Сохранить изменения"

Предоставление личного ключа SSH для тестовых скриптов

Чтобы ваш секретный ключ был доступен для ваших тестовых скриптов, вам нужно добавить в ваш .gitlab-ci.yml файл:

before_script:
  # install ssh-agent
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  # run ssh-agent
  - eval $(ssh-agent -s)
  # add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  # disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
  # WARNING: use only in docker container, if you use it with shell you will overwrite your user ssh config
  - mkdir -p ~/.ssh
  - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

Фрагмент кода поступает из документации GitLab

Добавление открытого SSH-ключа в качестве ключа развертывания ко всем вашим личным зависимостям

Вам необходимо зарегистрировать открытый SSH-ключ в качестве ключа развертывания для всех ваших личных как:

  • просматривать https://<gitlab_host>/<group>/<dependency_name>/deploy_keys
  • нажмите "Новый ключ развертывания"
  • заполните текстовое поле Title именем вашего проекта
  • заполнить текстовое поле Key самим открытым SSH-ключом
  • нажмите "Создать ключ развертывания"

Ответ 3

Исправлено это, добавив ключ к известным хостам с помощью ssh-keyscan -H 'localgitlab.co.uk' >> ~gitlab_ci_runner/.ssh/known_hosts

Ответ 4

Я использовал токены развертывания для решения этой проблемы, так как настройка ключей SSH для тестового бегуна кажется немного затянутой.

git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git

Токены развертывания относятся к каждому проекту и доступны только для чтения.

Ответ 5

Если вы не хотите возиться с ssh-ключами или подмодулями, вы можете переопределить хранилище в конфигурации git для аутентификации с помощью токена задания (в gitlab-ci.yml):

before_script:
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/group/repo.git".insteadOf [email protected]:group/repo.git

Ответ 6

Похоже, что существует разумное решение.

Короче говоря, с GitLab 8.12 все, что вам нужно сделать, это использовать относительные пути в .submodules, а git submodule update --init будет просто работать

Ответ 7

У меня был сценарий, в котором я должен был использовать свой ssh-ключ в трех разных сценариях, поэтому я помещал материал ssh в одну оболочку script и сначала вызывал его перед другими 3 сценариями. Это закончилось тем, что не работает, я думаю, из-за ssh-agent, не сохраняющегося между сценариями оболочки, или что-то в этом роде. В итоге я просто вывел закрытый ключ в файл ~/.ssh/id_rsa, который наверняка сохранится и для других скриптов.

.gitlab-ci.yml

script:
    - ci/init_ssh.sh
    - git push # or whatever you need ssh for

Ки/init_ssh.sh

# only run in docker:
[[ ! -e /.dockerenv ]] && exit 0

mkdir -p ~/.ssh
echo "$GITLAB_RUNNER_SSH_KEY" > ~/.ssh/id_rsa
chmod 400 ~/.ssh/id_rsa
echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > /.ssh/config

Он работает как шарм!

Ответ 8

В настоящее время принятый ответ встраивает специфичные для Gitlab требования в мой файл .gitmodules. Это вынуждает конкретную структуру каталогов для локальной разработки и усложняет переход на другую платформу управления версиями.

Вместо этого я последовал совету в ответе Juddling. Здесь более полный ответ.

Мои файлы .gitmodules имеют следующее содержимое:

[submodule "myproject"]
    url = [email protected]:mygroup/myproject.git

В моем gitlab-ci.yml меня есть следующее:

build:
  stage: build
  before_script:
    - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@git.myhost.com/".insteadOf "[email protected]:"
    - git submodule sync && git submodule update --init

Трейлинг / и : являются критическими в строке git config, так как мы сопоставляем аутентификацию SSH с HTTPS. Это сбило меня с толку из-за ошибок "Недопустимый номер порта".

Мне нравится это решение, потому что оно встраивает специфичные для Gitlab требования в специфичный для Gitlab файл, который игнорируется всем остальным.