Henry
发布于 2025-10-27 / 11 阅读
0
0

Gitea - Issue - CICD - actionscheckout@v3 Cannot find node in PATH

背景简介

Gitea CI/CD 自动化部署报错: actions/checkout@v3 Cannot find: node in PATH

报错截图

前置信息

  1. Gitea - DEV - Python 后端 CI/CD 标准化部署 - 无审批环节

报错原因

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,等待执行完成即可。


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



评论