Автоматизируйте просто с помощью Webhook

Автоматизируйте просто с помощью Webhook

24 марта 2023 г.

Вы когда-нибудь хотели запустить произвольный скрипт из любого места с гибкой аутентификацией? Позвольте представить вам веб-перехватчик!

Я покажу вам, как настроить мой блог для автоматического отображения и развертывания каждый раз, когда я нажимаю master. на экземпляре Gitea.

Установить

Установите Webhook на машине, на которой вы хотите выполнять автоматическое действие.

Загрузите двоичный файл Webhook или создайте его самостоятельно.

$ go get github.com/adnanh/webhook

Конфигурация

Создайте hooks.json и папку для хранения всего.

$ mkdir webhook && cd webhook
$ touch hooks.json

Внутри hooks.json скопируйте этот шаблон и обновите расположение скрипта, который вы хотите выполнить.

[
  {
    "id": "redeploy-blog",
    "execute-command": "/home/arran/hugo_websites/redeploy.sh",
    "command-working-directory": "/home/arran/",
  }
]

Для любопытных, вот что внутри моего redeploy.sh.

#!/bin/env bash

REPO="${HOME}/hugo_websites/by.arran.nz/"

git -C ${REPO} fetch && git -C ${REPO} rebase
git -C ${REPO} submodule update --remote --rebase  
HUGO_CACHEDIR=${HOME}/tmp hugo --cleanDestinationDir --destination /var/www/virtual/${USER}/html --source ${REPO}

Бег

Я размещаю мой блог на Uberspace , а Uberspace использует Supervisor для управления службами.

Если вы не используете Uberspace, запустите Webhook любым доступным способом на своем компьютере.

webhook -hooks hooks.json -logfile out.log -hotreload

Начальник

Чтобы создать новую службу, создайте файл, расположенный по адресу ~/etc/services.d/webook.ini.

[program:webhook]
directory=%(ENV_HOME)s/webhook
autostart=true
autorestart=true
startretries=3
command=/home/arran/go/bin/webhook -hooks hooks.json -logfile out.log -hotreload

После создания конфигурации попросите супервизора обновить конфигурацию и запустить службу:

$ superviserctl reread
$ superviserctl update
$ supervisorctl status
webhook                          RUNNING   pid 13102, uptime 0:35:37

Дополнительные сведения см. в руководстве супервизора Uberspace.

Uberspace Серверная часть

Если вы используете Uberspace, настройте серверную часть Uberspace. указать порт 80 на Webhook, работающий под портом 9000. Это по умолчанию.

$ uberspace web backend set arran.uber.space --http --port 9000
Set backend for arran.uber.space/ to port 9000; please make sure something is listening!
You can always check the status of your backend using "uberspace web backend list".

Для получения дополнительной информации ознакомьтесь с Руководством по Uberspace

.

Проверка работоспособности

Теперь, когда служба запущена и доступна в Интернете, протестируйте ее.

Учитывая, что веб-перехватчик называется redeploy-blog, отправьте POST по адресу:

$ curl -X POST https://arran.uber.space/hooks/redeploy-blog

Убедитесь, что веб-перехватчик прошел успешно, проверив журналы, расположенные в ~/webhook/out.log, как указано в webhook.ini.

$ cat out.log
...
[webhook] 2020/11/17 13:24:05 [7f6850] redeploy-blog got matched
[webhook] 2020/11/17 13:24:05 [7f6850] redeploy-blog hook triggered successfully
...

Защитите веб-перехватчик 🔐

<цитата>

Примечание. Перед выполнением этого шага обязательно настройте Webhook с https. отправка ваших секретов через http!

Возможно, вы заметили, что любой может вызвать этот Webhook. Давайте это исправим.

Git-репозиторий моего блога в настоящее время размещен на Codeberg, который является экземпляром Gitea. Настройте Webhook для чтения secret из Gitea экземпляр.

Добавьте trigger-rule в hooks.json, который мы создали ранее — замените секрет своим собственным.

[
  {
    "id": "redeploy-blog",
    "execute-command": "/home/arran/hugo_websites/redeploy.sh",
    "command-working-directory": "/home/arran/",
    "trigger-rule":
    {
      "and":
      [
        {
          "match":
          {
            "type": "value",
            "value": "____GITEA_SECRET____",
            "parameter":
            {
              "source": "payload",
              "name": "secret"
            }
          }
        },
        {
          "match":
          {
            "type": "value",
            "value": "refs/heads/master",
            "parameter":
            {
              "source": "payload",
              "name": "ref"
            }
          }
        }
      ]
    }
  }
]

Теперь Webhook разрешает выполнение только в том случае, если запрос соответствует триггерному правилу.

Дополнительные примеры см. в примерах ловушек.

Настройка Gitea

Перейдите к репозиторию вашего экземпляра Gitea Repo > Настройки > Webhooks, введите URL и секрет, и все готово!

Расслабьтесь

Теперь каждый раз, когда вы отправляете master в репозиторий Gitea, будет вызываться Webhook. - Еще одна вещь автоматизирована.

Я надеюсь, что вы сможете обобщить эту информацию и добавить Webhook в свой набор инструментов, когда в будущем вам понадобится автоматизировать что-то простое.


Никакой связи с Uberspace или Codeberg — но я могу порекомендуйте их!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE