Как стать автором
Обновить

Руководство для начинающих по настройке SSH и CI CD для проекта с использованием Docker и GitLab (GitHub)

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров9.7K

Добрый день, с вами ваш писатель-программист из компании SimplGroup. В этой статье я, насколько могу, подробно расскажу вам, как настроить SSH для подключения к виртуальной машине (VM) и интегрировать процесс CI/CD для вашего проекта с использованием Docker и GitLab/GitHub. Мы пройдем через все необходимые шаги, чтобы вы могли легко развернуть ваше приложение.

Стоит сказать, что сама я новичок и вообще бэкенд разработчик, которому неожиданно пришлось развернуть проект на виртуальной машине, так что, если сюда забрел такой же новичок, то, дружище, я может и не достаточно хорошо, но постараюсь тебе все объяснить.

Оглавление

  1. Подключение к виртуальной машине

  2. Настройка Git через SSH

  3. Работа с Docker

  4. Настройка CI/CD

  5. Заключение

Шаг 1: Подключение к виртуальной машине (VM)

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

1. Создание SSH ключа

SSH ключи используются для безопасного подключения к удаленным серверам. Чтобы создать SSH ключ, выполните следующую команду в терминале:

ssh-keygen -t ed25519 -C "your_email@example.com"

  • -t ed25519 указывает тип ключа (еще можно rsa - побольше в размере, но постарше).

  • -C "your_email@example.com" добавляет метку для ключа (обычно это ваш email), но можно в целом не писать, если не хотите.

Далее протыкиваем везде Enter, чтобы сильно не морочиться дальше. Если что, там задавался путь (по умолчанию (ваш пользователь)/.ssh/) и пароль к ключу.

2. Прокидывание публичной части ключа в VM

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

ssh-copy-id user@your_vm_ip

  • user — это ваш логин на VM.

  • your_vm_ip — это IP-адрес вашей виртуальной машины.

Эта команда добавит ваш публичный ключ в файл ~/.ssh/authorized_keys на VM, что позволит вам подключаться без пароля.

3. Подключение к VM

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

ssh user@your_vm_ip

Если вы все сделали правильно, вы должны войти в систему без ввода пароля.

Шаг 2: Настройка SSH в VM для Git

Теперь настроим SSH для работы с Git, чтобы вы могли безопасно взаимодействовать с вашими репозиториями на GitLab или GitHub.

1. Создание SSH ключа (если вы еще этого не сделали)

В VM выполним знакомую нам команду:

ssh-keygen -t ed25519 -C "your_email@example.com"

2. Прокидывание публичной части ключа в ваш Git

Теперь добавьте публичную часть ключа в настройки вашего репозитория на GitLab или GitHub.

Для GitHub:

  1. Перейдите в настройки вашего аккаунта.

  2. Выберите "SSH and GPG keys".

  3. Нажмите "New SSH key".

  4. Вставьте содержимое файла ~/.ssh/id_ed25519.pub в поле "Key".

  5. Нажмите "Add SSH key".

Для GitLab:

  1. Перейдите в настройки вашего аккаунта.

  2. Выберите "SSH Keys" в боковом меню.

  3. Вставьте содержимое файла ~/.ssh/id_ed25519.pub в поле "Key".

  4. Нажмите "Add key".

3. Проверка подключения

После добавления ключа проверьте, что все работает, выполнив команду в VM:

Для GitHub:

ssh -T git@github.com

Для GitLab:

ssh -T git@gitlab.com

Если все настроено правильно, вы увидите сообщение о том, что вы успешно аутентифицированы.

Шаг 3: Клонирование репозитория

Теперь, когда SSH настроен, вы можете клонировать репозиторий на свою локальную машину. Выполните команду:

git clone git@github.com:username/repository.git

Замените username и repository на ваши данные.

Шаг 4: Разработка и тестирование

Будем считать что локально, на вашем пк или ноутбуке, вы разработали некое приложение. Чтобы запустить это все на VM, для начала, нам нужно убедиться, что докер образ у вас вообще соберется, поэтому протестим.

(Дальше убедитесь, что у вас установлен докер на компьютере. Docker Desktop самый оптимальный вариант.)

В корневой папке вашего проекта (cd корень) создайте файл Dockerfile, чтобы описать, как собирать ваш проект в контейнер.

