[CI/CD]Gitlab用于CI/CD的部署密钥和部署令牌

2,073 阅读3分钟

原文地址:dev.to/gdledsan/ac…

原文作者:dev.to/gdledsan

发布时间:2021年7月19日 ・7月20日更新 ・3分钟阅读

情景。需要从我的CI管道中安装一个只在私有仓库中可用的需求。

有两种方法(我发现)可以做到这一点,而你使用的方法取决于你需要做什么。

  1. 我有一个简单的库,没有依赖关系或只有公共依赖关系
  2. 我有一个依赖于其他私有仓库的依赖关系

为了说明情况,我使用了gitlab、python和poetry。

简单的依赖关系。使用部署令牌

部署令牌允许你在没有用户名和密码或ssh密钥的情况下访问版本库,它是按版本库或组设置的。

如何做。

  1. 像往常一样在你的需求文件中添加依赖项
  2. 在你想访问的私有软件库上设置部署令牌
  3. 将用户和令牌存储在你要访问的私有仓库的CI变量上。
  4. 在CI脚本中,使用CI变量填写部署令牌。

例子

对 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 实例层面也有公共部署密钥,管理员可以给该实例中的任何项目以访问权。

怎样做?

  1. 像往常一样在需求文件中添加依赖项
  2. 生成一个ssh密钥
  3. 生成的公钥部署到你需要的任何 repo 上
  4. 在CI脚本上设置ssh-agent

例子

对 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期间安装它,我有两个选择。

  1. 部署 Token。是按项目或组设置的,我可以在CI变量中添加令牌信息,并操作我的需求文件来插入令牌。
  2. 部署密钥。这些是SSH密钥,可以被添加到我需要的任何项目或任何组中。我需要在CI/CD脚本上设置SSH-Agent,公钥放在版本库设置中,私钥放在CI变量或Vault中,并在要求依赖时使用ssh URL。

请看这里的完整样本。

使用部署令牌

使用部署密钥


www.deepl.com 翻译