Files
T

4.1 KiB

build-site-with-hugo

Instaluje Hugo w podanej wersji i buduje stronę do public/.

      - uses: actions/checkout@v7
      - uses: https://git.cierzniak.it/gitea-runner/actions/build-site-with-hugo@v1
        with:
          version: '0.154.5'

Bramka jakości — ten sam build plus serwer na czas audytu:

      - uses: https://git.cierzniak.it/gitea-runner/actions/build-site-with-hugo@v1
        with:
          version: '0.154.5'
          serve-port: '8080'

      - run: pa11y-ci

args zastępuje całą listę flag, więc --gc --minify trzeba powtórzyć:

      - uses: https://git.cierzniak.it/gitea-runner/actions/build-site-with-hugo@v1
        with:
          version: '0.154.5'
          args: --gc --minify --baseURL http://localhost:8080/

Wejście

Input Wymagany Domyślnie Co to
version tak — Wersja Hugo, bez wiodącego v (np. 0.154.5)
args nie --gc --minify Pełna lista argumentów hugo
serve-port nie — Port, na którym wystawić public/. Pusty = nie serwuj

Outputów nie ma.

Akcja buduje w katalogu roboczym joba i serwuje public/ stamtąd — strona musi leżeć w głównym katalogu repo. http-server przy serve-port pochodzi z obrazu joba; bramki w wizytówkach jadą na git.cierzniak.it/gitea-runner/node-chrome:24.

Wersja bez duplikatu

version jest wymagany, więc wpisany na sztywno w workflow dubluje wersję z Dockerfile i rozjedzie się przy pierwszym bumpie obrazu. Odczytaj ją w jobie, zamiast przepisywać:

      - name: Resolve Hugo version from Dockerfile
        id: hugo
        run: |
          version="$(sed -n 's|^FROM hugomods/hugo:exts-\([0-9][0-9.]*\) .*|\1|p' Dockerfile | head -1)"
          if [ -z "$version" ]; then
            echo "Nie udało się odczytać wersji Hugo z Dockerfile (zmienił się format linii FROM?)." >&2
            exit 1
          fi
          echo "version=$version" >> "$GITHUB_OUTPUT"

      - uses: https://git.cierzniak.it/gitea-runner/actions/build-site-with-hugo@v1
        with:
          version: ${{ steps.hugo.outputs.version }}

Dockerfile zostaje wtedy jedynym źródłem prawdy, a CI audytuje dokładnie tę wersję, która jedzie na produkcję.

Dlaczego tak

Wersja przychodzi wyłącznie inputem, akcja nie zagląda do Dockerfile. Odczyt po stronie akcji wiązałby ją z konwencją budowania obrazu, której repo-konsument nie musi mieć — a to jest jedyna rzecz, jakiej Hugo do zbudowania strony nie potrzebuje. Cenę (możliwy duplikat wersji) zdejmuje wzorzec wyżej: Dockerfile dalej jest źródłem prawdy, tylko czyta go workflow.

Bez kroku weryfikującego, czy hugo version zgadza się z inputem. W lokalnych kopiach tej akcji krok istniał, bo wersja pochodziła z sed-a i trzeba było sprawdzić, czy wyrażenie coś złapało. Przy jawnym inpucie peaceiris/actions-hugo instaluje dokładnie żądaną wersję i wpycha swój katalog na początek PATH, więc asercja porównywałaby input sam ze sobą. Zostaje wąski przypadek: obraz joba z własnym Hugo, gdyby kiedyś wygrał PATH — job zbuduje się wtedy cicho inną wersją. Jeśli to wystrzeli, krok wraca.

extended: true na sztywno. Wszystkie strony na tej instancji jadą na obrazach hugomods/hugo:exts-*, czyli extended. Input dojdzie, gdy pojawi się konsument, który go potrzebuje.

args to jeden input z pełną listą flag. Kto go podaje, przejmuje całość. Dwa inputy (minify: bool plus extra-args) wymagałyby reguły, co się dzieje, gdy jeden zaprzecza drugiemu — tu takiego stanu nie ma.

Wyjście http-server idzie do /tmp/http-server.log, nie do potoku kroku. Proces w tle z otwartym stdout trzyma potok otwarty i runner czeka na EOF długo po zakończeniu audytu — w cierzniakowski-pl/wizytowka przebieg 2145 wisiał na tym do timeoutu.

Po starcie serwera leci polling curl, nie sleep. Bramka, która ruszy przed serwerem, pada na „no FCP", a ten komunikat czyta się jak problem ze stroną, nie z CI. Sześćdziesiąt prób co sekundę, potem twardy błąd z numerem portu.