Пример простого Dockerfile для приложения на Node.js:

FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

После создания Dockerfile убедитесь, что образ собирается локально:

docker build -t myapp .

Пока не соберется, лучше не переходить дальше, но если докер не устанавливали и хотите разворачивать сразу на VM, то хотя бы убедитесь, что ваш проект сам по себе запускается, даже без докера.

Шаг 5: Настройка CI/CD в GitLab/GitHub

Теперь создадим переменную в репозитории, куда вставим приватную часть своего SSH ключа.

1. Создание переменной

Для GitLab:

  1. Перейдите в настройки вашего репозитория.

  2. Выберите "CI/CD" в боковом меню.

  3. Нажмите "Variables".

  4. Добавьте новую переменную с именем SSH_PRIVATE_KEY и вставьте в нее содержимое файла ~/.ssh/id_ed25519 (открывать можно через блокнот).

Пометка:
- Visibility лучше поставить Visible, потому что другие запрещают пробелы.
- Flags ставим Expand variable reference, чтобы можно было использовать

Для GitHub:

  1. Перейдите в настройки вашего репозитория.

  2. Выберите "Secrets and variables" в боковом меню.

  3. Нажмите "Actions".

  4. Нажмите "New repository secret".

  5. Введите имя SSH_PRIVATE_KEY и вставьте содержимое вашего приватного ключа ~/.ssh/id_ed25519 (открывать можно через блокнот).

2. Создание файла CI/CD

Создайте файл .gitlab-ci.yml (для GitLab) или .github/workflows/ci.yml (для GitHub) в корне вашего репозитория.

Пример для GitLab:

stages:
  - build
  - deploy

before_script:
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | sed 's/\\n/\n/g' > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - ssh-keyscan -H your_vm_ip >> ~/.ssh/known_hosts

build:
  stage: build
  script:
    - docker build -t myapp .

deploy:
  stage: deploy
  only:
    - master
  script:
    - ssh user@your_vm_ip "
	    cd /path/to/app && 
	    sudo docker stop myapp || true && 
	    sudo docker rm myapp || true && 
	    git pull origin master
	    sudo docker build -t myapp . && 
	    sudo docker run -d -p 3000:3000 --name myapp myapp
        "

Пример для GitHub:

name: CI/CD

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Build Docker image
        run: docker build -t myapp .

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: SSH into VM and deploy
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        run: |
          echo "$SSH_PRIVATE_KEY" > private_key
          chmod 600 private_key
          ssh -o StrictHostKeyChecking=no -i private_key user@your_vm_ip << 'EOF'
            cd /path/to/app
            sudo docker stop myapp || true
            sudo docker rm myapp || true
            git pull origin master
            sudo docker build -t myapp .
            sudo docker run -d -p 3000:3000 --name myapp myapp
          EOF

Шаг 6: Объяснение CI/CD файла

  1. before_script (для GitLab):
    - Получаем наш ключ из переменной и создаем файл ~/.ssh/id_rsa.
    - Устанавливаем права на файл ключа.
    - Добавляем IP адрес VM в known_hosts, чтобы избежать предупреждений о безопасности.

  2. build:
    - Проверяем, что образ собирается с помощью команды docker build.

  3. deploy:
    - Подключаемся по SSH к нашей VM.
    - Переходим в нужную директорию.
    - Останавливаем и удаляем предыдущий контейнер, если он существует.
    - Подтягиваем изменения из гита.
    - Собираем образ заново и запускаем его на порту 3000.

  4. only (для GitLab) и on: push: branches: (для GitHub):
    - Указываем, что деплой должен выполняться только на ветке master.

Заключение

Теперь у вас настроен процесс CI/CD, который автоматически развертывает ваше приложение на виртуальной машине при каждом обновлении ветки master.

Это значительно упрощает процесс развертывания и управления приложением. Следуя этому руководству, вы сможете легко настроить свою среду разработки и развертывания, используя SSH, Docker и CI/CD.

Ну и, напоминаю, строго не судите, я только учусь. Девиз всех начинашек: «работает и ладно»:‑)

Теги:
Хабы:
+10
Комментарии14

Публикации

Работа

DevOps инженер
30 вакансий

Ближайшие события