Skip to content

Build HackerOS

Build HackerOS #56

Workflow file for this run

name: Build HackerOS
on:
workflow_dispatch:
inputs:
edition:
description: "Edycja HackerOS do zbudowania (tylko przy ręcznym uruchomieniu). Atomic i cybersecurity-default budują się przez osobny workflow: build-immutable.yml"
required: false
default: "official"
type: choice
options:
- official
- all
- monthly
- gaming
- cybersecurity
- blue
- hydra
- lts
- gnome
- xfce
- nvidia
push:
branches: [ "official", "cybersecurity" ]
env:
# Wersja Lua do zbudowania ze źródeł (na dzień pisania tego workflow Lua 5.5
# nie ma jeszcze paczki w repozytoriach Ubuntu, więc kompilujemy ją ręcznie).
LUA_VERSION: "5.5.0"
# Patrz identyczny komentarz w .github/workflows/build-container.yml -- ten
# workflow ma DODATKOWO trigger "push" na dwa branche i macierz wielu
# edycji naraz (job "build"), więc kolejne szybkie pushe potrafią spiętrzyć
# jeszcze więcej równoległych/kolejkowanych jobów niż gdziekolwiek indziej
# w tym repo. "cancel-in-progress" anuluje CAŁY poprzedni, nieaktualny run
# (wszystkie jego joby macierzy) w momencie startu nowego dla tego samego
# brancha/inputu.
concurrency:
group: build-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
setup:
runs-on: ubuntu-24.04
outputs:
editions: ${{ steps.set-matrix.outputs.editions }}
edition_input: ${{ steps.set-matrix.outputs.edition_input }}
steps:
- name: Wyznaczenie listy edycji do zbudowania
id: set-matrix
run: |
# Edycje "official"
OFFICIAL_EDITIONS='["official","gaming","blue","hydra","lts","gnome","xfce","nvidia"]'
# Edycje "cybersecurity" - od teraz budowane na TYM SAMYM branchu co
# reszta (helpers/cybersecurity żyje w repo obok pozostałych
# helpers/*, nie na osobnym branchu). "cybersecurity-default" NIE
# jest tu wliczone -- ta edycja (razem z "atomic") buduje się przez
# osobny workflow: build-immutable.yml (nie używa live-build).
CYBERSECURITY_EDITIONS='["cybersecurity"]'
ALL_EDITIONS='["official","gaming","cybersecurity","blue","hydra","lts","gnome","xfce","nvidia"]'
# Opcja "monthly" (uruchamiana ręcznie raz w miesiącu) - buduje tylko
# official, cybersecurity i nvidia.
MONTHLY_EDITIONS='["official","cybersecurity","nvidia"]'
EDITION_INPUT="${{ github.event.inputs.edition }}"
echo "edition_input=$EDITION_INPUT" >> "$GITHUB_OUTPUT"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
EDITION="${{ github.event.inputs.edition }}"
if [ -z "$EDITION" ]; then
EDITION="official"
fi
if [ "$EDITION" = "all" ]; then
# Opcja "all" - buduje każdą edycję osobno, każda na czystym
# (świeżym) środowisku runnera, jedna po drugiej.
echo "editions=$ALL_EDITIONS" >> "$GITHUB_OUTPUT"
elif [ "$EDITION" = "monthly" ]; then
# Opcja "monthly" - miesięczny build: official + cybersecurity + nvidia.
echo "editions=$MONTHLY_EDITIONS" >> "$GITHUB_OUTPUT"
else
echo "editions=[\"$EDITION\"]" >> "$GITHUB_OUTPUT"
fi
elif [ "${{ github.ref_name }}" = "cybersecurity" ]; then
# Push na branch "cybersecurity" - budujemy tylko edycje cybersecurity.
echo "editions=$CYBERSECURITY_EDITIONS" >> "$GITHUB_OUTPUT"
else
# Push na branch "official" - budujemy wszystkie edycje "official"
# (cybersecurity* trzeba zbudować ręcznie przez workflow_dispatch
# albo push na branch "cybersecurity").
echo "editions=$OFFICIAL_EDITIONS" >> "$GITHUB_OUTPUT"
fi
build:
needs: setup
runs-on: ubuntu-24.04
timeout-minutes: 360
strategy:
fail-fast: false
# Każda edycja buduje się na osobnym, czystym runnerze GitHub Actions
# (świeże środowisko dla każdej pozycji macierzy), więc kolejne
# buildy nie dziedziczą żadnego stanu po poprzednich.
matrix:
edition: ${{ fromJson(needs.setup.outputs.editions) }}
steps:
- name: Checkout repozytorium
uses: actions/checkout@v4
with:
# POPRAWKA: cybersecurity / cybersecurity-default nie są już
# przypięte do osobnego brancha "cybersecurity" - build-hackeros-cybersecurity*
# i helpers/cybersecurity* żyją w tym samym repo/branchu co reszta,
# więc dla wszystkich edycji checkoutujemy zwyczajnie ten
# branch/commit, który wyzwolił bieżący workflow run.
ref: ${{ github.ref }}
- name: Odczyt wersji z config.hk
id: version
run: |
VERSION=$(awk -F'=>' '/version[[:space:]]*=>/ { gsub(/[[:space:]]/, "", $NF); print $NF }' config.hk | head -n1)
if [ -z "$VERSION" ]; then
echo "Nie udało się odczytać wersji z ./config.hk (oczekiwany format: 'version => X.Y' pod [metadata])" >&2
exit 1
fi
echo "Wersja odczytana z config.hk: $VERSION"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Aktualizacja listy pakietów
run: sudo apt-get update
- name: Instalacja podstawowych narzędzi
run: |
sudo apt-get install -y --no-install-recommends \
tar \
git \
curl \
ca-certificates \
build-essential \
make \
gcc \
libreadline-dev
- name: Instalacja Pythona 3.13 (deadsnakes PPA)
run: |
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install -y python3.13 python3.13-venv python3.13-dev
- name: Budowa i instalacja Lua ${{ env.LUA_VERSION }} ze źródeł
run: |
curl -fL -o "lua-${LUA_VERSION}.tar.gz" \
"https://www.lua.org/ftp/lua-${LUA_VERSION}.tar.gz"
tar -xzf "lua-${LUA_VERSION}.tar.gz"
cd "lua-${LUA_VERSION}"
make linux -j"$(nproc)"
sudo make install
cd ..
# Domyślny "make install" Lua instaluje binarki jako `lua`/`luac`
# (bez numeru wersji), a nasz workflow oraz build.lua wywołują
# jawnie `lua5.5`. Tworzymy symlinki, żeby `lua5.5`/`luac5.5`
# wskazywały na świeżo zbudowaną instalację.
sudo ln -sf "$(command -v lua)" /usr/local/bin/lua5.5
sudo ln -sf "$(command -v luac)" /usr/local/bin/luac5.5
hash -r
lua5.5 -v
- name: Instalacja live-build (najnowsza wersja ze źródeł Debian Live Team) i narzędzi do tworzenia obrazu ISO
run: |
sudo apt-get install -y --no-install-recommends \
debootstrap \
debian-archive-keyring \
squashfs-tools \
xorriso \
isolinux \
syslinux-common \
syslinux-efi \
dosfstools \
mtools \
grub-pc-bin \
grub-efi-amd64-bin \
grub-efi-ia32-bin \
mtd-utils \
build-essential \
devscripts \
debhelper \
po4a
# Pakiet "live-build" z repozytoriów Ubuntu jest zamrożony na
# bardzo starej gałęzi 3.0~a57 (z ok. 2012 roku) i nie ma wielu
# opcji obecnych w aktualnym live-build (np. --debootstrap-options).
# Budujemy najnowszą wersję wprost ze źródeł Debian Live Team
# (ta sama gałąź, z której pochodzi pakiet w Debianie - obecnie
# w testing/unstable), żeby mieć aktualne zachowanie i opcje.
rm -rf /tmp/live-build-src
git clone --depth 1 https://salsa.debian.org/live-team/live-build.git /tmp/live-build-src
cd /tmp/live-build-src
dpkg-buildpackage -b -uc -us
cd ..
sudo apt-get remove -y live-build || true
sudo dpkg -i live-build_*.deb
lb --version
- name: Uruchomienie build.lua (edycja - ${{ matrix.edition }})
run: |
chmod +x build.lua
if [ "${{ matrix.edition }}" = "official" ]; then
lua5.5 build.lua
else
lua5.5 build.lua --${{ matrix.edition }}
fi
- name: Wyszukanie zbudowanych obrazów ISO
id: find_iso
run: |
echo "iso_found=$(find . -maxdepth 3 -iname '*.iso' | head -n1)" >> "$GITHUB_OUTPUT"
- name: Zmiana nazwy obrazu ISO
id: rename_iso
if: steps.find_iso.outputs.iso_found != ''
run: |
SRC="${{ steps.find_iso.outputs.iso_found }}"
DEST="HackerOS-V${{ steps.version.outputs.version }}-${{ matrix.edition }}.iso"
mv -- "$SRC" "$DEST"
echo "Zmieniono nazwę: $SRC -> $DEST"
echo "iso_path=$DEST" >> "$GITHUB_OUTPUT"
- name: Wygenerowanie sum kontrolnych obrazu ISO (SHA256 / SHA512)
id: checksums
if: steps.find_iso.outputs.iso_found != ''
run: |
ISO="${{ steps.rename_iso.outputs.iso_path }}"
sha256sum "$ISO" > "${ISO}.sha256sum"
sha512sum "$ISO" > "${ISO}.sha512sum"
echo "--- ${ISO}.sha256sum ---"
cat "${ISO}.sha256sum"
echo "--- ${ISO}.sha512sum ---"
cat "${ISO}.sha512sum"
- name: Wgranie ISO jako artefaktu builda
if: steps.find_iso.outputs.iso_found != ''
uses: actions/upload-artifact@v4
with:
name: HackerOS-V${{ steps.version.outputs.version }}-${{ matrix.edition }}
path: |
${{ steps.rename_iso.outputs.iso_path }}
${{ steps.rename_iso.outputs.iso_path }}.sha256sum
${{ steps.rename_iso.outputs.iso_path }}.sha512sum
if-no-files-found: warn
package-all:
needs: [setup, build]
if: needs.setup.outputs.edition_input == 'all'
runs-on: ubuntu-24.04
steps:
- name: Checkout repozytorium (do odczytu wersji z config.hk)
uses: actions/checkout@v4
- name: Odczyt wersji z config.hk
id: version
run: |
VERSION=$(awk -F'=>' '/version[[:space:]]*=>/ { gsub(/[[:space:]]/, "", $NF); print $NF }' config.hk | head -n1)
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Pobranie wszystkich zbudowanych obrazów ISO
uses: actions/download-artifact@v4
with:
pattern: "HackerOS-V*-*"
path: all-isos
merge-multiple: true
- name: Spakowanie wszystkich ISO do jednego archiwum ZIP
run: |
cd all-isos
ls -la
zip -X "../HackerOS-V${{ steps.version.outputs.version }}-all.zip" *.iso *.sha256sum *.sha512sum
- name: Wgranie zbiorczego archiwum ZIP jako artefaktu builda
uses: actions/upload-artifact@v4
with:
name: HackerOS-V${{ steps.version.outputs.version }}-all
path: HackerOS-V${{ steps.version.outputs.version }}-all.zip
if-no-files-found: error