Alek�ei Matiu�hkin

сделано с умом



GHA FTW

Monday, 25 Dec 2023 Tags: 2023tech

Я стараюсь не разводить у себя на домашней машине лишних окружений. Виртуальная машина — как проститутка: легкодоступна, но для настоящего секса малопригодна. Докер был придуман, чтобы оправдать бессмысленную профессию «девопс», сделать Безоса еще богаче и сделать возможным и без того довольно тривиальный процесс разработки — доступным совсем уж дурачкам.

С другой стороны, облака — никуда не годятся для хранения данных, но для делегирования производственных мощностей — подходят идеально. Так почему бы не перепоручить сторонним сервисам всю рутину?

Вот, например, этот блог. Я не терплю «движки», потому что нет никаких причин гонять процессор (пусть и не мой, а облачный) — каждый раз, когда кто-то захотел приобщиться к великому. Карбоновый след, глобальное потепление, Грета Тунберг, — они мне все, разумеется, до фени, но для сайта с текстами — правильный формат один: 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, оповестит читателей через мастодон.


  ¦