在单个.travis.yml中为多个存储库定义安全环境变量

时间:2014-04-30 05:32:23

标签: environment-variables travis-ci

我正在开发一个使用Travis CI的项目。我们的一些测试要求在环境变量中定义安全凭证,否则将跳过它们。我们正在使用the encrypt command of the Travis CLI gem为我们的主存储库owner/Project定义secure environment variable。此变量包含在我们的.travis.yml文件中,如下所示:

单一存储库配置
env:
  secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="

travis encrypt已使用owner/Project的私钥加密了这些变量,Travis为该存储库成功运行了凭证测试。

但是我们有另一个存储库contributor/Project,它也用于开发。当Travis在该存储库中运行时,安全环境变量不可用,并且会跳过凭证测试。

我使用travis encrypt加密contributor/Project的一组凭据,并尝试将其添加到.travis.yml,如下所示:

导致额外构建
env:
  - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
  - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="

这导致Travis运行两个不同版本的构建。一个人试图使用每组安全凭证。由于只有一个集合对给定的存储库有效,这将导致测试套件运行两次,一次使用凭证,一次不使用。 You can see an example build here

这种额外的构建是浪费和不必要的。如果测试在没有任何一组安全凭据可用的环境中运行(例如来自分支的pull请求),则测试套件将在没有凭据两次的情况下运行。添加更多凭据会更糟糕;对于每个凭证构建,您都有多个冗余的未分解构建。

如何在单个Travis配置中为多个存储库定义安全环境变量,而不会导致额外的构建发生?

1 个答案:

答案 0 :(得分:10)

当我在env下直接定义了多个安全值时,它们似乎被视为使用了the matrix key, which defines multiple variations of a build。就好像我写的那样:

导致额外构建
env:
  matrix:
    - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
    - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="

相反,我需要在global键下指定安全凭据,以便它们全部应用于每个构建:

工作得很好
env:
  global:
    - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
    - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="

Travis将尝试在单个构建中使用每个安全变量。它只能解码和使用适合于存储库和构建条件的那个(或没有)。 You can see an example build here。通过这种方式,您可以为单个Travis配置添加任意数量存储库的安全环境变量。