name: Set up Linux runner dependencies description: Reuse installed tools and install missing dependencies on an Ubuntu self-hosted runner inputs: tools: description: Space-separated commands to install if missing (Ubuntu package names, except shasum) required: false default: curl expected-architecture: description: Optional uname architecture required by the workload required: false default: '' runs: using: composite steps: - name: Check host and install missing tools shell: bash env: REQUIRED_TOOLS: ${{ inputs.tools }} EXPECTED_ARCH: ${{ inputs.expected-architecture }} run: | set -euo pipefail if [[ -n "$EXPECTED_ARCH" ]]; then [[ "$(uname -m)" == "$EXPECTED_ARCH" ]] fi command -v git missing=() read -r -a tools <<< "$REQUIRED_TOOLS" for tool in "${tools[@]}"; do if ! command -v "$tool" >/dev/null; then case "$tool" in shasum) missing+=(libdigest-sha-perl) ;; *) missing+=("$tool") ;; esac fi done if ((${#missing[@]})); then . /etc/os-release [[ "$ID" == ubuntu ]] sudo -n apt-get update sudo -n env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=l apt-get install -y --no-install-recommends "${missing[@]}" fi - name: Install Docker if missing and verify access shell: bash run: | set -euo pipefail if ! command -v docker >/dev/null; then . /etc/os-release [[ "$ID" == ubuntu ]] sudo -n apt-get update sudo -n env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=l apt-get install -y --no-install-recommends curl ca-certificates sudo -n install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo -n tee /etc/apt/keyrings/docker.asc >/dev/null sudo -n chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable" | sudo -n tee /etc/apt/sources.list.d/docker.list >/dev/null sudo -n apt-get update sudo -n env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=l apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io docker-buildx-plugin fi if ! docker info >/dev/null 2>&1; then sudo -n systemctl enable --now docker fi # Membership must be configured before the runner starts, not in this job. docker info