В рамках изучения ЯП 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-проекта.
Исходный код проекта можно посмотреть тут.