diff --git a/.gitea/workflows/rapport.yml b/.gitea/workflows/rapport.yml index 7239f9b..359ea01 100644 --- a/.gitea/workflows/rapport.yml +++ b/.gitea/workflows/rapport.yml @@ -1,108 +1,67 @@ -name: rapport +name: Energirapporter -# Bygger energirapporter for alle bygningene i `bygninger/` og legger dem ved utgivelsen. -# -# Legg én fil per bygning i `bygninger/`: -# * `bygning.toml` — ferdig bygningsbeskrivelse -# * `bygning.ifc` — IFC-eksport fra Vectorworks («Export IFC Project») -# * `bygning.gbxml` — gbXML fra BIM-verktøy som støtter det -# * `bygning.csv` — regneark fra Vectorworks («Export Worksheet») -# -# IFC-, gbXML- og CSV-filer importeres automatisk til TOML dersom det ikke allerede finnes en -# TOML-fil med samme navn. Importerte filer må vanligvis suppleres med ventilasjon, -# lekkasjetall og varmekilder før tallene er til å stole på; importen skriver merknader om det. +# Lager energirapport for hver bygning i `bygninger/` og legger PDF, JSON og CSV ved +# utgivelsen. Se `bygninger/LES-MEG.md` for hvilke filtyper som kan ligge der. on: - push: - tags: ['v*', 'rapport-*'] + release: + types: [published] workflow_dispatch: jobs: rapporter: - runs-on: ubuntu-latest + runs-on: fish + defaults: + run: + shell: fish {0} steps: - - uses: actions/checkout@v4 - - - name: Installer Rust og Typst - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - TYPST=0.15.1 - curl -sSL "https://github.com/typst/typst/releases/download/v${TYPST}/typst-x86_64-unknown-linux-musl.tar.xz" \ - | tar -xJ --strip-components=1 -C /usr/local/bin typst-x86_64-unknown-linux-musl/typst - - - name: Hurtiglager for klimadata og cargo - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - ~/.cache/enok - target - key: enok-rapport-${{ runner.os }}-${{ hashFiles('Cargo.lock') }} - restore-keys: enok-rapport-${{ runner.os }}- + - name: Hent koden + uses: https://gitea.com/actions/checkout@v6 - name: Bygg enok run: cargo build --release --locked - name: Importer BIM-filer som ikke har en TOML fra før run: | - shopt -s nullglob nocaseglob - for f in bygninger/*.ifc bygninger/*.gbxml bygninger/*.xml bygninger/*.csv; do - toml="${f%.*}.toml" - if [ ! -f "$toml" ]; then + for f in (find bygninger -type f \( -iname '*.ifc' -o -iname '*.gbxml' -o -iname '*.csv' \) 2>/dev/null) + set toml (string replace -r '\.[^.]+$' '.toml' $f) + if not test -f $toml echo "Importerer $f" - ./target/release/enok import "$f" --ut "$toml" - fi - done + ./target/release/enok import $f --ut $toml + end + end - name: Beregn og lag rapporter run: | - shopt -s nullglob mkdir -p dist - feil=0 - for t in bygninger/*.toml; do - navn="$(basename "$t" .toml)" + set feil 0 + for t in (find bygninger -type f -name '*.toml' 2>/dev/null) + set navn (basename $t .toml) echo "::group::$navn" - if ./target/release/enok beregn "$t" --ut "ut/$navn"; then - cp "ut/$navn/rapport.pdf" "dist/$navn-energirapport.pdf" - cp "ut/$navn/resultat.json" "dist/$navn-resultat.json" - cp "ut/$navn/maaned.csv" "dist/$navn-maaned.csv" - gzip -c "ut/$navn/timeserie.csv" > "dist/$navn-timeserie.csv.gz" + if ./target/release/enok beregn $t --ut ut/$navn + cp ut/$navn/rapport.pdf dist/$navn-energirapport.pdf + cp ut/$navn/resultat.json dist/$navn-resultat.json + cp ut/$navn/maaned.csv dist/$navn-maaned.csv + gzip -c ut/$navn/timeserie.csv > dist/$navn-timeserie.csv.gz else echo "Beregningen av $navn feilet" - feil=1 - fi + set feil 1 + end echo "::endgroup::" - done + end ls -la dist exit $feil - - name: Last opp som byggeartefakt - uses: actions/upload-artifact@v3 - with: - name: energirapporter - path: dist/ - - name: Legg ved utgivelsen - if: startsWith(github.ref, 'refs/tags/') + if: github.event_name == 'release' env: - TOKEN: ${{ secrets.GITEA_TOKEN }} - SERVER: ${{ github.server_url }} - REPO: ${{ github.repository }} - TAG: ${{ github.ref_name }} + TOKEN: ${{ github.token }} run: | - set -euo pipefail - api="$SERVER/api/v1/repos/$REPO/releases" - id=$(curl -sS --fail -H "Authorization: token $TOKEN" "$api/tags/$TAG" | jq -r '.id // empty') - if [ -z "$id" ]; then - id=$(curl -sS --fail -X POST -H "Authorization: token $TOKEN" -H 'Content-Type: application/json' \ - -d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Energirapporter generert av enok.\"}" \ - "$api" | jq -r '.id') - fi - for f in dist/*; do - echo "Laster opp $(basename "$f")" - curl -sS --fail -H "Authorization: token $TOKEN" \ + set REL_ID (curl --silent --fail --header "Authorization: token $TOKEN" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases/tags/$GITHUB_REF_NAME" | jq -r '.id') + for f in (find dist -type f) + echo "Laster opp "(basename $f) + curl --silent --show-error --fail --header "Authorization: token $TOKEN" \ --form "attachment=@$f" \ - "$api/$id/assets?name=$(basename "$f")" > /dev/null - done + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases/$REL_ID/assets?name="(basename $f) + end diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..0b63f9e --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,34 @@ +name: Release enok + +# Bygger enok og legger binærfilen ved utgivelsen, slik at byggeprosjektene kan hente den +# og lage energirapporter uten å ha Rust installert. + +on: + release: + types: [published] + +jobs: + bygg: + runs-on: fish + defaults: + run: + shell: fish {0} + steps: + - name: Hent koden + uses: https://gitea.com/actions/checkout@v6 + + - name: Bygg + run: cargo build --release --locked + + - name: Kontroller + run: cargo test --release --locked + + - name: Legg binærfilen ved utgivelsen + env: + TOKEN: ${{ github.token }} + run: | + set REL_ID (curl --silent --fail --header "Authorization: token $TOKEN" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases/tags/$GITHUB_REF_NAME" | jq -r '.id') + curl --silent --show-error --fail --header "Authorization: token $TOKEN" \ + --form "attachment=@target/release/enok" \ + "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases/$REL_ID/assets?name=enok" diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index d57eb98..dc7ce41 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -7,25 +7,14 @@ on: jobs: test: - runs-on: ubuntu-latest + # Vertskjører på kasse, samme oppsett som de andre prosjektene. + runs-on: fish + defaults: + run: + shell: fish {0} steps: - - uses: actions/checkout@v4 - - - name: Installer Rust - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --component rustfmt,clippy - echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - - - name: Hurtiglager for klimadata og cargo - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - ~/.cache/enok - target - key: enok-${{ runner.os }}-${{ hashFiles('Cargo.lock') }} - restore-keys: enok-${{ runner.os }}- + - name: Hent koden + uses: https://gitea.com/actions/checkout@v6 - name: Formatering run: cargo fmt --check @@ -34,4 +23,4 @@ jobs: run: cargo clippy --all-targets -- -D warnings - name: Tester - run: cargo test --release + run: cargo test --release --locked diff --git a/README.md b/README.md index bd06142..5a8cea9 100644 --- a/README.md +++ b/README.md @@ -197,10 +197,45 @@ vindu,Stue sør,3.0,2.8,180,90,,0.76,2 ## Rapporter fra byggeserveren -`.gitea/workflows/rapport.yml` bygger rapporter for alle bygningene i `bygninger/` og legger -PDF, JSON og CSV ved utgivelsen når du setter en tagg som begynner med `v` eller `rapport-`. -IFC-, gbXML- og CSV-filer importeres automatisk til TOML dersom det ikke allerede finnes en -TOML-fil med samme navn. Se `bygninger/LES-MEG.md`. +Arbeidsflytene i `.gitea/workflows/` kjører på vertskjøreren `fish` og utløses når en +utgivelse publiseres, på samme måte som de andre prosjektene. + +| Fil | Hva den gjør | +| --- | --- | +| `test.yml` | Formatering, clippy og tester på hver push | +| `release.yml` | Bygger enok og legger binærfilen ved utgivelsen | +| `rapport.yml` | Lager energirapport for hver bygning i `bygninger/` og legger PDF, JSON og CSV ved utgivelsen | + +IFC-, gbXML- og CSV-filer i `bygninger/` importeres automatisk til TOML dersom det ikke +allerede finnes en TOML-fil med samme navn. Se `bygninger/LES-MEG.md`. + +### Energirapport fra et byggeprosjekt + +Et prosjektlager med sin egen IFC-modell og `bygning.toml` trenger ikke Rust. Det henter +binærfilen fra enoks utgivelse: + +```yaml +name: Energirapport +on: + release: + types: [published] +jobs: + rapport: + runs-on: fish + defaults: + run: + shell: fish {0} + steps: + - uses: https://gitea.com/actions/checkout@v6 + - name: Hent enok og lag rapporten + env: + TOKEN: ${{ github.token }} + run: | + curl -sL -o enok --header "Authorization: token $TOKEN" \ + "$GITHUB_SERVER_URL/klingenbergbygg/enok/releases/latest/download/enok" + chmod +x enok + ./enok beregn bygning.toml --ut dist +``` ## Kontroll av beregningen