WebWost WebWostbeta

Gitea + drone.io = ❤️

Устанавливаем Gitea и Drone.io для приватного репозитория с ci/cd

Al-Sher

Всем привет! Сегодня хочу рассказать про установку системы контроля версий и непрерывной интеграции на примере Gitea и Drone.io.

Gitea

Думаю, стоит начать с описания, что же это за технологии такие. Gitea является сервисом хостинга репозиториев Git. Главное преимущество gitea - возможность установки на собственном сервере и контролировать доступы к репозиториям. Думаю, неплохое решение для приватных репозиториев кода. Конечно есть и аналоги, например, очень популярный GitLab. GitLab является достаточно мощным инструментом, но это же является и его недостатком - за счет наличия большого количества функционала, который вам может и не понадобиться в дальнейшем, GitLab потребляет большое количество системных ресурсов и значит на слабый сервер его не установить. Gitea же в этом случае намного лучше - он сосредоточен только на хранении репозиториев и образов, а значит практически не потребляет ресурсы. Установить Gitea можно различными способами, например, собрать из исходников, скачать бинарный файл или же использовать Docker образ. Можно также воспользоваться встроенным в систему пакетным менеджером и наверняка в нем тоже будет gitea, однако версия приложения будет не самой актуальной. Я же предпочитаю использовать готовые бинарники данного приложения поэтому начнем с данного метода установки.

Установка Gitea из бинарников

Указанная инструкция применялась на виртуальном сервере с Ubuntu 22.04 от clo.ru. Для начала установим всё необходимое:

apt install git wget gpg

Далее скачаем последнюю стабильную версию gitea. Для этого перейдем на страницу релизов в github: https://github.com/go-gitea/gitea/releases. На момент написания статьи, последняя версия 1.17.4, устанавливать будем её. Для этого скачаем бинарник с помощью wget, а также проверим его подпись.

wget -O https://github.com/go-gitea/gitea/releases/download/v1.17.4/gitea-1.17.4-linux-amd64
wget https://github.com/go-gitea/gitea/releases/download/v1.17.4/gitea-1.17.4-linux-amd64.asc
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
gpg --verify gitea-1.17.4-linux-amd64.asc gitea

На выходе мы должны получить сообщение, содержащее следующую строчку: `Good signature from "Teabot teabot@gitea.io"` Если все отлично, то скопируем наш бинарник к другим приложениям и дадим ему права на исполнение:

chmod +x gitea
mv ./gitea /usr/local/bin/gitea

Если всё сделано правильно, то результат команды `gitea --version` выведет актуальную версию приложения: `Gitea version 1.17.4 built with GNU Make 4.1, go1.18.9 : bindata, sqlite, sqlite_unlock_notify` Следующим шагом является создание пользователя git и настройка папок для gitea:

adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
mkdir -p /var/lib/gitea/{custom,data,log}
chown -R git:git /var/lib/gitea
chmod -R 750 /var/lib/gitea 
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea

Следующим этапом является создание сервиса для запуска gitea и сам запуск. Воспользуемся готовым кодом, а также сразу добавим в автозапуск:

wget -O gitea.service https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/systemd/gitea.service
mv gitea.service /etc/systemd/system/gitea.service
sudo systemctl enable gitea
sudo systemctl start gitea

В случае успеха вы сможете перейти по ссылке IP:3000 и попасть в веб-интерфейс для установки gitea. Существует несколько баз данных, которые поддерживаются gitea. В данном примере я воспользуюсь SQLite3, но рекомендую выбирать что-то более производительное. Порт приложения я оставлю по умолчанию 3000, но затем я буду проксировать трафик в gitea через nginx. В расширенных настройках можно указать множество различных настроек, в том числе запретить регистрацию (то что нужно для приватного git'a) У меня получились настройки как на скриншоте: Настройки gitea

Проксируем трафик через nginx

Для проксирования трафика к gitea через nginx нам потребуется установить nginx :) Для этого можно воспользоваться ранее написанной статьей: https://web-wost.ru/ustanovka-lemp-na-ubuntu В качестве конфига для gitea предлагаю использовать следующий вариант:

