背景简介
Gitea CI/CD 自动化部署报错: actions/checkout@v3 Cannot find: node in PATH
报错截图

前置信息
报错原因
Gitea 的 act_runner(尤其是 Docker 镜像 gitea/act_runner)默认是一个极简镜像,不包含 Node.js、npm 或 yarn。而 actions/checkout@v3 是一个 基于 Node.js 的官方 GitHub Action,运行时需要 Node 环境。
解决方案
基于官方镜像与二进制文件构建符合自身项目需求的镜像,例如我的需要如下配置
- Nodejs
- Python + pip
- Git
- Docker
构建 Dockerfile.runner
# 基于 Debian(带 apt)
FROM debian:bullseye-slim
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
# -----------------------
# 安装 Docker CLI
# -----------------------
# 安装添加 Docker 仓库所需的依赖
RUN apt-get update && apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加 Docker 的官方 GPG 密钥
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
# 设置 Docker APT 仓库
RUN echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# -----------------------
# 安装基础工具和 Python 编译依赖
# -----------------------
# 再次更新 apt 包索引,以包含新添加的 Docker 仓库
RUN apt-get update && apt-get install -y \
curl wget git unzip build-essential software-properties-common \
libssl-dev zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libreadline-dev libffi-dev \
#安装 docker
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
&& rm -rf /var/lib/apt/lists/*
# -----------------------
# 安装 Node.js (LTS 18.x)
# -----------------------
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs \
&& node -v && npm -v
# -----------------------
# 安装 Python 3.11 + pip (从源码编译)
# -----------------------
# 定义 Python 版本号,方便未来维护
ENV PYTHON_VERSION=3.11.9
# 下载 Python 源码
RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz
# 解压、编译、安装
RUN tar -xf Python-${PYTHON_VERSION}.tgz \
&& cd Python-${PYTHON_VERSION} \
&& ./configure --enable-optimizations \
&& make -j$(nproc) \
# 使用 altinstall 避免覆盖系统默认的 python3
&& make altinstall \
# 验证安装
&& python3.11 --version
# 安装并升级 pip
RUN python3.11 -m ensurepip --upgrade \
&& python3.11 -m pip install --upgrade pip setuptools wheel \
&& pip3.11 --version
# 设置 python3.11 为系统默认 python 和 python3
RUN update-alternatives --install /usr/bin/python python /usr/local/bin/python3.11 1 \
&& update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1
# -----------------------
# 安装 act_runner (Gitea)
# -----------------------
RUN curl -fsSL https://dl.gitea.com/act_runner/0.2.10/act_runner-0.2.10-linux-amd64 -o /usr/local/bin/act_runner \
&& chmod +x /usr/local/bin/act_runner \
&& act_runner --version
# 默认工作目录
WORKDIR /data
# 启动 runner
ENTRYPOINT ["/usr/local/bin/act_runner"]
创建自定义 act_runner 镜像
docker build -t my-gitea-runner:node-py311 -f Dockerfile.runner .
[+] Building 675.6s (16/16) FINISHED docker:default
=> [internal] load build definition from Dockerfile.runnerv2 0.0s
=> => transferring dockerfile: 2.85kB 0.0s
=> [internal] load metadata for docker.io/library/debian:bullseye-slim 0.6s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [ 1/12] FROM docker.io/library/debian:bullseye-slim@sha256:52927eff8153b563244f98cdc802ba97918afcdf67f9e4867cbf1f7afb3d147b 0.0s
=> CACHED [ 2/12] RUN apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release 0.0s
=> CACHED [ 3/12] RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg 0.0s
=> CACHED [ 4/12] RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /d 0.0s
=> CACHED [ 5/12] RUN apt-get update && apt-get install -y curl wget git unzip build-essential software-properties-common libssl-dev zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libreadline-dev libffi-dev docker- 0.0s
=> CACHED [ 6/12] RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && apt-get install -y nodejs && node -v && npm -v 0.0s
=> CACHED [ 7/12] RUN wget https://www.python.org/ftp/python/3.11.13/Python-3.11.13.tgz 0.0s
=> [ 8/12] RUN tar -xf Python-3.11.13.tgz && cd Python-3.11.13 && ./configure --enable-optimizations && make -j$(nproc) && make altinstall && python3.11 --version 628.1s
=> [ 9/12] RUN python3.11 -m ensurepip --upgrade && python3.11 -m pip install --upgrade pip setuptools wheel && pip3.11 --version 7.5s
=> [10/12] RUN update-alternatives --install /usr/bin/python python /usr/local/bin/python3.11 1 && update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1 0.4s
=> [11/12] RUN curl -fsSL https://dl.gitea.com/act_runner/0.2.10/act_runner-0.2.10-linux-amd64 -o /usr/local/bin/act_runner && chmod +x /usr/local/bin/act_runner && act_runner --version 0.7s
=> [12/12] WORKDIR /data 0.1s
=> exporting to image 37.9s
=> => exporting layers 37.9s
=> => writing image sha256:f8f6c026666184701e8132a6867a6321c5db0802514d76a71a081c6c172e3671
=> => naming to my-gitea-runner:node-py311
等待镜像构建完成后,更新【Gitea - Docker 部署 act_runner】中的镜像为自定义的镜像,然后更新entrypoint,例如:
services:
gitea-act-runner:
image: repo.docker.persys.top/pers/gitea/act_runner:python3d11_nodejs18
container_name: gitea-act-runner
restart: unless-stopped
# 从 .env 文件中读取环境变量
env_file:
- ./.env
volumes:
# 【关键】将宿主机的 Docker Socket 挂载到容器内,使 Runner 能在宿主机上构建和运行容器
- /var/run/docker.sock:/var/run/docker.sock
# 持久化 Runner 的配置和注册信息
- ./data:/data
entrypoint: ["/data/scripts/entrypoint.sh"]
如果不想使用脚本文件,则无需修改 entrypoint,直接提供 act_runner 执行指令即可。
- 点击
Re-run all jobs重新执行 workflow,等待执行完成即可。

以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言讨论。