Опыт применения GitHub Actions для создания CI/CD с бесплатным хостингом на Heroku

Kate

Administrator
Команда форума
В рамках изучения ЯП Golang я решил сделать учебный проект на примере telegram-бота. Для этой цели я взял популярный для создания ботов AP.

Написав реализацию нужной мне бизнес-логики, у меня возник вопрос: А как же мне его по-быстрому собрать и бесплатно развернуть?

Несколько лет назад у меня был опыт создания утилиты на Go, предназначенной для работы в качестве вспомогательного docker контейнера в AWS ECS. И тогда мне понравилась идея, собрать докер из scratch образа без каких-либо базовых образов. Но использовать сервисы AWS для своего pet-проекта я не стал из-за дополнительных хлопот с настройками доступа и ключами безопасности. Я решил попробовать появившуюся не так давно CI/CD автоматизацию github actions

Немного изучив предоставляемые CD автоматизации с хостингом, наиболее немногословным мне показалась автоматизация развертывания на heroku. И хотя опыта с ним я раньше не имел, мне хватило пары минут, чтобы зарегистрировать аккаунт на HEROKU и найти нужный для работы экшена heroku_api_key

Получился достаточно немногословный конфигурационный файл для pipeline, бОльшая часть которого была автоматически сгенерирована GitHub Actions

go.yml
name: Go

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:

build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16

- name: Build
run: CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o telegramCommandBot -ldflags '-w -s' ./...

- name: Test
run: go test -v ./...

- name: Deploy
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "telegram-command-bot"
heroku_email: ${{secrets.HEROKU_EMAIL}}
usedocker: true
docker_heroku_process_type: "worker"
env:
HD_TELEGRAM_APITOKEN: ${{secrets.TELEGRAM_APITOKEN}}

Значения переменных окружения ${{secrets.}} добавляются настройках репозитория

Единственная не очевидная вещь, которая вызвала у меня недоумение и потребовала дополнительного изучения документации - это префикс "HD_". Его требуется дописывать к декларируемым переменным окружения, чтобы heroku передавал их в окружение контейнера при запуске

Heroku позволяет деплоить docker контейнеры, для этого достаточно указать в heroku-deploy опцию:

usedocker: true
Ну и положить в корень github репозитория

Dockerfile
FROM scratch
COPY telegramCommandBot /telegramCommandBot
ADD ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/telegramCommandBot"]

Для внимательных читателей, Dockerfile
Файл со списком сертификатов ca-certificates.crt требуется для работы HTTPS вызовов, осуществляемых из приложения telegram бота. Я положил его в проект, так как докер собирается без использования базового образа и фактически не содержит ничего, кроме исполняемого telegramCommandBot в файловом пространстве имен
Несколько лет назад, я использовал базовый образ centurylink/ca-certs, но в этот раз меня смутило, что он уже не обновлялся 6 лет.
Буду благодарен читателям, если мне предложат альтернативное решение с добавлением сертификатов, не усложняя при этом Dockerfile

Заключение​

GitHub Actions + Heroku предоставляют простые в настройке бесплатные и удобные инструменты для создания CI/CD вашего pet-проекта.

Исходный код проекта можно посмотреть тут.

 
Сверху