log: level: info runner: # Run multiple jobs concurrently. Overridden by env at compose level too. capacity: 4 timeout: 3h # Keep the runner alive; jobs are ephemeral containers. insecure: false # Env injected into every job. Speeds up Rust builds. envs: CARGO_TERM_COLOR: always CARGO_INCREMENTAL: "0" CARGO_NET_RETRY: "10" fetch_timeout: 5s fetch_interval: 2s # Labels decide which docker image runs each job. Jobs use `runs-on: ubuntu-latest`. labels: - "ubuntu-latest:docker://catthehacker/ubuntu:act-22.04" - "ubuntu-22.04:docker://catthehacker/ubuntu:act-22.04" - "ubuntu-24.04:docker://catthehacker/ubuntu:act-24.04" cache: # Built-in cache server so actions/cache works (Rust deps, target/, etc.) enabled: true # PHẢI trỏ vào volume. Để rỗng thì act_runner ghi vào $HOME/.cache/actcache # tức writable layer của container -> mất sạch mỗi lần container bị tạo lại. # Phải khớp với mount runner-cache:/cache trong docker-compose.yml. dir: "/cache" # Empty host -> auto-detect outbound IP reachable from job containers. host: "" port: 0 container: # Talk to the DinD daemon, not the host. network: "" privileged: false options: "" workdir_parent: "" # Allow workflows to mount caches from the DinD volume. valid_volumes: - "**" # act_runner bind-mounts this path (from its own container's filesystem) into # every job/service container as /var/run/docker.sock -- it does not pass # DOCKER_HOST through as an env var, and only unix:// (or bare) paths are # recognized (see getDockerDaemonSocketMountPath in act_runner's source; a # "tcp://" value is silently treated as unknown and falls back to the # nonexistent default path). This is dind's docker.sock exposed over the # dind-sock volume shared between the dind and runner services in # docker-compose.yml, so job steps that call `docker` directly (e.g. `docker # build`) reach the real DinD daemon. docker_host: "unix:///dind-sock/docker.sock" force_pull: false host: workdir_parent: ""