如何在GitHub Actions容器中复用Python私有包?
GitHub Actions中复用私有Python包的可行方案
问题背景
我们有多个基于Python编写、运行在容器中的GitHub Actions,已搭建内部模板,仅需编写脚本即可在工作流中调用。但每个Action分散在不同仓库,代码重复度高,计划创建Python包实现复用,却遇到以下问题:
- 无法使用GitHub Packages托管Python包,只能通过
pip install git+https://github...方式安装; - 本地执行
pip install git+正常,但在GitHub Actions容器中因未认证,无法访问公司私有仓库; - 尝试过传递SSH密钥、子模块等方案,要么因容器由GitHub构建导致无效,要么存在安全风险,且目前无法将GH_TOKEN传入Docker构建流程。
可行解决方案
方案一:在Action运行时安装私有包(推荐)
Docker构建阶段无法获取GitHub Actions的输入变量,因此将私有包的安装步骤从Dockerfile的构建环节,移到Action启动后的运行环节:
- 修改Dockerfile:移除构建时安装私有包的指令,改用入口脚本启动
FROM ghcr.io/cicirello/pyaction:4.19.0 ADD . /app WORKDIR /app # 仅安装公共依赖 RUN pip install --target=/app requests ENV PYTHONPATH /app # 改用自定义入口脚本 CMD ["/app/entrypoint.sh"]
- 新增entrypoint.sh脚本:接收环境变量并安装私有包
#!/bin/bash set -e # 利用传入的GitHub Token安装私有Python包 pip install git+https://oauth2:${INPUT_GITHUBTOKEN}@github.com/mycompany/my-package-folder # 执行主业务脚本 python /app/main.py
注意:提交前需执行
chmod +x entrypoint.sh赋予脚本可执行权限
- 调整action.yml:确保输入变量传递到容器环境
name: "some name" description: "some description" author: "the author" inputs: GitHubToken: description: "GitHub Token" required: true runs: using: "docker" image: "Dockerfile" env: INPUT_GITHUBTOKEN: ${{ inputs.GitHubToken }}
方案二:添加依赖缓存优化(可选)
若担心每次运行都安装包耗时过长,可在调用该Action的工作流中添加缓存步骤,减少重复安装:
- name: 缓存Python依赖 uses: actions/cache@v3 with: path: | ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip-
方案三:使用公司内部PyPI镜像(若有)
如果公司内部搭建了私有PyPI镜像,可将复用的Python包上传至该镜像,然后在Dockerfile中直接指定内部源安装,无需处理GitHub认证:
RUN pip install --index-url https://your-internal-pypi.com/simple/ your-shared-package
注意事项
- 所有敏感信息(如GitHub Token)均通过GitHub Actions输入变量传递,禁止硬编码在Dockerfile或脚本中;
- 给GitHub Token分配最小权限,仅授予私有仓库的读取权限即可;
- 确保入口脚本拥有可执行权限,避免Action启动失败。
内容的提问来源于stack exchange,提问作者Marcio Aleixo
相关产品推荐
相关产品推荐

