调用外部GitHub Action时,是否会拉取镜像并在Runner本地执行命令?
GitHub Actions调用外部Action的底层执行机制
当你在工作流里调用thirdparty/thirdpartyaction@v1时,GitHub Actions会根据该Action的类型,将对应资源拉取到你的Runner环境中,再基于仓库代码执行预设逻辑。下面分三种常见Action类型拆解具体流程:
1. Docker容器型Action(对应你提到的镜像拉取场景)
- 若该外部Action是Docker容器类型,Runner会先从Docker Hub或GitHub Container Registry拉取
thirdparty提供的指定镜像(定义在Action的action.yml文件的runs.image字段)。 - 拉取完成后,Runner创建新的Docker容器,将你的仓库代码目录挂载到容器内部的默认路径
/github/workspace。 - 容器启动后,执行镜像中预设的命令(由
runs.entrypoint和runs.commands字段定义),这些命令直接操作挂载进来的仓库代码。 - 执行结束后容器退出,Runner会清理容器资源,但过程中对仓库代码的修改(如生成文件、代码变更)会保留在Runner工作目录,供后续步骤使用。
2. JavaScript型Action
- 这类Action无需拉取Docker镜像,Runner直接从GitHub仓库拉取
thirdparty/thirdpartyaction中v1标签对应的代码。 - Runner利用内置的Node.js环境(版本由Action的
action.yml中runs.using指定,比如node16),安装Action依赖(若存在package.json)。 - 随后执行Action的入口脚本(
runs.main字段定义的.js文件),脚本直接在Runner工作目录中操作仓库代码,无额外隔离环境。
3. 组合型Action(Composite Action)
- 这是将多个步骤打包的Action,Runner拉取该Action的仓库代码后,解析其中的
action.yml,把里面定义的一系列步骤(如运行命令、调用其他Action)直接在当前Runner环境中依次执行。 - 所有步骤共享同一个Runner工作目录,直接操作仓库代码,无额外容器隔离。
关键共性逻辑
- 无论哪种类型的Action,Runner都会先将你的仓库代码克隆到自身工作目录(默认路径为
/home/runner/work/<repo-name>/<repo-name>),再让外部Action基于该目录执行操作。 - 外部Action的权限由工作流中设置的
permissions决定,它能访问的资源(如仓库代码、GitHub API)均受限于该配置。
内容的提问来源于stack exchange,提问作者user1953684
相关产品推荐
相关产品推荐

