GHA FTW
Monday, 25 Dec 2023
Я стараюсь не разводить у себя на домашней машине лишних окружений. Виртуальная машина — как проститутка: легкодоступна, но для настоящего секса малопригодна. Докер был придуман, чтобы оправдать бессмысленную профессию «девопс», сделать Безоса еще богаче и сделать возможным и без того довольно тривиальный процесс разработки — доступным совсем уж дурачкам.
С другой стороны, облака — никуда не годятся для хранения данных, но для делегирования производственных мощностей — подходят идеально. Так почему бы не перепоручить сторонним сервисам всю рутину?
Вот, например, этот блог. Я не терплю «движки», потому что нет никаких причин гонять процессор (пусть и не мой, а облачный) — каждый раз, когда кто-то захотел приобщиться к великому. Карбоновый след, глобальное потепление, Грета Тунберг, — они мне все, разумеется, до фени, но для сайта с текстами — правильный формат один: html
. Шаблонами на похапе пускай недоделанные бэкендеры ворочают. Да, я знаю про кеш, нет, это неправильное решение.
С другой стороны, хочется публиковаться в одно действие, а не отвлекаться на рутину. Это одно действие должно сохранить файл и опубликовать все повсюду. Ну, сохранить файл — это гитхаб. Значит, опубликовать — это Github Actions. Ну и в мастодон тиснуть анонс будет не лишнее.
name: 🚀 Build and Deploy on Push
on: [push]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
MIX_ENV: dev
name: 💡 AmbMent Publishing
strategy:
fail-fast: true
matrix:
include:
- pair:
otp: 26.2
elixir: 1.16
steps:
- name: 🚚 Get latest code
uses: actions/checkout@v4
- name: 💧 Install OTP ${{matrix.pair.otp}} / Elixir ${{matrix.pair.elixir}}
uses: erlef/setup-elixir@v1
with:
otp-version: ${{matrix.pair.otp}}
elixir-version: ${{matrix.pair.elixir}}
- name: 📜 Install Node
uses: actions/setup-node@v4
with:
node-version: 18
- name: 💧 Build static site
run: |
mix do deps.get, deps.compile, compile
mix serum.build
- name: 🔎 Build Pagefind Index
run: |
npx -y pagefind --site "site"
- name: 📂 Sync files
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
with:
server: ${{ secrets.AMBMENT_DOMAIN }}
username: ${{ secrets.AMBMENT_USER }}
password: ${{ secrets.AMBMENT_PASS }}
local-dir: "./site/"
server-dir: "./datos/web/"
dry-run: false
- name: 🐘 Cross-post to Mastodon
if: "contains(github.event.head_commit.message, ':elephant:')"
env:
AUTH_TOKEN: ${{ secrets.MASTODON_ACCESS_TOKEN }}
MESSAGE: ${{ github.event.head_commit.message }}
run: |
npm i mastodon
npm i glob
node toot_it.js
Еще я специальным образом облегчил себе жизнь при наборе текста: мой парсер маркдауна настолько расширяемый под мои нужды, что я могу любые теги с любыми атрибутами — буквально повесить на «горячие клавиши». Например, для верхнего индекса я использую N^2^
, а для выравнивания по центру — ⇒ по центру ⇐
. Но об этом как-нибудь в другой раз.
В среднем, я просто пишу текст, и добавляю файл с текстом в репозиторий. А дальше оно там само: индекс поиска перестроит, выложит все на ftp
, оповестит читателей через мастодон.