GitHub Actions — это CI/CD система, интегрированная с GitHub. В первом приближении можно думать о ней, как об аналоге TeamCity или Jenkins , предоставляемом в виде сервиса. Сервис бесплатен для открытых проектов, и даже для закрытых, если ваши билды собираются не слишком долго и/или не слишком часто.
Настроим GitHub Actions в качестве системы непрерывной интеграции для микросервиса, который ранее был описан в заметках Работа с PostgreSQL в языке Go при помощи pgx и Тестирование проектов на Go с dockertest . Для этого всего лишь нужно создать в репозитории нашего проета файл .github/workflows/run-tests.yaml следующего содержания:
on : [ push ]
# on:
# pull_request:
env :
GO_VERSION : 1.12.15
jobs :
test :
name : Run Tests
runs-on : ubuntu-latest
steps :
— name : set up go $ { { env.GO_VERSION } }
uses : actions/setup-go@v1
with :
go-version : $ { { env.GO_VERSION } }
id : go
— name : Check out code into the Go module directory
uses : actions/checkout@v1
with :
fetch-depth : 1
— name : Build
run : ./build.sh
— name : Test
run : go test -count= 1 -v ./ …
Думаю, тут безо всяких объяснений понятно, что говорится в файле. Если теперь пушнуть изменения и открыть репозиторий на GitHub’е, то в разделе Actions вы увидите , как GitHub прогоняет тесты проекта. Прошу заметить, что все превосходно работает с dockertest из коробки. Проще некуда!
Впрочем, иногда системных ресурсов агентов (здесь они называются runners), предоставляемых GitHub’ом, может быть недостаточно для задачи. В этом случае вы можете добавить собственных раннеров, развернутых либо на своем железе, либо в каком-нибудь облачном сервисе вроде AWS .
Важно! Необходимо проявлять крайнюю осторожность при добавлении собственных runner’ов в открытые репозитории. Дело в том, что человеку со стороны не составит труда создать pull request, который выполнит на вашем runner’е произвольный код.
Инструкцию по установке self-hosted runner можно найти в настройках репозитория в разделе Actions. При нажатии «Add runner» нужно выбрать ОС и CPU, после чего и появляются инструкция. В качестве ОС и CPU я выбрал Ubuntu и x64 соответственно. Раннер было решено устанавливать на дроплет в моем любимом DigitalOcean (ссылка реферальная, что она дает описано в FAQ ).
Создаем пользователя, от имени которого будет работать runner:
# добавляем его в sudoers
vim / etc / sudoers
su actions
cd
Ставим кое-какие зависимости нашего проекта:
sudo apt install gcc docker.io
sudo systemctl enable docker
sudo systemctl start docker
# разрешаем пользователю actions пользоваться Docker
sudo usermod -a -G docker actions
Наконец, ставим runner, используя команды из инструкции:
curl -O -L ВАША_ССЫЛКА_НА_АРХИВ
tar xzf ИМЯ_АРХИВА_ТГЗ
. / config.sh —url УРЛ_ВАШЕГО_РЕПОЗИТОРИЯ —token ЗДЕСЬ_ВАШ_ТОКЕН
# устанавливаем и запускаем сервис
sudo . / svc.sh install
sudo . / svc.sh start
sudo . / svc.sh status
Если все было сделано правильно, раннер появится в разделе Settings → Actions репозитория. Теперь открываем run-tests.yaml и меняем в нем единственную строчку:
runs-on : self-hosted
Пушаем, и по выводу htop
убеждаемся, что runner зашуршал.
И не забываем самое главное — добавить бейджик с состоянием тестов в README.md проекта.
Само собой разумеется, GitHub Actions можно использовать не только для прогона тестов, но также и для сборки релизов, автоматического деплоя на прод, да и вообще чего пожелаете. Подробности ищите в официальной документации сервиса.
Лично я очень доволен GitHub Actions. Это штука просто работает , и работает хорошо. Одно только не ясно. Вот сколько уже лет IT-индустрии. Почему так сразу нельзя было?
Дополнение: Продолжение темы про GitHub Actions вы найдете в посте Практика использования codecov.io в проектах на Go .