В рамках изучения ЯП 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-проекта.

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

Комментарии (0)