Как включить клонирование через SSH для бегуна Gitlab?

У меня возникают проблемы с клонированием больших репозиториев через HTTP на моем Windows Gitlab runner. Я пробовал несколько методов делать мелкие клоны или отключать сжатие клонов. Еще не повезло.

Клонирование одного и того же репозитория над SSH отлично работает как временное решение, и я хотел бы, чтобы это работало над процессом Gitlab CI.

Теперь проблема заключается в том, что я не знаю, как использовать SSH как метод клонирования для gitlab-multi-runner. По-видимому, он использует HTTP по умолчанию, и мои единственные варианты клонирования - это то, будет ли он делать полный клон или выборку.

CI/CD Display

Может кто-нибудь объяснить, как я мог получить этот клон/выбор для работы над бегуном по SSH вместо HTTP?

Gitlab Версия: GitLab Community Edition 8.10.7

Спасибо!

Ответ 1

В соответствии с:

https://docs.gitlab.com/ee/ci/ssh_keys/README.html

Вам необходимо:

  • Создайте новую пару ключей SSH с помощью ssh-keygen
  • Добавить закрытый ключ как секретную переменную в проект
  • Запустите ssh-agent во время задания, чтобы загрузить закрытый ключ.

Пример gitlab_ci.yml:

before_script:
  # Install ssh-agent if not already installed, it is required by Docker.
  # (change apt-get to yum if you use a CentOS-based image)
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

  # Run ssh-agent (inside the build environment)
  - eval $(ssh-agent -s)

  # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY")

  # For Docker builds disable host key checking. Be aware that by adding that
  # you are suspectible to man-in-the-middle attacks.
  # WARNING: Use this only with the Docker executor, if you use it with shell
  # you will overwrite your user SSH config.
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  # In order to properly check the server host key, assuming you created the
  # SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines
  # instead.
  # - mkdir -p ~/.ssh
  # - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'

Ответ 2

Как новичок в gitlab, мне удалось взломать обходной путь к этой проблеме, так как я также не нашел встроенного способа изменения процесса клонирования по умолчанию (хотя вот недавний комментарий о том, как это можно сделать).

Отключив процесс автоматического клонирования, вы можете полностью полностью отменить его поведение, просто написав свой собственный процесс клонирования в before_script. Только для целей примера ниже показано, как это сделать для клонирования HTTP, но может быть адаптировано для клонирования ssh (если вы пытаетесь использовать клонирование HTTP, вы должны использовать встроенный процесс клонирования и config.toml):

  1. Создайте нового пользователя под названием "gitlab-runner" и сгенерируйте его токен пользователя для последующего использования (или в вашем случае вы будете генерировать ssh-ключи).

  2. Отключите процесс клонирования для бегуна, добавив следующую переменную в настройках вашего проекта или группы: .../settings/ci_cd

    key: GIT_STRATEGY

    Значение: нет

  3. Клонирование вашего репо в before_script например:

before_script:
  ## clean the working directory
  - BUILD_DIR=/home/gitlab-runner/builds/$RUNNER_TOKEN/0
  - CLONE_DIR="$BUILD_DIR/$CI_PROJECT_PATH"
  - cd $BUILD_DIR
  - rm -rf $CLONE_DIR
  - mkdir -p $CLONE_DIR

  ## clone the project each time (inefficient, consider performing fetch instead if it already exists)
  - git clone http://gitlab-runner:[email protected]:8888/${CI_PROJECT_PATH}.git $CLONE_DIR
  - cd $CLONE_DIR

Примечание. Вот соответствующие переменные, которые я также настроил на шаге 2, а не жесткое их кодирование в скрипте:

  • RUNNER_TOKEN: значение "Runner Token", указанное в меню "Runners" администратора для конкретного бегуна, который вы пытаетесь запустить.
  • GITLABRUNNER_USER_AUTH_TOKEN: Это токен аутентификации, сгенерированный на шаге 1.