Оптимизация публикации сайта
После того, как перешел к размещению сайта с помощью 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 "action@github.com"
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 примерно. И самое главное, деплой теперь не вносит изменения в основной репозиторий и не влияет на его размер.