Skip to content

Commit 87ba88d

Browse files
authored
Create build.yml
1 parent da33b29 commit 87ba88d

1 file changed

Lines changed: 262 additions & 0 deletions

File tree

.github/workflows/build.yml

Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
name: Build (self-hosted, stage0 bootstrap)
2+
3+
# Buduje `hackerc` i `virus` W CALOSCI ZE ZRODEL HackerScript
4+
# (hackerc/cmd/*.hcs, virus/cmd/*.hcs) - NIE z Pythona/PyInstallera jak
5+
# `.github/workflows/release.yml` (ktory jest dzis STARY, patrz uwaga
6+
# na dole tego pliku).
7+
#
8+
# Kluczowy problem samo-hostowania: zeby SKOMPILOWAC hackerc napisany
9+
# w HackerScript, potrzeba JUZ DZIALAJACEGO hackerc ("stage0") -
10+
# pobieranego z GitHub Releases (dokladnie ten sam mechanizm co
11+
# `using <wersja>` w virus/cmd/hackerc_bridge.hcs, patrz tam).
12+
#
13+
# Zasada wyboru wersji stage0 (patrz job `resolve-versions` ponizej):
14+
# - Virus.hk "using => 0.1" -> stage0 = 0.0.1 (SPECJALNY przypadek:
15+
# 0.1 to PIERWSZE self-hostujace sie wydanie, wiec jedynym istnie-
16+
# jacym wczesniejszym kompilatorem jest zamrozona wersja startowa
17+
# 0.0.1 - nie ma "0.0" jako osobnego wydania)
18+
# - Virus.hk "using => 0.N" (N > 1) -> stage0 = 0.(N-1), np. 0.5 -> 0.4
19+
#
20+
# Lancuch budowania (DWIE osobne kompilacje, KAZDA innym kompilatorem):
21+
# stage0 (pobrany, wersja N-1)
22+
# -> kompiluje hackerc/cmd/cli.hcs -> `hackerc` (wersja N, SWIEZO zbudowany)
23+
# swiezo zbudowany hackerc (wersja N, NIE stage0!)
24+
# -> kompiluje virus/cmd/main.hcs -> `virus` (wersja N)
25+
26+
on:
27+
push:
28+
branches: [main]
29+
paths:
30+
- "hackerc/**"
31+
- "virus/**"
32+
- "libs/**"
33+
- "Virus.hk"
34+
- ".github/workflows/build.yml"
35+
pull_request:
36+
paths:
37+
- "hackerc/**"
38+
- "virus/**"
39+
- "libs/**"
40+
- "Virus.hk"
41+
- ".github/workflows/build.yml"
42+
workflow_dispatch:
43+
inputs:
44+
version_override:
45+
description: "Wymus wersje docelowa (pomija odczyt '-> using => ...' z Virus.hk), np. 0.5"
46+
required: false
47+
default: ""
48+
49+
concurrency:
50+
group: build-${{ github.ref }}
51+
cancel-in-progress: true
52+
53+
jobs:
54+
# ---------------------------------------------------------------------
55+
# 0. Ustal wersje docelowa (z Virus.hk albo z recznego wymuszenia) i
56+
# wyprowadz z niej wersje stage0 wg zasady opisanej na gorze pliku.
57+
# ---------------------------------------------------------------------
58+
resolve-versions:
59+
name: Ustal wersje docelowa + stage0
60+
runs-on: ubuntu-latest
61+
outputs:
62+
version: ${{ steps.resolve.outputs.version }}
63+
stage0_version: ${{ steps.resolve.outputs.stage0_version }}
64+
stage0_url: ${{ steps.resolve.outputs.stage0_url }}
65+
is_root_bootstrap: ${{ steps.resolve.outputs.is_root_bootstrap }}
66+
steps:
67+
- uses: actions/checkout@v4
68+
69+
- name: Odczytaj wersje i wylicz stage0
70+
id: resolve
71+
shell: bash
72+
run: |
73+
set -euo pipefail
74+
75+
if [ -n "${{ github.event.inputs.version_override }}" ]; then
76+
VERSION="${{ github.event.inputs.version_override }}"
77+
echo "Wersja wymuszona recznie (workflow_dispatch): $VERSION"
78+
else
79+
# Pole "-> using => X.Y" w [package] (patrz Virus.hk) deklaruje
80+
# wersje hackerc, ktora MA POWSTAC z tego builda - dokladnie
81+
# ten sam format, ktory czyta virus/cmd/hackerc_bridge.hcs.
82+
VERSION="$(grep -E '^\s*->\s*using\s*=>' Virus.hk \
83+
| head -n1 \
84+
| sed -E 's/^\s*->\s*using\s*=>\s*//' \
85+
| tr -d '[:space:]')"
86+
echo "Wersja odczytana z Virus.hk ('-> using => ...'): $VERSION"
87+
fi
88+
89+
if [ -z "$VERSION" ]; then
90+
echo "::error::nie udalo sie ustalic wersji (brak '-> using => ...' w Virus.hk i brak version_override)"
91+
exit 1
92+
fi
93+
94+
# 0.0.1 to ZAMROZONA wersja startowa sprzed bootstrapu (Python,
95+
# patrz README.adoc, sekcja "Historia wersji") - nie jest
96+
# budowana przez TEN pipeline (self-hosted), tylko historyczna
97+
# PyInstaller-owa sciezke z release.yml. Nic dalej do zrobienia.
98+
if [ "$VERSION" = "0.0.1" ]; then
99+
echo "Wersja docelowa to 0.0.1 (korzen bootstrapu, Python) - nie ma stage0, nic do zbudowania w tym workflow."
100+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
101+
echo "stage0_version=" >> "$GITHUB_OUTPUT"
102+
echo "stage0_url=" >> "$GITHUB_OUTPUT"
103+
echo "is_root_bootstrap=true" >> "$GITHUB_OUTPUT"
104+
exit 0
105+
fi
106+
107+
if [ "$VERSION" = "0.1" ]; then
108+
# Jedyny przypadek specjalny - patrz uzasadnienie na gorze pliku.
109+
STAGE0="0.0.1"
110+
else
111+
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+$ ]]; then
112+
echo "::error::nieobslugiwany format wersji '$VERSION' (oczekiwano MAJOR.MINOR, np. 0.5, albo dokladnie '0.0.1')"
113+
exit 1
114+
fi
115+
MAJOR="${VERSION%%.*}"
116+
MINOR="${VERSION#*.}"
117+
if [ "$MINOR" -le 0 ]; then
118+
echo "::error::nie umiem wyliczyc stage0 dla '$VERSION' (MINOR musi byc > 0, chyba ze VERSION = 0.1 - patrz przypadek specjalny wyzej)"
119+
exit 1
120+
fi
121+
PREV_MINOR=$((MINOR - 1))
122+
if [ "$MAJOR" = "0" ] && [ "$PREV_MINOR" -eq 0 ]; then
123+
# Nieosiagalne w praktyce (VERSION="0.1" jest juz zlapane
124+
# wyzej), zostawione jako siatka bezpieczenstwa.
125+
STAGE0="0.0.1"
126+
else
127+
STAGE0="${MAJOR}.${PREV_MINOR}"
128+
fi
129+
fi
130+
131+
STAGE0_URL="https://github.com/HackerOS-Linux-System/HackerScript/releases/download/v${STAGE0}/hackerc"
132+
133+
echo "Wersja docelowa: $VERSION"
134+
echo "Stage0 (kompilator uzyty do zbudowania $VERSION): $STAGE0"
135+
echo "URL stage0: $STAGE0_URL"
136+
137+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
138+
echo "stage0_version=$STAGE0" >> "$GITHUB_OUTPUT"
139+
echo "stage0_url=$STAGE0_URL" >> "$GITHUB_OUTPUT"
140+
echo "is_root_bootstrap=false" >> "$GITHUB_OUTPUT"
141+
142+
# ---------------------------------------------------------------------
143+
# 1. stage0 (pobrany) kompiluje hackerc/cmd/cli.hcs -> nowa binarka
144+
# `hackerc` w wersji docelowej.
145+
# ---------------------------------------------------------------------
146+
build-hackerc:
147+
name: "Etap 1/2: stage0 (${{ needs.resolve-versions.outputs.stage0_version }}) buduje hackerc ${{ needs.resolve-versions.outputs.version }}"
148+
needs: resolve-versions
149+
if: needs.resolve-versions.outputs.is_root_bootstrap == 'false'
150+
runs-on: ubuntu-latest
151+
steps:
152+
- uses: actions/checkout@v4
153+
154+
- uses: dtolnay/rust-toolchain@stable
155+
156+
- name: Pobierz stage0 (hackerc ${{ needs.resolve-versions.outputs.stage0_version }})
157+
shell: bash
158+
run: |
159+
set -euo pipefail
160+
curl -L --fail --progress-bar \
161+
-A "hackerscript-build-yml/1.0 (+https://github.com/HackerOS-Linux-System/HackerScript)" \
162+
-o stage0-hackerc \
163+
"${{ needs.resolve-versions.outputs.stage0_url }}"
164+
chmod +x stage0-hackerc
165+
./stage0-hackerc --version || echo "(stage0 nie obsluguje --version - kontynuuje)"
166+
167+
- name: "stage0 -> transpiluje hackerc/cmd/cli.hcs do crate'a Rust"
168+
shell: bash
169+
run: |
170+
set -euo pipefail
171+
./stage0-hackerc build hackerc/cmd/cli.hcs \
172+
-o hackerc/cmd/target-hcs \
173+
--crate-name hackerc
174+
175+
- name: cargo build --release (crate wygenerowany przez stage0)
176+
working-directory: hackerc/cmd/target-hcs
177+
run: cargo build --release
178+
179+
- name: Sanity - swiezo zbudowany hackerc dziala
180+
run: |
181+
./hackerc/cmd/target-hcs/target/release/hackerc --version || true
182+
./hackerc/cmd/target-hcs/target/release/hackerc check docs/hello-world/cmd/main.hcs
183+
184+
- uses: actions/upload-artifact@v4
185+
with:
186+
name: hackerc-${{ needs.resolve-versions.outputs.version }}
187+
path: hackerc/cmd/target-hcs/target/release/hackerc
188+
if-no-files-found: error
189+
190+
# ---------------------------------------------------------------------
191+
# 2. Swiezo zbudowany hackerc (NIE stage0!) kompiluje virus/cmd/main.hcs
192+
# -> binarka `virus` w tej samej wersji docelowej.
193+
# ---------------------------------------------------------------------
194+
build-virus:
195+
name: "Etap 2/2: hackerc ${{ needs.resolve-versions.outputs.version }} (swiezy) buduje virus"
196+
needs: [resolve-versions, build-hackerc]
197+
runs-on: ubuntu-latest
198+
steps:
199+
- uses: actions/checkout@v4
200+
201+
- uses: dtolnay/rust-toolchain@stable
202+
203+
- uses: actions/download-artifact@v4
204+
with:
205+
name: hackerc-${{ needs.resolve-versions.outputs.version }}
206+
path: fresh-hackerc
207+
208+
- name: Nadaj prawa wykonywania swiezo zbudowanemu hackerc
209+
run: chmod +x fresh-hackerc/hackerc
210+
211+
- name: "hackerc ${{ needs.resolve-versions.outputs.version }} -> transpiluje virus/cmd/main.hcs do crate'a Rust"
212+
shell: bash
213+
run: |
214+
set -euo pipefail
215+
./fresh-hackerc/hackerc build virus/cmd/main.hcs \
216+
-o virus/cmd/target-hcs \
217+
--crate-name virus
218+
219+
- name: cargo build --release (crate wygenerowany przez hackerc ${{ needs.resolve-versions.outputs.version }})
220+
working-directory: virus/cmd/target-hcs
221+
run: cargo build --release
222+
223+
- name: Sanity - swiezo zbudowany virus dziala
224+
run: ./virus/cmd/target-hcs/target/release/virus --help || true
225+
226+
- uses: actions/upload-artifact@v4
227+
with:
228+
name: virus-${{ needs.resolve-versions.outputs.version }}
229+
path: virus/cmd/target-hcs/target/release/virus
230+
if-no-files-found: error
231+
232+
# ---------------------------------------------------------------------
233+
# 3. Podsumowanie widoczne w zakladce Summary danego uruchomienia.
234+
# ---------------------------------------------------------------------
235+
summary:
236+
name: Podsumowanie
237+
needs: [resolve-versions, build-hackerc, build-virus]
238+
if: always() && needs.resolve-versions.outputs.is_root_bootstrap == 'false'
239+
runs-on: ubuntu-latest
240+
steps:
241+
- name: Wypisz lancuch bootstrapu
242+
run: |
243+
{
244+
echo "### Lancuch bootstrapu"
245+
echo ""
246+
echo "| Etap | Kompilator | Zrodlo | Wynik |"
247+
echo "|---|---|---|---|"
248+
echo "| 1 | stage0 \`${{ needs.resolve-versions.outputs.stage0_version }}\` (pobrany z Releases) | \`hackerc/cmd/cli.hcs\` | \`hackerc\` \`${{ needs.resolve-versions.outputs.version }}\` |"
249+
echo "| 2 | \`hackerc\` \`${{ needs.resolve-versions.outputs.version }}\` (etap 1, swiezy) | \`virus/cmd/main.hcs\` | \`virus\` \`${{ needs.resolve-versions.outputs.version }}\` |"
250+
} >> "$GITHUB_STEP_SUMMARY"
251+
252+
# UWAGA: `.github/workflows/ci.yml` i `.github/workflows/release.yml` sa
253+
# DZIS NIEAKTUALNE - odwoluja sie do architektury sprzed bootstrapu
254+
# (`hackerc/entrypoint.py` przez PyInstaller, `virus/Cargo.toml` jako
255+
# osobny workspace Rust, `examples/hello-world/`) - zadna z tych sciezek
256+
# juz nie istnieje w tym drzewie (patrz `docs/ROADMAP.md`). Ten plik
257+
# (`build.yml`) jest ich naturalnym, samo-hostujacym sie zastepstwem dla
258+
# BUDOWANIA - `release.yml` (PUBLIKOWANIE na GitHub Releases) powinien
259+
# zostac zaktualizowany osobno, zeby uzywac tego samego lancucha stage0
260+
# zamiast PyInstaller/cargo-workspace, i publikowac wynikowa binarke
261+
# `hackerc` pod nazwa assetu dokladnie `hackerc` (bez przyrostka
262+
# platformy) - patrz `virus/cmd/hackerc_bridge.hcs::hackerc_asset_name`.

0 commit comments

Comments
 (0)