Оптимизация публикации сайта

#github #web

После того, как перешел к размещению сайта с помощью Github Pages, стал обращать внимание на то, что каждый чекаут репозитория стал проходить довольно тяжело. Исходный код сайта размещается в мастер-ветке. Результат генерации в другой. И так как результат постоянно меняется, обновление выходит существенным.

Так как часто обращаюсь к исходному коду на телефоне, это приносит проблемы. Решил попробовать разместить результат генерации в отдельном репозитории, отделив исходный код от результата. И как оказалось, это не так сложно.

Во время перехода пришлось вывести сайт в нерабочее состояние примерно на 10-15 минут. Так как приходилось выключать опции использования Github Pages в одном репозитории и включать на другом. Но даунтайм вышел небольшой.

Во-первых, как оказалось, при использовании стандартного образа ubuntu-latest в поставку уже входит git. И для того, чтобы провести чекаут репозитория или закомитить изменения, совершенно не нужно использовать сторонние actions, которые часто собирают новый docker-образ и затем запускают его. Что значительно сказывается на производительности сборки.

Во-вторых, github actions по сути во многом не нужны, гораздо проще прописать то, что нужно сделать самому. В результате вышел следующий код:

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Chekout
        run: |
          git clone https://github.com/juev/juev.org.git juev.org
      - name: Setup Hugo
      - name: Build
      - name: Deploy
        run: |
          cd juev.org/public
          git init
          git add .
          git config --local user.email "[email protected]"
          git config --local user.name "GitHub Action"
          git commit -m "Deploy to Github Pages"
          git push --force --set-upstream "https://${{ secrets.GITHAB_TOKEN }}@github.com/juev/juevorg-public.git" master > /dev/null 2>&1

Оставил только шаги чекаута и деплоя. Полный код можно найти в репозитории проекта: gh-pages.yml.

Первым шагом производим чекаут в директорию, при этом использую имя, соответствующее имени репозитория, хотя на деле это ни на что не влияет. Во время сборки сайта первым действием нужно будет перейти в эту директорию.

Во время деплоя просто переходим в директорию с результатом, инициализируем репозиторий, комитим изменения и затем отправляем в определенный репозиторий, передавая в ссылке токен Github, что будет использоваться для авторизации.

Собственно все, просто? Да, очень просто. И при этом не нужно собирать каждый раз новые докер-образы и запускать их для совершения простых операций. Время сборки и деплоя при этом сократилось с 1:20 до 0:50 примерно. И самое главное, деплой теперь не вносит изменения в основной репозиторий и не влияет на его размер.