原文地址:dev.to/gdledsan/ac…
原文作者:dev.to/gdledsan
发布时间:2021年7月19日 ・7月20日更新 ・3分钟阅读
情景。需要从我的CI管道中安装一个只在私有仓库中可用的需求。
有两种方法(我发现)可以做到这一点,而你使用的方法取决于你需要做什么。
- 我有一个简单的库,没有依赖关系或只有公共依赖关系
- 我有一个依赖于其他私有仓库的依赖关系
为了说明情况,我使用了gitlab、python和poetry。
简单的依赖关系。使用部署令牌
部署令牌允许你在没有用户名和密码或ssh密钥的情况下访问版本库,它是按版本库或组设置的。
如何做。
例子:
对 pyproject.toml 的依赖性
[tool.poetry.dependencies]
python = "^3.9"
private-project = {git = "ssh://git@gitlab.com/mundo03/sample-private-repo.git", rev = "main"}
注意SSH URL被保留了,这样你就不必每次在本地安装你的依赖项时都使用个人访问令牌了。
gitlab-ci.yml
image: python:3.9-buster
poetry_token:
script:
# Install Poetry
- pip install poetry
# setup string replacement
- export SSH_URL=ssh:\\/\\/git@gitlab.com\\/mundo03
- export TOKEN_URL=https:\\/\\/$deploy_user:$deploy_token@gitlab.com\\/mundo03
- sed -i "s/$SSH_URL/$TOKEN_URL/g" pyproject.toml
# Install repo
- poetry install
# Use Clonned Repo
- poetry run print_something "LOOK AT ME!!"
请注意,sed被用来将SSH URL替换为HTTP URL,其中有部署令牌。
复杂的依赖关系。使用部署密钥
部署密钥也可以让你在没有用户名和密码或SSH密钥的情况下访问版本库,它是一个你生成的SSH密钥,必要时可以在多个版本库和多个组上使用。
在 Gitlab 实例层面也有公共部署密钥,管理员可以给该实例中的任何项目以访问权。
怎样做?
对 pyproject.toml 的依赖
[tool.poetry.dependencies]
python = "^3.9"
private-project = {git = "ssh://git@gitlab.com/mundo03/sample-private-repo.git", rev = "main"}
gitlab-ci.yml
image: python:3.9-buster
poetry_key:
script:
# Install OS dependencies
- apt-get update -y -qq && apt-get install -y -qq make openssh-client python3-pip
# Start ssh-agent
- eval $(ssh-agent -s)
# Add Private key to SSH Agent
- ssh-add <(echo "$SSH_PK")
# Add gitlab as known host
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
# Install Poetry
- pip install poetry
# Install repo
- poetry install
# Use Clonned Repo
- poetry run print_something "LOOK AT ME!!"
进入保险库
CI变量并不是存储秘密的最佳方式,为此gitlab有Secrets,它是用来存储SSH密钥、密码等东西的。
读起来:秘密
Spoliers。你需要一个Hashicorp的Vault账户
TL;DR
我的项目中有一个依赖,它托管在一个私有仓库中,我需要在CI/CD期间安装它,我有两个选择。
- 部署 Token。是按项目或组设置的,我可以在CI变量中添加令牌信息,并操作我的需求文件来插入令牌。
- 部署密钥。这些是SSH密钥,可以被添加到我需要的任何项目或任何组中。我需要在CI/CD脚本上设置SSH-Agent,公钥放在版本库设置中,私钥放在CI变量或Vault中,并在要求依赖时使用ssh URL。
请看这里的完整样本。