server {
  listen 80;
  server_name gitea.dev000.site;
  access_log /var/log/nginx/gitea.dev000.site-access.log;
  error_log /var/log/nginx/gitea.dev000.site-error.log notice;
  root /var/www/html/gitea.dev000.site;
  index index.html;

  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

Не забываем перезагрузить nginx `systemctl restart nginx` и попробовать запушить что-нибудь в наш новый git, предварительно создав репозиторий.

Drone

В GitLab изначально встроен CI/CD, реализующий непрерывную интеграцию и развертывание, в то время как в Gitea данного функционала нет вообще. Однако выход есть - Drone.io. Данное программное обеспечение предоставляет собой систему непрерывной интеграции, а существующие к нему модули позволяют обеспечить и развертывание приложение. Drone состоит из двух основных частей:

Drone и Drone runner можно установить с помощью Docker, что облегчает работу с ними. Но если вдруг вы не доверяете Docker-контейнерам, то у Drone можно взять исходники и попробовать скомпилировать приложение самому. А в качестве Drone runner можно использовать такие решения, как Docker runner, Kubernetes runner, Exec runner, SSH runner и другие. Сразу хочу сказать, что стоит располагать git и drone runner'ы на разных машинах, поскольку в процессе работы runner'ов, они могут съедать все ресурсы и мешать работе gitea(в зависимости от того, что реализовано в ci/cd). Drone рекомендует ставить его через docker образ, воспользуемся его советом и установим docker и docker-compose:

apt install docker.io docker-compose openssl

Перед тем, как начать настраивать drone, нам необходимо сгенерировать некоторые ключи для него. Начнем с создания OAuth application. Для этого зайдем по пути GITEA_HOST/user/settings/applications, где GITEA_HOST - адрес вашего gitea приложения. На данной странице есть блок "Управление приложениями OAuth2", именно он нам и нужен! Придумываем имя приложения(допустим drone-app) и указываем uri переадресации(страницу на которой будет расположен drone.io) с окончанием /login. Пример заполнения на скриншоте: Настройки oauth2 приложения После нажатия на кнопку создать приложение, gitea предоставит нам ID клиента и клиентский ключ. Их необходимо сохранить для конфигурации drone.io. Также нам необходим секретный ключ для запуска runner'ов(rpc secret). Сгенерируем его с помощью openssl:

openssl rand -hex 16

После того, как мы установили docker, создадим docker-compose файл для запуска drone и runner'а. Runner'ы можно располагать и на других машинах, главное, чтобы drone.io и runner'ы могли общаться между собой по сети. Вот пример docker-compose.yml:

version: '3.5'

services:
  drone-server:
    image: drone/drone:2
    container_name: drone-server
    ports:
      - 127.0.0.1:8080:80
      - 127.0.0.1:8081:443
    networks:
      - drone
    volumes:
      - /var/lib/drone:/data
    restart: always
    environment:
      - DRONE_GITEA_SERVER=http://gitea.dev000.site
      - DRONE_GITEA_CLIENT_ID=a727af15-1713-4bc7-a9c5-65a74cf0c5a7
      - DRONE_GITEA_CLIENT_SECRET=gto_rvs7u5p2gdmokn2aj2xjx6grytjx2u537iwsksh34oyvqj2ak5oa
      - DRONE_RPC_SECRET=7cc69b6fd46faabde4411c34f589ae2b
      - DRONE_SERVER_HOST=drone.dev000.site
      - DRONE_SERVER_PROTO=http

  drone-runner:
    image: drone/drone-runner-docker:1
    container_name: drone-runner
    ports:
      - 127.0.0.1:3001:3000
    networks:
      - drone
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=7cc69b6fd46faabde4411c34f589ae2b
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=my-first-runner

networks:
  drone:
    name: drone_network

Разберем его чуть подробнее. Сначала мы указываем, что нас интересует образ drone/drone:2. Это официальный образ drone.io. Затем мы указываем какие порты будет слушать наш контейнер. Чтобы эти порты не светились наружу (мы ведь используем nginx для проксирования трафика), также указан ip адрес 127.0.0.1. Все необходимые для drone данные мы будем хранить по пути `/var/lib/drone`. В переменных окружения мы указываем адрес до gitea сервера, а также полученные ранее id приложения, секретный ключ, хост для drone.io и секретный ключ для rpc. После того как мы закончили настройки для drone-server, переходим к drone-runner. Этот блок отвечает за установку docker runner'а от drone. Тут мы указываем образ drone/drone-runner-docker:1. Поскольку docker runner использует docker, то нам необходимо предоставить ему доступ к docker'у хоста, это делается путем указания volume `/var/run/docker.sock:/var/run/docker.sock`. В переменных окружения мы указываем по какому протоколу работает drone сервер и его хост. В качестве хоста я использую имя контейнера, что позволит обращаться к нему напрямую. Также необходимо указать сгенерированный раннее секретный ключ и имя для runner'a. Сразу же укажу конфиг для nginx:

server {
  listen 80;
  server_name drone.dev000.site;
  access_log /var/log/nginx/drone.dev000.site-access.log;
  error_log /var/log/nginx/drone.dev000.site-error.log notice;
  root /var/www/html/drone.dev000.site;
  index index.html;

  location / {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}

После того, как конфигурация docker-compose.yaml закончена, запустим докер контейнеры:

docker-compose up -d

На этом установка drone сервера завершена, можно перейти на его хост и завершить регистрацию (авторизовавшись через gitea). На странице drone будут отображены ваши репозитории: Список репозиториев drone Давайте проверим работоспособность drone runner'a. Для этого создадим простой .drone.tml файл со следующим содержимым:

kind: pipeline
name: default

steps:
  - name: test
    image: alpine
    commands:
      - echo "HELLO GITEA WITH DRONE!"

Изначально данный pipeline не запустится, так как необходимо активировать репозиторий в drone.io. После активации можно нажать "NEW BUILD", после чего наш pipeline будет запущен, а по итогу мы должны будем увидеть вывод сообщения "HELLO GITEA WITH DRONE!"

Заключение

Думаю, что на этом можно закончить данную статью. Надеюсь она окажется кому-нибудь полезной и покажет, что поднять свое приватное хранилище кода достаточно легко. Также хочу упомянуть репозиторий плагинов для drone - https://plugins.drone.io/.

0 комментариев

Новый комментарий