diff --git a/.gitea/workflows/dev-workshop.yml b/.gitea/workflows/dev-workshop.yml index 548a367..925de28 100644 --- a/.gitea/workflows/dev-workshop.yml +++ b/.gitea/workflows/dev-workshop.yml @@ -7,8 +7,8 @@ on: env: STEAM_APP_ID: "107410" - HOST_REPO: /home/valmo/braf - HOST_CACHE: /home/valmo/braf-ci-cache/dev-workshop + HOST_REPO: /data/valmo/braf + HOST_CACHE: /data/valmo/braf-ci-cache/dev-workshop BRAF_CI_STAGE_DIR: dist/dev/@braf_dev jobs: @@ -29,9 +29,9 @@ jobs: run: | set -euo pipefail - mkdir -p "$HOST_CACHE" docker run --rm -i \ + --user root \ -e BRAF_CI_STAGE_DIR \ -e GIT_BEFORE \ -e GIT_SHA \ @@ -46,7 +46,7 @@ jobs: -v "$HOST_REPO:/repo" \ -v "$HOST_CACHE:/cache" \ -v /var/run/docker.sock:/var/run/docker.sock \ - docker.gitea.com/runner-images:ubuntu-latest \ + valmo/braf-mikero:3.23.8.60 \ bash -s <<'BRAF_CI' set -euo pipefail @@ -65,22 +65,25 @@ jobs: } install_mikero() { - if [[ ! -x /cache/mikero-tools/bin/makepbo ]]; then - rm -rf /tmp/mikero-tools-action /cache/mikero-tools - mkdir -p /tmp/mikero-tools-action /cache/mikero-tools - curl -fsSL \ - https://github.com/arma-actions/mikero-tools/archive/refs/heads/master.tar.gz \ - -o /tmp/mikero-tools-action.tar.gz - tar -zxf /tmp/mikero-tools-action.tar.gz \ - --strip-components=1 \ - -C /tmp/mikero-tools-action - tar -xf /tmp/mikero-tools-action/linux/*.tar \ - --strip-components=1 \ - -C /cache/mikero-tools + export WINEPREFIX=/cache/mikero-wine + export WINEARCH=win64 + export WINEDEBUG=-all + + if ! command -v pboProject >/dev/null; then + echo "pboProject is missing from valmo/braf-mikero image." >&2 + return 1 fi - export PATH="/cache/mikero-tools/bin:$PATH" - export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}:/cache/mikero-tools/lib" + if ! command -v winetricks >/dev/null; then + apt-get install -y winetricks + fi + + if [[ ! -f "$WINEPREFIX/drive_c/windows/system32/mfc140u.dll" ]]; then + echo "Initializing the persistent Mikero Wine runtime." + xvfb-run -a winetricks -q vcrun2015 + fi + + sed -i "s#exec /usr/lib/wine/wine64#exec xvfb-run -a /usr/bin/wine#" /usr/local/bin/pboProject } is_zero_sha() { @@ -179,7 +182,23 @@ jobs: git_auth lfs fetch origin "$GIT_SHA" --include="$include" --exclude="*" git lfs checkout "${changed_addons[@]}" else - echo "Only workshop metadata changed; using cached PBOs." + echo "Only workshop metadata changed; seeding any missing PBO cache entries." + mapfile -t changed_addons < <( + git ls-tree -d --name-only "$GIT_SHA" | + awk "/^braf_/ {print}" | + while read -r addon; do + if git cat-file -e "$GIT_SHA:$addon/config.cpp" 2>/dev/null; then + printf "%s\n" "$addon" + fi + done + ) + include="" + for addon in "${changed_addons[@]}"; do + include+="${include:+,}${addon}/**" + done + echo "Fetching LFS for cache seed: $include" + git_auth lfs fetch origin "$GIT_SHA" --include="$include" --exclude="*" + git lfs checkout "${changed_addons[@]}" fi build_args=( diff --git a/make/ci_dev_workshop.py b/make/ci_dev_workshop.py index 8515796..cc7bf50 100644 --- a/make/ci_dev_workshop.py +++ b/make/ci_dev_workshop.py @@ -352,14 +352,11 @@ def run_pboproject(addon: str, source_root: Path, output_dir: Path) -> None: "+O" if addon in obfuschatedList else "-O", ] else: - source = repo_root() / addon - fallback = output_dir / f"{addon}.pbo" - print( - "Mikero pboProject is not available; writing raw DEV PBO " - f"for {addon} at {fallback}" + raise RuntimeError( + "Mikero pboProject is required to build DEV Workshop PBOs. " + "The installed DePbo makepbo tool only creates a raw archive and " + "must not be published as a BRAF build." ) - write_raw_pbo(addon, source, fallback) - return print(f"::group::Building {addon}") print(" ".join(cmd)) @@ -467,12 +464,14 @@ def main() -> int: source_root = Path(args.source_root).resolve() elif args.dry_run: source_root = (cache_dir / "mikero-source" / "braf").resolve() - elif not (shutil.which("pboproject") or shutil.which("pboProject")): - source_root = root - else: + elif shutil.which("pboproject") or shutil.which("pboProject"): source_root_addons = requested_addons if requested_addons is not None else addons source_root = prepare_mikero_source_root(root, cache_dir, source_root_addons).resolve() - + else: + raise RuntimeError( + "Mikero pboProject is not installed. Refusing to stage or publish " + "raw PBO archives as a DEV Workshop build." + ) current_hashes = {addon: addon_digest(root / addon) for addon in addons} manifest = load_manifest(manifest_path) manifest_addons = manifest.setdefault("addons", {})