私有依赖项 Bitbucket

此处描述的一些功能目前**仅适用于 travis-ci.com 上的私有存储库**。

在测试私有存储库时,您可能需要通过 git 子模块、自定义脚本或像 BundlerComposer 这样的依赖项管理工具提取其他私有存储库作为依赖项。

Git 子模块必须在构建过程的早期克隆,因此必须使用 部署密钥用户密钥 方法。

如果依赖项也位于 Bitbucket 上,则有几种不同的方法可以从 Travis CI VM 中获取存储库。每种方法都有优点和缺点,因此请仔细阅读每种方法并选择最适合您情况的方法。

身份验证 协议 依赖项 URL 格式 提供对…的访问权限 备注
部署密钥 SSH git@bitbucket.com/… 单个存储库 默认情况下用于主存储库
仓库密钥 SSH git@bitbucket.com/… 用户有权访问的所有存储库 **推荐** 用于依赖项
密码 HTTPS https://… 用户有权访问的所有存储库 密码可以加密
API 令牌 HTTPS https://… 用户有权访问的所有存储库 令牌可以加密

您可以为除部署密钥方法之外的所有方法使用 专用 CI 用户帐户。这使您可以将访问权限限制到定义明确的存储库列表,并确保访问权限为只读。

部署密钥 #

Bitbucket 允许您为存储库设置 SSH 密钥。这些部署密钥具有一些很大的优势

  • 它们不绑定到用户帐户,因此不会因从存储库中删除用户而失效。
  • 它们不会访问其他无关的存储库。
  • 同一密钥可用于存储在 Bitbucket 之外的依赖项。

但是,使用部署密钥很复杂,因为 Bitbucket 不允许您重复使用密钥。因此,单个私钥无法访问多个 Bitbucket 存储库。

您可以为存储库中的每个依赖项包含一个不同的私钥,可能 加密它们。以这种方式维护复杂的依赖项图可能很复杂且难以维护。因此,我们建议改为使用 仓库密钥

仓库密钥 #

Travis CI 将为您的存储库添加一个新的访问密钥。它将允许我们读取 travis.yml 文件内容。

密码 #

假设

  • 您正在为其运行构建的存储库称为“myorg/main”,并且依赖于“myorg/lib1”和“myorg/lib2”。
  • 您知道至少具有对所有三个存储库的读取访问权限的用户帐户的凭据。

要使用密码提取依赖项,您必须在 Git HTTPS URL 中使用用户名和密码:https://ci-user:mypassword123@github.com/myorg/lib1.git

或者,您也可以将凭据写入 ~/.netrc 文件

machine bitbucket.com
  login ci-user
  password mypassword123

您还可以加密密码,然后在 .travis.yml 中的 before_install 步骤中将其写入 netrc

$ travis env set CI_USER_PASSWORD mypassword123 --private -r myorg/main
before_install:
- echo -e "machine bitbucket.com\n  login ci-user\n  password $CI_USER_PASSWORD" > ~/.netrc

也可以将凭据注入 URL,例如,在 Gemfile 中,它看起来像这样

source 'https://rubygems.org.cn'
gemspec

if ENV['CI']
  # use HTTPS with password on Travis CI
  git_source :bitbucket do |repo_name|
    repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
    "https://ci-user:#{ENV.fetch("CI_USER_PASSWORD")}@bitbucket.com/#{repo_name}.git"
  end
end

gem 'lib1', bitbucket: "myorg/lib1"
gem 'lib2', bitbucket: "myorg/lib2"

对于私有 git 子模块,请注意 git submodule update --init recursive 命令在更新 ~/.netrc 凭据之前运行。如果您正在将凭据写入 ~/.netrc,请禁用子模块的自动加载,更新凭据并添加一个显式步骤来更新子模块

git:
  submodules: false
before_install:
  - echo -e "machine bitbucket.com\n  login ci-user\n  password $CI_USER_PASSWORD" >~/.netrc
  - git submodule update --init --recursive

API 令牌 #

假设

  • 您正在为其运行构建的存储库称为“myorg/main”,并且依赖于“myorg/lib1”和“myorg/lib2”。
  • 您知道至少具有对所有三个存储库的读取访问权限的用户帐户的凭据。

此方法的工作原理与上面概述的 密码 方法相同,只是您使用 Bitbucket API 令牌而不是用户名/密码对。

在您要使用的用户的 Bitbucket 帐户设置下,导航到

然后生成“个人访问令牌”。

确保令牌具有“repo”范围。

您的 ~/.netrc 应如下所示

machine bitbucket.com
  login the-generated-token

您也可以直接在 URL 中使用它:https://the-generated-token@bitbucket.com/myorg/lib1.git

使用 encrypt 命令将令牌添加到您的 .travis.yml

$ travis env set CI_USER_TOKEN the-generated-token --private -r myorg/main

然后您可以让 Travis CI 在每次构建时写入 ~/.netrc

before_install:
- echo -e "machine bitbucket.com\n  login $CI_USER_TOKEN" > ~/.netrc

也可以将令牌注入 URL,例如,在 Gemfile 中,它看起来像这样

source 'https://rubygems.org.cn'
gemspec

if ENV['CI']
  # use HTTPS with token on Travis CI
  git_source :bitbucket do |repo_name|
    repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
    "https://#{ENV.fetch("CI_USER_TOKEN")}@bitbucket.com/#{repo_name}.git"
  end
end

gem 'lib1', bitbucket: "myorg/lib1"
gem 'lib2', bitbucket: "myorg/lib2"

对于私有 git 子模块,请注意 git submodule update --init --recursive 命令在更新 ~/.netrc 凭据之前运行。如果您正在将凭据写入 ~/.netrc,请禁用子模块的自动加载,更新凭据并添加一个显式步骤来更新子模块

git:
  submodules: false
before_install:
  - echo -e "\n\nmachine bitbucket.com\n  $CI_TOKEN\n" >~/.netrc
  - git submodule update --init --recursive

专用用户帐户 #

如前所述,出于以下原因,创建专用 CI 用户可能很有意义

  • CI 用户将只能访问您希望其访问的存储库。
  • 您可以将访问权限限制为读取访问权限。
  • 在泄露密钥或凭据方面风险较小。
  • CI 用户不会因非技术原因离开组织并意外中断所有构建。

为此,您需要在 Bitbucket 上注册,就像您要注册普通用户一样。注册用户无法自动化,因为这会违反 Bitbucket 服务条款。