Gitlab CI集成Django:解决pip安装自定义私有依赖包失败问题
解决方案
我之前处理过类似的GitLab CI私有依赖问题,给你几个实用的方案,不用急着搭私有PyPi(当然如果长期维护多个包,PyPi Registry确实是个好选择):
方案1:用GitLab CI_JOB_TOKEN走HTTPS克隆(最推荐)
这是最简单的方法,不用配置任何密钥,靠GitLab内置的CI_JOB_TOKEN就能授权访问同组织的私有仓库。
操作步骤:
- 把
requirements.txt里的SSH地址改成HTTPS格式,替换成gitlab-ci-token和${CI_JOB_TOKEN}作为用户名和密码:
# 原来的SSH格式 -e git+ssh://git@gitlab.com/{organization}/{project}.git@{commit-sha}#egg={project} # 修改后的HTTPS格式 -e git+https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/{organization}/{project}.git@{commit-sha}#egg={project}
- 不用额外配置,
CI_JOB_TOKEN是GitLab自动给流水线注入的环境变量,直接用就行,它会自动拥有访问同组织内私有仓库的权限(前提是项目之间的访问权限已经开启)。
方案2:正确配置SSH密钥访问
如果你非要用SSH协议,那得解决两个问题:让CI runner信任GitLab的主机密钥,同时拥有私有仓库的访问权限。
操作步骤:
- 生成无密码SSH密钥:在本地生成一个不需要密码的密钥(CI环境没法手动输密码):
ssh-keygen -t ed25519 -C "ci-runner@your-org.com" -N "" -f ./ci_ssh_key
- 添加公钥到GitLab:把生成的
ci_ssh_key.pub内容,添加到私有仓库的Settings > Repository > Deploy keys里,需要的话勾选"Allow write access";或者加到组织级的Deploy keys,这样同组织所有仓库都能用。 - 在CI里配置SSH:修改
.gitlab-ci.yaml的before_script,加上SSH配置步骤:
before_script: # 先装依赖... - apt -y install openssh-client # 创建SSH目录并设置正确权限(SSH对权限要求很严) - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 # 添加GitLab主机密钥到已知主机,解决Host key verification failed的问题 - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts # 再去装requirements - cd servers/api - pip3 install -r ../requirements.txt
- 把私钥加到GitLab变量:把本地生成的
ci_ssh_key内容,添加到项目的Settings > CI/CD > Variables里,变量名设为SSH_PRIVATE_KEY,类型选"Variable"就行(注意粘贴的时候不要丢换行)。
方案3:用GitLab Package Registry(适合长期维护)
如果你的私有包更新频繁,或者需要版本管理,可以把包发布到GitLab的Package Registry,然后像普通PyPi包一样安装。
操作步骤:
- 发布包到Registry:在私有包的项目里,执行以下命令(需要用
CI_JOB_TOKEN或者个人访问令牌):
pip install twine python setup.py sdist bdist_wheel twine upload --repository-url https://gitlab.com/api/v4/projects/{project_id}/packages/pypi dist/*
- 修改requirements.txt:添加GitLab的PyPi源,然后直接写包名和版本:
--extra-index-url https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/api/v4/projects/{project_id}/packages/pypi/simple your-private-package==1.0.0
- CI里直接
pip install就行,CI_JOB_TOKEN会自动授权访问。
小提示
- 优先选方案1,省心又安全,完全利用GitLab的内置机制,不用管密钥的事。
- 用方案2的话,记得给SSH密钥最小权限(比如只读),别给不必要的权限。
- 不管用哪个方案,都要确保当前项目能访问私有依赖的项目——可以在私有依赖项目的Settings > Repository > Project access里,把当前测试项目加进去,给它开发者或者访客权限。
内容的提问来源于stack exchange,提问作者npa_pos
相关产品推荐
相关产品推荐

