GitLab CI via ssh

Есть разные варианты CI один из распространненых — это когд при мердже код отправляется на сервер. У GitLab есть разные варианты, например с помощью GitLab Runner (небольшая статья тут) или как часто бывает путем затягивания с сервера необдходимых изменений напрямую из гита приложения и выполнения дополнительных скриптов.

Основная проблема подхода обновления через ssh — это в правильной настройке взаимодействия образа созданного в гитлаб и удаленного сервера через ключи ssh.

Сгенерируем ключи

ssh-keygen -t ed25519 -C "<comment>"

В качестве комментария можно использовать email. Например {username}@gitlab.com. По идее он не обязателен, но потом проще определить какой ключ откуда

Ключи можно разместить где угодно, потому как их можно сгенерировать один раз и по идее забыть про них. В данном случае будут сгенерированы 2 ключа: id_ed25519 и id_ed25519.pub

  • содержимое id_ed25519 необходимо разместить в переменной CI/CD (SSH_PRIVATE_KEY)
  • содержимое id_ed25519.pub неоходимо разместить в ~/.ssh/authorized_keys на сервере, к которому происходит подключение. Если этого файла нет, то желательно его создать

Переменные

https://gitlab.com/{username}/{repository_name}/-/settings/ci_cd добавляем необходимые переменные:

  • SSH_HOST
  • REMOTE_PATH
  • SSH_PRIVATE_KEY
  • другие какие нужны

Конфиг CI

добавляем в корень репозитория .gitlab-ci.yml (название определено в gitlab, но его можно сменить на другое в настройках репозитория)

deploy:
  image: alpine
  before_script:
    - apk add openssh-client
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
  script:
    - ssh -o StrictHostKeyChecking=no $SSH_HOST "cd $REMOTE_PATH && pwd"
    - ssh -o StrictHostKeyChecking=no $SSH_HOST "cd $REMOTE_PATH && git pull origin master"

Прочее

Можно так же добавить выполнение дополнительных скриптов, например уведомление об успешном обновлении или расширить ci на стейджи, выполнять в зависимости от определенной ветки и т.п.
Часть из этого можно подсмотреть в небольшой статье тут

Ошибки

Network unreachable

Бывает что при подключении в GitLab возникает ошибка:

connect to host gitlab.com port 22: network is unreachable

то может помочь изменение конфига для подключения к альтернативному хосту, для этого в ~/.ssh/config можно добавить (если файла нет, то необходимо создать с правами 600)

Host gitlab.com
  Hostname altssh.gitlab.com
  User git
  Port 443
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/gitlab

Host key verification failed

При попытке получить данные из репозитори через образ созданный в gitlab возникает ошибка:

Warning: Permanently added ‘ssh.school1-vp.nichost.ru’ (RSA) to the list of known hosts.
Host key verification failed.

Для этого можно зайти через консоль и сделать git clone или git pull первый раз вручную, host key сохранится и в дальншейшем такой проблемы не должно быть

Источники

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.