From 5ae9d0b1e5f4607dd1653635189dad2aa4b6673e Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Sat, 2 May 2026 20:42:12 +0300 Subject: [PATCH] Flatten testbed repository layout --- .gitea/actions/setup-build-env/README.md | 91 --- .gitea/actions/setup-build-env/action.yml | 43 -- .../actions/setup-build-env/scripts/setup.sh | 133 ---- .gitea/workflows/build-ci-image.yml | 4 +- .gitea/workflows/build.yml | 34 - ci/Dockerfile => Dockerfile | 2 +- README.md | 129 ++++ ci/.dockerignore | 5 - ci/README.md | 111 ---- ci/USE_CI_IMAGE.md | 611 ------------------ 10 files changed, 132 insertions(+), 1031 deletions(-) delete mode 100644 .gitea/actions/setup-build-env/README.md delete mode 100644 .gitea/actions/setup-build-env/action.yml delete mode 100755 .gitea/actions/setup-build-env/scripts/setup.sh delete mode 100644 .gitea/workflows/build.yml rename ci/Dockerfile => Dockerfile (98%) create mode 100644 README.md delete mode 100644 ci/.dockerignore delete mode 100644 ci/README.md delete mode 100644 ci/USE_CI_IMAGE.md diff --git a/.gitea/actions/setup-build-env/README.md b/.gitea/actions/setup-build-env/README.md deleted file mode 100644 index c227047..0000000 --- a/.gitea/actions/setup-build-env/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# setup-build-env Gitea Action - -Reusable Gitea/GitHub-compatible composite action for Debian/Ubuntu runners. It installs: - -- Clang/LLVM, default `22` -- Meson, installed in an isolated Python virtual environment to avoid PEP 668 `externally-managed-environment` errors -- Ninja -- Python 3, pip, venv -- Vulkan development tooling / SDK packages - -## Local use inside a repository - -Put this directory at: - -```text -.gitea/actions/setup-build-env -``` - -Then use it from a workflow: - -```yaml -name: build - -on: - push: - pull_request: - -jobs: - linux: - runs-on: ubuntu-latest - container: - image: debian:trixie - - steps: - - uses: actions/checkout@v4 - - - uses: ./.gitea/actions/setup-build-env - with: - llvm-version: "22" - vulkan-source: apt - - - run: | - meson setup build --native-file build_options/meson-clang-linux - meson compile -C build -``` - -## Use from a shared action repository - -Create a dedicated repository, for example: - -```text -gitea.example.com/actions/setup-build-env -``` - -Put `action.yml`, `scripts/setup.sh`, and this README at the root of that repository. Then tag it: - -```bash -git tag v1 -git push origin v1 -``` - -Use it from all projects: - -```yaml -- uses: actions/setup-build-env@v1 -``` - -or with your full Gitea owner/repo path, depending on your Gitea Actions configuration: - -```yaml -- uses: your-org/setup-build-env@v1 -``` - -## Inputs - -| Input | Default | Description | -| --- | --- | --- | -| `llvm-version` | `22` | LLVM/Clang major version. Installs packages like `clang-22`, `lld-22`, `llvm-22-dev`. | -| `meson-version` | `latest` | Meson version installed into `/opt/meson-venv`. Use e.g. `1.6.1` to pin. | -| `install-vulkan` | `true` | Install Vulkan packages. | -| `vulkan-source` | `apt` | `apt` for distro packages, or `lunarg` for the LunarG apt repository. | -| `lunarg-sdk-version` | `1.4.309.0` | LunarG SDK version used when `vulkan-source: lunarg`. | -| `make-default` | `true` | Makes `clang`, `clang++`, `lld`, etc point at the selected LLVM version through `update-alternatives`. | - -## Notes - -- This action assumes an apt-based Debian/Ubuntu runner/container. -- If your runner is not root, it needs passwordless `sudo`. -- `vulkan-source: apt` is recommended for CI because it is the most robust across Debian/Ubuntu images. -- `vulkan-source: lunarg` is best used on Ubuntu images supported by LunarG. -- Because this installs system packages, caching the entire result is normally done at the runner/container-image level. For faster builds, consider creating your own Docker image from the commands in `scripts/setup.sh`. diff --git a/.gitea/actions/setup-build-env/action.yml b/.gitea/actions/setup-build-env/action.yml deleted file mode 100644 index aeb84c2..0000000 --- a/.gitea/actions/setup-build-env/action.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Setup C/C++ Vulkan build environment -description: Install Clang/LLVM, Meson, Ninja, Python, and Vulkan SDK packages on Debian/Ubuntu Gitea runners. - -inputs: - llvm-version: - description: LLVM/Clang major version to install. - required: false - default: "22" - meson-version: - description: Meson version to install via isolated Python venv. Use "latest" for newest. - required: false - default: "latest" - install-vulkan: - description: Install Vulkan SDK/development packages. - required: false - default: "true" - vulkan-source: - description: "Vulkan package source: apt or lunarg. apt is more robust on self-hosted runners." - required: false - default: "apt" - lunarg-sdk-version: - description: LunarG SDK version, used only when vulkan-source=lunarg. Example: 1.4.309.0 - required: false - default: "1.4.309.0" - make-default: - description: Make selected clang/clang++/llvm tools the default compiler commands. - required: false - default: "true" - -runs: - using: composite - steps: - - name: Install build environment - shell: bash - run: | - "${{ github.action_path }}/scripts/setup.sh" - env: - LLVM_VERSION: ${{ inputs.llvm-version }} - MESON_VERSION: ${{ inputs.meson-version }} - INSTALL_VULKAN: ${{ inputs.install-vulkan }} - VULKAN_SOURCE: ${{ inputs.vulkan-source }} - LUNARG_SDK_VERSION: ${{ inputs.lunarg-sdk-version }} - MAKE_DEFAULT: ${{ inputs.make-default }} diff --git a/.gitea/actions/setup-build-env/scripts/setup.sh b/.gitea/actions/setup-build-env/scripts/setup.sh deleted file mode 100755 index b952c2d..0000000 --- a/.gitea/actions/setup-build-env/scripts/setup.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -LLVM_VERSION="${LLVM_VERSION:-22}" -MESON_VERSION="${MESON_VERSION:-latest}" -INSTALL_VULKAN="${INSTALL_VULKAN:-true}" -VULKAN_SOURCE="${VULKAN_SOURCE:-apt}" -LUNARG_SDK_VERSION="${LUNARG_SDK_VERSION:-1.4.309.0}" -MAKE_DEFAULT="${MAKE_DEFAULT:-true}" - -log() { printf '\n\033[1;34m==> %s\033[0m\n' "$*"; } -warn() { printf '\n\033[1;33mwarning: %s\033[0m\n' "$*" >&2; } - -if command -v sudo >/dev/null 2>&1 && [ "$(id -u)" -ne 0 ]; then - SUDO=sudo -else - SUDO="" -fi - -export DEBIAN_FRONTEND=noninteractive - -apt_install() { - $SUDO apt-get install -y --no-install-recommends "$@" -} - -log "Installing base packages" -$SUDO apt-get update -apt_install \ - ca-certificates \ - curl \ - gnupg \ - lsb-release \ - software-properties-common \ - wget \ - xz-utils \ - build-essential \ - pkg-config \ - git \ - python3 \ - python3-venv \ - python3-pip \ - ninja-build - -log "Installing LLVM/Clang ${LLVM_VERSION}" -if ! apt-cache show "clang-${LLVM_VERSION}" >/dev/null 2>&1; then - warn "clang-${LLVM_VERSION} is not in the current apt sources; adding apt.llvm.org" - curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | $SUDO gpg --dearmor -o /usr/share/keyrings/llvm-snapshot.gpg - CODENAME="$(. /etc/os-release && printf '%s' "${VERSION_CODENAME:-}")" - if [ -z "$CODENAME" ]; then - CODENAME="$(lsb_release -sc)" - fi - echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg] http://apt.llvm.org/${CODENAME}/ llvm-toolchain-${CODENAME}-${LLVM_VERSION} main" | \ - $SUDO tee "/etc/apt/sources.list.d/llvm-${LLVM_VERSION}.list" >/dev/null - $SUDO apt-get update -fi - -apt_install \ - "clang-${LLVM_VERSION}" \ - "clang-tools-${LLVM_VERSION}" \ - "lld-${LLVM_VERSION}" \ - "lldb-${LLVM_VERSION}" \ - "llvm-${LLVM_VERSION}" \ - "llvm-${LLVM_VERSION}-dev" - -if [ "$MAKE_DEFAULT" = "true" ]; then - log "Making Clang ${LLVM_VERSION} the default compiler for this runner" - for tool in clang clang++ clang-cpp llvm-ar llvm-ranlib llvm-nm llvm-strip lld lldb; do - if command -v "${tool}-${LLVM_VERSION}" >/dev/null 2>&1; then - $SUDO update-alternatives --install "/usr/bin/${tool}" "${tool}" "$(command -v "${tool}-${LLVM_VERSION}")" 100 - fi - done -fi - -log "Installing Meson in an isolated venv" -MESON_VENV="/opt/meson-venv" -$SUDO python3 -m venv "$MESON_VENV" -$SUDO "$MESON_VENV/bin/python" -m pip install --upgrade pip setuptools wheel -if [ "$MESON_VERSION" = "latest" ]; then - $SUDO "$MESON_VENV/bin/python" -m pip install --upgrade meson -else - $SUDO "$MESON_VENV/bin/python" -m pip install --upgrade "meson==${MESON_VERSION}" -fi -$SUDO ln -sf "$MESON_VENV/bin/meson" /usr/local/bin/meson - -if [ "$INSTALL_VULKAN" = "true" ]; then - case "$VULKAN_SOURCE" in - apt) - log "Installing Vulkan development packages from distro apt repositories" - apt_install \ - libvulkan-dev \ - vulkan-tools \ - vulkan-validationlayers \ - glslang-tools \ - spirv-tools \ - spirv-headers || { - warn "Some Vulkan packages were unavailable; retrying minimal Vulkan package set" - apt_install libvulkan-dev vulkan-tools glslang-tools spirv-tools - } - ;; - lunarg) - log "Installing Vulkan SDK from LunarG (${LUNARG_SDK_VERSION})" - . /etc/os-release - if [ "${ID:-}" != "ubuntu" ]; then - warn "LunarG apt repo is Ubuntu-oriented. Falling back to distro apt Vulkan packages." - apt_install libvulkan-dev vulkan-tools glslang-tools spirv-tools - else - CODENAME="${VERSION_CODENAME:-$(lsb_release -sc)}" - curl -fsSL https://packages.lunarg.com/lunarg-signing-key-pub.asc | \ - $SUDO gpg --dearmor -o /usr/share/keyrings/lunarg.gpg - echo "deb [signed-by=/usr/share/keyrings/lunarg.gpg] https://packages.lunarg.com/vulkan/${LUNARG_SDK_VERSION}/ubuntu ${CODENAME} main" | \ - $SUDO tee /etc/apt/sources.list.d/lunarg-vulkan-sdk.list >/dev/null - $SUDO apt-get update - apt_install vulkan-sdk - fi - ;; - *) - echo "Unsupported VULKAN_SOURCE=${VULKAN_SOURCE}; expected apt or lunarg" >&2 - exit 2 - ;; - esac -fi - -log "Versions" -python3 --version -python3 -m pip --version || true -meson --version -ninja --version -clang --version -if command -v vulkaninfo >/dev/null 2>&1; then - vulkaninfo --summary || true -fi - -log "Build environment ready" diff --git a/.gitea/workflows/build-ci-image.yml b/.gitea/workflows/build-ci-image.yml index 4dab621..ea80e25 100644 --- a/.gitea/workflows/build-ci-image.yml +++ b/.gitea/workflows/build-ci-image.yml @@ -3,7 +3,7 @@ name: build-ci-image on: push: paths: - - ci/Dockerfile + - Dockerfile - .dockerignore - .gitea/workflows/build-ci-image.yml workflow_dispatch: @@ -44,7 +44,7 @@ jobs: --build-arg LLVM_VERSION=22 \ --build-arg MESON_VERSION=latest \ -t "$REGISTRY_IMAGE:latest" \ - -f ci/Dockerfile . + -f Dockerfile . - name: Push CI image run: | diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml deleted file mode 100644 index 6e8b923..0000000 --- a/.gitea/workflows/build.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: build - -# This is a manual smoke-test for the already-published image. -# Do not run it on every push in this image repository, because the first push -# happens before the image exists in the registry. -on: - workflow_dispatch: - -jobs: - linux: - runs-on: ubuntu-latest - - container: - image: git.neosisyphus.com/evol3d/evol-testbed:latest - - steps: - - uses: actions/checkout@v4 - - - name: Check CI toolchain - run: | - clang --version - clang++ --version - meson --version - ninja --version - python3 --version - vulkaninfo --summary || true - - - name: Configure - run: | - meson setup build - - - name: Build - run: | - meson compile -C build diff --git a/ci/Dockerfile b/Dockerfile similarity index 98% rename from ci/Dockerfile rename to Dockerfile index 1240711..833177c 100644 --- a/ci/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # such as actions/checkout keep working. # # Build: -# docker build -t evol-testbed:latest -f ci/Dockerfile . +# docker build -t evol-testbed:latest . ARG BASE_IMAGE=catthehacker/ubuntu:act-latest FROM ${BASE_IMAGE} diff --git a/README.md b/README.md new file mode 100644 index 0000000..00192fd --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +# evol-testbed + +Reusable Gitea Actions container image for Evol C/C++/Vulkan builds. + +Image: + +```text +git.neosisyphus.com/evol3d/evol-testbed:latest +``` + +The image extends: + +```text +catthehacker/ubuntu:act-latest +``` + +Included tools: + +- Clang/LLVM 22 +- `clang-format-22` +- `clang-tidy-22` +- `lld-22` +- `lldb-22` +- Meson +- Ninja +- Python 3 / pip / venv +- Vulkan headers/tools +- Mesa Vulkan drivers +- `build-essential` +- `pkg-config` +- Git + +## Build locally + +```bash +docker build -t evol-testbed:latest . +``` + +Test locally: + +```bash +docker run --rm -it evol-testbed:latest bash -lc ' + clang --version && + clang++ --version && + meson --version && + ninja --version && + python3 --version && + pkg-config --modversion vulkan && + vulkaninfo --summary || true +' +``` + +## Push manually + +```bash +docker login git.neosisyphus.com + +docker tag evol-testbed:latest git.neosisyphus.com/evol3d/evol-testbed:latest +docker push git.neosisyphus.com/evol3d/evol-testbed:latest +``` + +## Automatic publishing + +The workflow at: + +```text +.gitea/workflows/build-ci-image.yml +``` + +builds and pushes the image on changes to `Dockerfile`, `.dockerignore`, or the workflow itself. + +Required Gitea Actions secret: + +```text +REGISTRY_PASSWORD +``` + +Use a Gitea token/password with package/container registry write permission. + +Optional secret: + +```text +REGISTRY_USERNAME +``` + +If `REGISTRY_USERNAME` is omitted, the workflow uses `$GITHUB_ACTOR`. + +## Use from another Gitea project + +```yaml +name: build + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + container: + image: git.neosisyphus.com/evol3d/evol-testbed:latest + + steps: + - uses: actions/checkout@v4 + + - name: Check toolchain + run: | + clang --version + clang++ --version + meson --version + ninja --version + python3 --version + pkg-config --modversion vulkan + vulkaninfo --summary || true + + - name: Configure + run: meson setup build + + - name: Build + run: meson compile -C build +``` + +Use the fully-qualified image path. Do not use only `evol-testbed:latest`; Docker will look on Docker Hub or for a local image instead of your Gitea registry. + +## Notes + +- `latest` may be cached by the runner unless `act_runner` is configured with `container.force_pull: true`. +- `vulkaninfo` may still fail on unusual runners, but Vulkan headers and build tools are installed. Use `pkg-config --modversion vulkan` as the compile-time check. diff --git a/ci/.dockerignore b/ci/.dockerignore deleted file mode 100644 index cd67d99..0000000 --- a/ci/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -.git -build -.cache -.venv -subprojects/packagecache diff --git a/ci/README.md b/ci/README.md deleted file mode 100644 index 74abf1b..0000000 --- a/ci/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Gitea Actions CI image - -This image extends Gitea/act's Ubuntu runner image: - -```text -catthehacker/ubuntu:act-latest -``` - -It includes: - -- Clang/LLVM 22 -- Meson -- Ninja -- Python 3 + pip + venv -- Vulkan development packages/tools -- Mesa Vulkan software/runtime drivers -- Git/build-essential/pkg-config -- Node/runtime pieces inherited from the act Ubuntu image, so JavaScript actions like `actions/checkout` keep working - -## Files prepared - -```text -ci/Dockerfile -.dockerignore -.gitea/workflows/build-ci-image.yml -.gitea/workflows/build.yml -``` - -## Required Gitea variables/secrets - -In your repository or organization settings, add these **Actions variables**: - -```text -REGISTRY_HOST=git.neosisyphus.com -REGISTRY_IMAGE=git.neosisyphus.com/evol3d/evol-testbed -CI_IMAGE=git.neosisyphus.com/evol3d/evol-testbed -``` - -Add this **Actions secret**: - -```text -REGISTRY_PASSWORD=your-gitea-token-or-password -``` - -The token/password needs permission to publish packages/container images. - -Optional: add this secret if your registry username is different from the Gitea Actions actor: - -```text -REGISTRY_USERNAME=your-gitea-username -``` - -If `REGISTRY_USERNAME` is not set, the workflow uses `$GITHUB_ACTOR`. - -## Build manually - -```bash -docker build -t evol-testbed:latest -f ci/Dockerfile . -``` - -Test: - -```bash -docker run --rm -it evol-testbed:latest bash -lc ' - clang --version && - meson --version && - ninja --version && - python3 --version && - vulkaninfo --summary || true -' -``` - -Tag and push: - -```bash -docker login git.neosisyphus.com - -docker tag evol-testbed:latest git.neosisyphus.com/evol3d/evol-testbed:latest - -docker push git.neosisyphus.com/evol3d/evol-testbed:latest -``` - -## Build automatically in Gitea Actions - -After setting the variables/secrets above, run: - -```text -.gitea/workflows/build-ci-image.yml -``` - -It builds and pushes: - -```text -${REGISTRY_IMAGE}:latest -``` - -## Use in normal builds - -`.gitea/workflows/build.yml` is already prepared to use: - -```yaml -container: - image: ${{ vars.CI_IMAGE }}:latest -``` - -If expressions do not work in `container.image` on your Gitea version, replace it with the literal image path: - -```yaml -container: - image: git.neosisyphus.com/evol3d/evol-testbed:latest -``` diff --git a/ci/USE_CI_IMAGE.md b/ci/USE_CI_IMAGE.md deleted file mode 100644 index ec46067..0000000 --- a/ci/USE_CI_IMAGE.md +++ /dev/null @@ -1,611 +0,0 @@ -# Using the Clang 22 + Vulkan Gitea Actions CI Image - -This guide explains how to build, publish, and use the prepared Docker image for Gitea Actions. - -The prepared files are: - -```text -ci/Dockerfile -ci/README.md -ci/USE_CI_IMAGE.md -.dockerignore -.gitea/workflows/build-ci-image.yml -.gitea/workflows/build.yml -``` - -The image extends: - -```text -catthehacker/ubuntu:act-latest -``` - -It includes: - -- Clang/LLVM 22 -- `clang-format-22` -- `clang-tidy-22` -- `lld-22` -- `lldb-22` -- Meson -- Ninja -- Python 3 / pip / venv -- Vulkan development packages/tools -- Mesa Vulkan software/runtime drivers -- `build-essential` -- `pkg-config` -- Git -- Gitea/act-compatible tooling inherited from the base image - ---- - -## 1. Decide your image name - -Pick a container image path in your Gitea registry. - -Example Gitea host: - -```text -git.neosisyphus.com -``` - -Organization: - -```text -evol3d -``` - -Image path: - -```text -git.neosisyphus.com/evol3d/evol-testbed -``` - -The pushed tag will be: - -```text -git.neosisyphus.com/evol3d/evol-testbed:latest -``` - ---- - -## 2. Commit the prepared files - -From the repository root: - -```bash -git add ci/Dockerfile ci/README.md ci/USE_CI_IMAGE.md .dockerignore .gitea/workflows/build-ci-image.yml .gitea/workflows/build.yml -git commit -m "Add reusable Clang 22 Vulkan CI image" -git push -``` - ---- - -## 3. Create a Gitea access token - -In the Gitea web UI: - -1. Open your user menu. -2. Go to **Settings**. -3. Go to **Applications**. -4. Create a new access token. -5. Give it package/container registry write permissions. - -Depending on your Gitea version, the permission may be named one of: - -```text -package -packages -write:package -write:packages -``` - -Copy the token. It will be used as the registry password. - ---- - -## 4. Add Gitea Actions variables - -In your repository: - -1. Go to **Settings**. -2. Go to **Actions**. -3. Go to **Variables**. -4. Add these variables: - -```text -REGISTRY_HOST=git.neosisyphus.com -REGISTRY_IMAGE=git.neosisyphus.com/evol3d/evol-testbed -CI_IMAGE=git.neosisyphus.com/evol3d/evol-testbed -``` - -Use your actual values. - -### `REGISTRY_HOST` - -Only the hostname: - -```text -git.neosisyphus.com -``` - -Do not include `https://`. - -Correct: - -```text -git.neosisyphus.com -``` - -Wrong: - -```text -https://git.neosisyphus.com -``` - -### `REGISTRY_IMAGE` - -The full image path without a tag: - -```text -git.neosisyphus.com/evol3d/evol-testbed -``` - -### `CI_IMAGE` - -Usually the same as `REGISTRY_IMAGE`: - -```text -git.neosisyphus.com/evol3d/evol-testbed -``` - -This is used by the normal build workflow. - ---- - -## 5. Add Gitea Actions secrets - -In your repository: - -1. Go to **Settings**. -2. Go to **Actions**. -3. Go to **Secrets**. -4. Add this required secret: - -```text -REGISTRY_PASSWORD -``` - -Example: - -```text -REGISTRY_PASSWORD= -``` - -Use the token from step 3 for `REGISTRY_PASSWORD`. - -Optional: add this secret if your registry username is different from the Gitea Actions actor: - -```text -REGISTRY_USERNAME=myusername -``` - -If `REGISTRY_USERNAME` is not set, the workflow uses `$GITHUB_ACTOR`. - ---- - -## 6. Check the image build workflow - -The image build workflow is: - -```text -.gitea/workflows/build-ci-image.yml -``` - -It logs into your registry, builds the image, and pushes this tag: - -```text -latest -``` - -The important commands are: - -```yaml -- name: Build CI image - run: | - docker build \ - --build-arg BASE_IMAGE=catthehacker/ubuntu:act-latest \ - --build-arg LLVM_VERSION=22 \ - --build-arg MESON_VERSION=latest \ - -t "${{ vars.REGISTRY_IMAGE }}:latest" \ - -f ci/Dockerfile . - -- name: Push CI image - run: | - docker push "${{ vars.REGISTRY_IMAGE }}:latest" -``` - ---- - -## 7. Make sure your runner can build Docker images - -The image-building workflow needs Docker. - -On the runner host, check: - -```bash -docker version -``` - -If that works, the host has Docker. - -Your Gitea runner still needs permission to access Docker. - -### Option A: `act_runner` runs directly on the host - -If your runner runs directly on the machine, make sure the runner user can use Docker. - -Check the runner user, then add it to the Docker group if needed: - -```bash -sudo usermod -aG docker -sudo systemctl restart act_runner -``` - -Test as that user: - -```bash -docker ps -``` - -### Option B: `act_runner` runs inside Docker - -If `act_runner` itself runs inside a container, it needs the host Docker socket mounted: - -```bash --v /var/run/docker.sock:/var/run/docker.sock -``` - -Example: - -```bash -docker run -d \ - --name gitea-act-runner \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v /opt/act-runner/config.yaml:/config.yaml \ - -v /opt/act-runner/data:/data \ - gitea/act_runner:latest -``` - -Without the socket mount, the workflow cannot run `docker build`. - ---- - -## 8. Run the image build workflow - -There are two ways. - -### Method 1: push changes - -The workflow triggers when these files change: - -```text -ci/Dockerfile -.dockerignore -.gitea/workflows/build-ci-image.yml -``` - -So this is enough: - -```bash -git push -``` - -### Method 2: manual workflow dispatch - -If your Gitea version supports `workflow_dispatch`: - -1. Go to your repository. -2. Open **Actions**. -3. Select **build-ci-image**. -4. Click **Run workflow**. - ---- - -## 9. Confirm the image was pushed - -In Gitea: - -1. Open the repository or organization. -2. Go to **Packages**. -3. Look for: - -```text -evol-testbed -``` - -Confirm this tag exists: - -```text -latest -``` - ---- - -## 10. Use the image in your normal build workflow - -The prepared normal workflow is: - -```text -.gitea/workflows/build.yml -``` - -It uses: - -```yaml -container: - image: ${{ vars.CI_IMAGE }}:latest -``` - -If you set: - -```text -CI_IMAGE=git.neosisyphus.com/evol3d/evol-testbed -``` - -then the workflow uses: - -```text -git.neosisyphus.com/evol3d/evol-testbed:latest -``` - -The key workflow shape is: - -```yaml -name: build - -on: - push: - pull_request: - -jobs: - linux: - runs-on: ubuntu-latest - - container: - image: ${{ vars.CI_IMAGE }}:latest - - steps: - - uses: actions/checkout@v4 - - - name: Check CI toolchain - run: | - clang --version - clang++ --version - meson --version - ninja --version - python3 --version - vulkaninfo --summary || true - - - name: Configure - run: | - meson setup build - - - name: Build - run: | - meson compile -C build -``` - -Commit and push: - -```bash -git add .gitea/workflows/build.yml -git commit -m "Use Clang 22 Vulkan CI image" -git push -``` - ---- - -## 11. If `vars.CI_IMAGE` does not work in `container.image` - -Some Gitea/act versions may not expand variables in `container.image`. - -If the build fails because the image name is invalid, replace this: - -```yaml -container: - image: ${{ vars.CI_IMAGE }}:latest -``` - -with the literal image name: - -```yaml -container: - image: git.neosisyphus.com/evol3d/evol-testbed:latest -``` - -Then commit and push: - -```bash -git add .gitea/workflows/build.yml -git commit -m "Use literal CI image path" -git push -``` - ---- - -## 12. If the image is private - -Your runner must be able to pull it. - -Log in on the runner host: - -```bash -docker login git.neosisyphus.com -``` - -Use your Gitea username and token. - -If `act_runner` runs as a system service, log in as the same user that runs `act_runner`, or configure Docker credentials for that user. - -Then restart the runner: - -```bash -sudo systemctl restart act_runner -``` - -If your runner itself is Dockerized, make sure Docker credentials are available to the runner setup. - ---- - -## 13. Test the image manually on the runner - -On the runner host: - -```bash -docker pull git.neosisyphus.com/evol3d/evol-testbed:latest -``` - -Run it: - -```bash -docker run --rm -it git.neosisyphus.com/evol3d/evol-testbed:latest bash -``` - -Inside the container: - -```bash -clang --version -clang++ --version -meson --version -ninja --version -python3 --version -vulkaninfo --summary -``` - -Expected results: - -- `clang` should be version 22. -- `meson` should print a version. -- `ninja` should print a version. -- `vulkaninfo --summary` should usually find Mesa's software Vulkan driver. It may still fail on unusual container/runner setups; that is okay for compile-only CI as long as Vulkan headers/tools are installed. - -Exit: - -```bash -exit -``` - ---- - -## 14. Use it in other projects - -Once the image exists, any project can use it: - -```yaml -name: build - -on: - push: - pull_request: - -jobs: - build: - runs-on: ubuntu-latest - - container: - image: git.neosisyphus.com/evol3d/evol-testbed:latest - - steps: - - uses: actions/checkout@v4 - - - run: | - meson setup build - meson compile -C build -``` - -No more installing LLVM/Vulkan/Meson every CI run. - ---- - -## 15. Updating the image later - -Edit: - -```text -ci/Dockerfile -``` - -Then: - -```bash -git add ci/Dockerfile -git commit -m "Update CI image" -git push -``` - -The image workflow will rebuild and push: - -```text -latest -``` - -Your normal builds will use the updated image next time they run. - ---- - -## 16. Recommended: version image tags - -Instead of only using: - -```text -latest -``` - -consider immutable tags: - -```text -v1 -v2 -v2026-05 -``` - -Example build command tag: - -```yaml --t "${{ vars.REGISTRY_IMAGE }}:v1" -``` - -Then use: - -```yaml -container: - image: git.neosisyphus.com/evol3d/evol-testbed:v1 -``` - -This avoids surprise breakage when `latest` changes. - ---- - -## 17. Quick checklist - -```text -1. Commit ci/Dockerfile and workflows. -2. Create Gitea token with package/container write access. -3. Registry/image values are already hardcoded in the workflow. -4. Add Actions secrets: - - REGISTRY_PASSWORD - - REGISTRY_USERNAME only if needed -5. Make sure the runner can run docker build. -6. Run build-ci-image workflow. -7. Confirm image appears in Gitea Packages. -8. Use image in .gitea/workflows/build.yml. -9. Push normal project code. -10. Build should run inside the prebuilt Clang/Vulkan image. -``` - -The most important final workflow line is: - -```yaml -container: - image: git.neosisyphus.com/evol3d/evol-testbed:latest -```