Есть разные варианты 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 сохранится и в дальншейшем такой проблемы не должно быть
Источники
- Use SSH keys to communicate with GitLab | GitLab
- Deploy over SSH from Gitlab CI pipeline | by Valentin Despa | DevOps with Valentine | Medium